]> granicus.if.org Git - postgresql/commitdiff
Fix IF NOT EXISTS in CREATE STATISTICS
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 22 Jun 2017 17:17:08 +0000 (13:17 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 22 Jun 2017 17:17:08 +0000 (13:17 -0400)
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

src/backend/parser/gram.y
src/test/regress/expected/stats_ext.out
src/test/regress/sql/stats_ext.sql

index ada95e5bc372008fd50012321bfa6f2cc21b15b3..0f3998ff89351e6ffc6f2e88544e13b2e1e27764 100644 (file)
@@ -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;
                                }
                        ;
index 5fd1244bcb6c2797c962c938000825e757ef2af4..085dce7fd782f1eae7b8a73bd31f0278cebcb4c0 100644 (file)
@@ -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;
index 4c2f514b933aac91ef8ea4218c8c2d46a4a8d37b..d1ff3a8583e884ae597ae31d779bcea63da41336 100644 (file)
@@ -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;