diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2017-06-22 13:17:08 -0400 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2017-06-22 13:17:08 -0400 |
commit | 5dfd564b1001f20c9def6ae938a92f39ddbd9984 (patch) | |
tree | beb94359ff42b479a82f11cea42413cad446df1e /src | |
parent | 2c77903b2bfba01f159138ba34b95d4b470395a8 (diff) | |
download | postgresql-5dfd564b1001f20c9def6ae938a92f39ddbd9984.tar.gz postgresql-5dfd564b1001f20c9def6ae938a92f39ddbd9984.zip |
Fix IF NOT EXISTS in CREATE STATISTICS
I misplaced the IF NOT EXISTS clause in commit 7b504eb282, before the
word STATISTICS. Put it where it belongs.
Patch written independently by Amit Langote and myself. I adopted his
submitted test case with a slight edit also.
Reported-by: Bruno Wolff III
Discussion: https://postgr.es/m/20170621004237.GB8337@wolff.to
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/parser/gram.y | 25 | ||||
-rw-r--r-- | src/test/regress/expected/stats_ext.out | 6 | ||||
-rw-r--r-- | src/test/regress/sql/stats_ext.sql | 5 |
3 files changed, 25 insertions, 11 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index ada95e5bc37..0f3998ff893 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -3834,7 +3834,7 @@ ExistingIndex: USING INDEX index_name { $$ = $3; } /***************************************************************************** * * QUERY : - * CREATE STATISTICS stats_name [(stat types)] + * CREATE STATISTICS [IF NOT EXISTS] stats_name [(stat types)] * ON expression-list FROM from_list * * Note: the expectation here is that the clauses after ON are a subset of @@ -3846,15 +3846,26 @@ ExistingIndex: USING INDEX index_name { $$ = $3; } *****************************************************************************/ CreateStatsStmt: - CREATE opt_if_not_exists STATISTICS any_name + CREATE STATISTICS any_name opt_name_list ON expr_list FROM from_list { CreateStatsStmt *n = makeNode(CreateStatsStmt); - n->defnames = $4; - n->stat_types = $5; - n->exprs = $7; - n->relations = $9; - n->if_not_exists = $2; + n->defnames = $3; + n->stat_types = $4; + n->exprs = $6; + n->relations = $8; + n->if_not_exists = false; + $$ = (Node *)n; + } + | CREATE STATISTICS IF_P NOT EXISTS any_name + opt_name_list ON expr_list FROM from_list + { + CreateStatsStmt *n = makeNode(CreateStatsStmt); + n->defnames = $6; + n->stat_types = $7; + n->exprs = $9; + n->relations = $11; + n->if_not_exists = true; $$ = (Node *)n; } ; diff --git a/src/test/regress/expected/stats_ext.out b/src/test/regress/expected/stats_ext.out index 5fd1244bcb6..085dce7fd78 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -30,9 +30,11 @@ CREATE STATISTICS tst ON (relpages, reltuples) FROM pg_class; ERROR: only simple column references are allowed in CREATE STATISTICS CREATE STATISTICS tst (unrecognized) ON relname, relnatts FROM pg_class; ERROR: unrecognized statistic type "unrecognized" --- Ensure stats are dropped sanely +-- Ensure stats are dropped sanely, and test IF NOT EXISTS while at it CREATE TABLE ab1 (a INTEGER, b INTEGER, c INTEGER); -CREATE STATISTICS ab1_a_b_stats ON a, b FROM ab1; +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +NOTICE: statistics object "ab1_a_b_stats" already exists, skipping DROP STATISTICS ab1_a_b_stats; CREATE SCHEMA regress_schema_2; CREATE STATISTICS regress_schema_2.ab1_a_b_stats ON a, b FROM ab1; diff --git a/src/test/regress/sql/stats_ext.sql b/src/test/regress/sql/stats_ext.sql index 4c2f514b933..d1ff3a8583e 100644 --- a/src/test/regress/sql/stats_ext.sql +++ b/src/test/regress/sql/stats_ext.sql @@ -18,9 +18,10 @@ CREATE STATISTICS tst ON relnatts + relpages FROM pg_class; CREATE STATISTICS tst ON (relpages, reltuples) FROM pg_class; CREATE STATISTICS tst (unrecognized) ON relname, relnatts FROM pg_class; --- Ensure stats are dropped sanely +-- Ensure stats are dropped sanely, and test IF NOT EXISTS while at it CREATE TABLE ab1 (a INTEGER, b INTEGER, c INTEGER); -CREATE STATISTICS ab1_a_b_stats ON a, b FROM ab1; +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; +CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1; DROP STATISTICS ab1_a_b_stats; CREATE SCHEMA regress_schema_2; |