From c5dde4b1154ce140a59a2c2f19be8a41c68e3f81 Mon Sep 17 00:00:00 2001 From: Naisila Puka <37271756+naisila@users.noreply.github.com> Date: Tue, 7 Oct 2025 11:56:20 +0300 Subject: [PATCH] Fix crash on create statistics with non-RangeVar type pt2 (#8227) Fixes #8225 very similar to #8213 Also the error message changed between pg18rc1 and pg18.0 --- .../distributed/deparser/qualify_statistics_stmt.c | 9 ++++++++- src/test/regress/expected/pg18.out | 11 ++++++++--- src/test/regress/expected/pg18_0.out | 8 +++++++- src/test/regress/sql/pg18.sql | 8 +++++++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/backend/distributed/deparser/qualify_statistics_stmt.c b/src/backend/distributed/deparser/qualify_statistics_stmt.c index 7a99e6dfa..7243762dc 100644 --- a/src/backend/distributed/deparser/qualify_statistics_stmt.c +++ b/src/backend/distributed/deparser/qualify_statistics_stmt.c @@ -34,7 +34,14 @@ QualifyCreateStatisticsStmt(Node *node) { CreateStatsStmt *stmt = castNode(CreateStatsStmt, node); - RangeVar *relation = (RangeVar *) linitial(stmt->relations); + Node *relationNode = (Node *) linitial(stmt->relations); + + if (!IsA(relationNode, RangeVar)) + { + return; + } + + RangeVar *relation = (RangeVar *) relationNode; if (relation->schemaname == NULL) { diff --git a/src/test/regress/expected/pg18.out b/src/test/regress/expected/pg18.out index fd42f4070..622540e7e 100644 --- a/src/test/regress/expected/pg18.out +++ b/src/test/regress/expected/pg18.out @@ -6,10 +6,15 @@ SELECT substring(:'server_version', '\d+')::int >= 18 AS server_version_ge_18 \gset -- test invalid statistics -- behavior is same among PG versions, error message differs --- relevant PG18 commit: 3eea4dc2c7 +-- relevant PG18 commit: 3eea4dc2c7, 38883916e CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; -ERROR: cannot create statistics on the specified relation -DETAIL: CREATE STATISTICS only supports tables, foreign tables and materialized views. +ERROR: CREATE STATISTICS only supports relation names in the FROM clause +CREATE FUNCTION tftest(int) returns table(a int, b int) as $$ +SELECT $1, $1+i FROM generate_series(1,5) g(i); +$$ LANGUAGE sql IMMUTABLE STRICT; +CREATE STATISTICS alt_stat2 ON a FROM tftest(1); +ERROR: CREATE STATISTICS only supports relation names in the FROM clause +DROP FUNCTION tftest; \if :server_version_ge_18 \else \q diff --git a/src/test/regress/expected/pg18_0.out b/src/test/regress/expected/pg18_0.out index 8d8c55727..27d3c8d74 100644 --- a/src/test/regress/expected/pg18_0.out +++ b/src/test/regress/expected/pg18_0.out @@ -6,9 +6,15 @@ SELECT substring(:'server_version', '\d+')::int >= 18 AS server_version_ge_18 \gset -- test invalid statistics -- behavior is same among PG versions, error message differs --- relevant PG18 commit: 3eea4dc2c7 +-- relevant PG18 commit: 3eea4dc2c7, 38883916e CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; ERROR: only a single relation is allowed in CREATE STATISTICS +CREATE FUNCTION tftest(int) returns table(a int, b int) as $$ +SELECT $1, $1+i FROM generate_series(1,5) g(i); +$$ LANGUAGE sql IMMUTABLE STRICT; +CREATE STATISTICS alt_stat2 ON a FROM tftest(1); +ERROR: only a single relation is allowed in CREATE STATISTICS +DROP FUNCTION tftest; \if :server_version_ge_18 \else \q diff --git a/src/test/regress/sql/pg18.sql b/src/test/regress/sql/pg18.sql index 94c0ad997..8281ab239 100644 --- a/src/test/regress/sql/pg18.sql +++ b/src/test/regress/sql/pg18.sql @@ -7,9 +7,15 @@ SELECT substring(:'server_version', '\d+')::int >= 18 AS server_version_ge_18 -- test invalid statistics -- behavior is same among PG versions, error message differs --- relevant PG18 commit: 3eea4dc2c7 +-- relevant PG18 commit: 3eea4dc2c7, 38883916e CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; +CREATE FUNCTION tftest(int) returns table(a int, b int) as $$ +SELECT $1, $1+i FROM generate_series(1,5) g(i); +$$ LANGUAGE sql IMMUTABLE STRICT; +CREATE STATISTICS alt_stat2 ON a FROM tftest(1); +DROP FUNCTION tftest; + \if :server_version_ge_18 \else \q