From 107097ee289dc4156f12b165018834544268506f Mon Sep 17 00:00:00 2001 From: Ahmet Gedemenli Date: Fri, 15 Jan 2021 18:42:15 +0300 Subject: [PATCH] Fix assert failure when creating statistics --- src/backend/distributed/commands/statistics.c | 7 ++++ .../deparser/deparse_statistics_stmts.c | 9 +++++- .../regress/expected/propagate_statistics.out | 32 ++++++++++++++++++- src/test/regress/sql/propagate_statistics.sql | 9 ++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/backend/distributed/commands/statistics.c b/src/backend/distributed/commands/statistics.c index ac04aa550..c87677794 100644 --- a/src/backend/distributed/commands/statistics.c +++ b/src/backend/distributed/commands/statistics.c @@ -82,6 +82,13 @@ PreprocessCreateStatisticsStmt(Node *node, const char *queryString, QualifyTreeNode((Node *) stmt); + Oid statsOid = get_statistics_object_oid(stmt->defnames, true); + if (statsOid != InvalidOid) + { + /* if stats object already exists, don't create DDLJobs */ + return NIL; + } + char *ddlCommand = DeparseTreeNode((Node *) stmt); DDLJob *ddlJob = palloc0(sizeof(DDLJob)); diff --git a/src/backend/distributed/deparser/deparse_statistics_stmts.c b/src/backend/distributed/deparser/deparse_statistics_stmts.c index 125d4494f..4da69a041 100644 --- a/src/backend/distributed/deparser/deparse_statistics_stmts.c +++ b/src/backend/distributed/deparser/deparse_statistics_stmts.c @@ -236,9 +236,16 @@ static void AppendColumnNames(StringInfo buf, CreateStatsStmt *stmt) { ColumnRef *column = NULL; + foreach_ptr(column, stmt->exprs) { - Assert(IsA(column, ColumnRef)); + if (!IsA(column, ColumnRef) || list_length(column->fields) != 1) + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg( + "only simple column references are allowed in CREATE STATISTICS"))); + } char *columnName = NameListToQuotedString(column->fields); diff --git a/src/test/regress/expected/propagate_statistics.out b/src/test/regress/expected/propagate_statistics.out index 80e501fff..1c798c526 100644 --- a/src/test/regress/expected/propagate_statistics.out +++ b/src/test/regress/expected/propagate_statistics.out @@ -91,6 +91,20 @@ SELECT create_distributed_table('ownertest','a'); (1 row) +-- test invalid column expressions +CREATE TABLE test (x int, y int); +SELECT create_distributed_table('test','x'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +CREATE STATISTICS stats_xy ON (x, y) FROM test; +ERROR: only simple column references are allowed in CREATE STATISTICS +CREATE STATISTICS stats_xy ON x+y FROM test; +ERROR: only simple column references are allowed in CREATE STATISTICS +CREATE STATISTICS stats_xy ON x,y FROM test; +CREATE STATISTICS IF NOT EXISTS stats_xy ON x+y FROM test; \c - - - :worker_1_port SELECT stxname FROM pg_statistic_ext @@ -182,7 +196,23 @@ ORDER BY stxname ASC; st1_new_980090 st1_new_980092 st1_new_980094 -(80 rows) + stats_xy_980161 + stats_xy_980163 + stats_xy_980165 + stats_xy_980167 + stats_xy_980169 + stats_xy_980171 + stats_xy_980173 + stats_xy_980175 + stats_xy_980177 + stats_xy_980179 + stats_xy_980181 + stats_xy_980183 + stats_xy_980185 + stats_xy_980187 + stats_xy_980189 + stats_xy_980191 +(96 rows) SELECT count(DISTINCT stxnamespace) FROM pg_statistic_ext diff --git a/src/test/regress/sql/propagate_statistics.sql b/src/test/regress/sql/propagate_statistics.sql index 8a0372cf7..51d3076f2 100644 --- a/src/test/regress/sql/propagate_statistics.sql +++ b/src/test/regress/sql/propagate_statistics.sql @@ -75,6 +75,15 @@ CREATE STATISTICS sc1.s9 ON a,b FROM ownertest; ALTER STATISTICS sc1.s9 OWNER TO pg_signal_backend; SELECT create_distributed_table('ownertest','a'); +-- test invalid column expressions +CREATE TABLE test (x int, y int); +SELECT create_distributed_table('test','x'); + +CREATE STATISTICS stats_xy ON (x, y) FROM test; +CREATE STATISTICS stats_xy ON x+y FROM test; +CREATE STATISTICS stats_xy ON x,y FROM test; +CREATE STATISTICS IF NOT EXISTS stats_xy ON x+y FROM test; + \c - - - :worker_1_port SELECT stxname FROM pg_statistic_ext