diff --git a/src/backend/distributed/commands/statistics.c b/src/backend/distributed/commands/statistics.c index b43f6335ef4..7a77b6b3dd8 100644 --- a/src/backend/distributed/commands/statistics.c +++ b/src/backend/distributed/commands/statistics.c @@ -69,7 +69,15 @@ PreprocessCreateStatisticsStmt(Node *node, const char *queryString, { CreateStatsStmt *stmt = castNode(CreateStatsStmt, node); - RangeVar *relation = (RangeVar *) linitial(stmt->relations); + Node *relationNode = (Node *) linitial(stmt->relations); + + if (!IsA(relationNode, RangeVar)) + { + return NIL; + } + + RangeVar *relation = (RangeVar *) relationNode; + Oid relationId = RangeVarGetRelid(relation, ShareUpdateExclusiveLock, false); if (!IsCitusTable(relationId) || !ShouldPropagate()) diff --git a/src/backend/distributed/deparser/qualify_statistics_stmt.c b/src/backend/distributed/deparser/qualify_statistics_stmt.c index 7a99e6dfad3..7243762dc79 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/pg16.out b/src/test/regress/expected/pg16.out index d7c39a9fddc..72d7b7312b9 100644 --- a/src/test/regress/expected/pg16.out +++ b/src/test/regress/expected/pg16.out @@ -4,6 +4,17 @@ SHOW server_version \gset SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16 \gset +-- test invalid statistics +-- behavior is same among PG versions, error message differs +-- relevant PG16 commits: d84a6c3dad1 and f30c04682cd +CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; +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_16 \else \q diff --git a/src/test/regress/expected/pg16_0.out b/src/test/regress/expected/pg16_0.out index 730c916cadc..f8d8d68800d 100644 --- a/src/test/regress/expected/pg16_0.out +++ b/src/test/regress/expected/pg16_0.out @@ -4,6 +4,17 @@ SHOW server_version \gset SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16 \gset +-- test invalid statistics +-- behavior is same among PG versions, error message differs +-- relevant PG16 commits: d84a6c3dad1 and f30c04682cd +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_16 \else \q diff --git a/src/test/regress/expected/pg17.out b/src/test/regress/expected/pg17.out index aa27ae85a88..24b449578cf 100644 --- a/src/test/regress/expected/pg17.out +++ b/src/test/regress/expected/pg17.out @@ -4,6 +4,19 @@ SHOW server_version \gset SELECT substring(:'server_version', '\d+')::int >= 17 AS server_version_ge_17 \gset + +-- test invalid statistics +-- behavior is same among PG versions, error message differs +-- relevant PG16 commits: d84a6c3dad1 and f30c04682cd +CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; +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; + -- PG17 has the capabilty to pull up a correlated ANY subquery to a join if -- the subquery only refers to its immediate parent query. Previously, the -- subquery needed to be implemented as a SubPlan node, typically as a diff --git a/src/test/regress/expected/pg17_0.out b/src/test/regress/expected/pg17_0.out index 6f65f60993b..0dabb1e2c0a 100644 --- a/src/test/regress/expected/pg17_0.out +++ b/src/test/regress/expected/pg17_0.out @@ -4,6 +4,19 @@ SHOW server_version \gset SELECT substring(:'server_version', '\d+')::int >= 17 AS server_version_ge_17 \gset + +-- test invalid statistics +-- behavior is same among PG versions, error message differs +-- relevant PG16 commits: d84a6c3dad1 and f30c04682cd +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; + -- PG17 has the capabilty to pull up a correlated ANY subquery to a join if -- the subquery only refers to its immediate parent query. Previously, the -- subquery needed to be implemented as a SubPlan node, typically as a diff --git a/src/test/regress/sql/pg16.sql b/src/test/regress/sql/pg16.sql index ec4eb3fc736..c9137c8f315 100644 --- a/src/test/regress/sql/pg16.sql +++ b/src/test/regress/sql/pg16.sql @@ -4,6 +4,18 @@ SHOW server_version \gset SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16 \gset + +-- test invalid statistics +-- behavior is same among PG versions, error message differs +-- relevant PG16 commits: d84a6c3dad1 and f30c04682cd +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_16 \else \q diff --git a/src/test/regress/sql/pg17.sql b/src/test/regress/sql/pg17.sql index 60ea6d9e7e1..4f0a8459129 100644 --- a/src/test/regress/sql/pg17.sql +++ b/src/test/regress/sql/pg17.sql @@ -5,6 +5,17 @@ SHOW server_version \gset SELECT substring(:'server_version', '\d+')::int >= 17 AS server_version_ge_17 \gset +-- test invalid statistics +-- behavior is same among PG versions, error message differs +-- relevant PG16 commits: d84a6c3dad1 and f30c04682cd +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; + -- PG17 has the capabilty to pull up a correlated ANY subquery to a join if -- the subquery only refers to its immediate parent query. Previously, the -- subquery needed to be implemented as a SubPlan node, typically as a