Simon just pointed out that having the WITH clause appear in the middle
of the CREATE STATISTICS command looks odd; apparently somebody else
already complained on list about the same.  Other commands put the WITH
clause at the end, so perhaps we should do likewise in the new command.

Here's a patch to implement that.  I verified that if I change
qualified_name to qualified_name_list, bison does not complain about
conflicts, so this new syntax should support extension to multiple
relations without a problem.

Discuss.

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
commit 237909c440054e97c09dc6e7711a4ca92892465b
Author:     Alvaro Herrera <alvhe...@alvh.no-ip.org>
AuthorDate: Thu Apr 20 18:19:06 2017 -0300
CommitDate: Thu Apr 20 18:19:06 2017 -0300

    Put WITH clause at the end

diff --git a/doc/src/sgml/ref/create_statistics.sgml 
b/doc/src/sgml/ref/create_statistics.sgml
index edbcf5840b..910d6be8ab 100644
--- a/doc/src/sgml/ref/create_statistics.sgml
+++ b/doc/src/sgml/ref/create_statistics.sgml
@@ -22,9 +22,9 @@ PostgreSQL documentation
  <refsynopsisdiv>
 <synopsis>
 CREATE STATISTICS [ IF NOT EXISTS ] <replaceable 
class="PARAMETER">statistics_name</replaceable>
-    WITH ( <replaceable class="PARAMETER">option</replaceable> [= <replaceable 
class="PARAMETER">value</replaceable>] [, ... ] )
     ON ( <replaceable class="PARAMETER">column_name</replaceable>, 
<replaceable class="PARAMETER">column_name</replaceable> [, ...])
     FROM <replaceable class="PARAMETER">table_name</replaceable>
+    WITH ( <replaceable class="PARAMETER">option</replaceable> [= <replaceable 
class="PARAMETER">value</replaceable>] [, ... ] )
 </synopsis>
 
  </refsynopsisdiv>
@@ -158,7 +158,7 @@ CREATE TABLE t1 (
 INSERT INTO t1 SELECT i/100, i/500
                  FROM generate_series(1,1000000) s(i);
 
-CREATE STATISTICS s1 WITH (dependencies) ON (a, b) FROM t1;
+CREATE STATISTICS s1 ON (a, b) FROM t1 WITH (dependencies);
 
 ANALYZE t1;
 
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 89d2836c49..92e9aa8b28 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -3847,28 +3847,28 @@ ExistingIndex:   USING INDEX index_name                 
        { $$ = $3; }
 /*****************************************************************************
  *
  *             QUERY :
- *                             CREATE STATISTICS stats_name WITH (options) ON 
(columns) FROM relname
+ *                             CREATE STATISTICS stats_name ON (columns) FROM 
relname WITH (options)
  *
  *****************************************************************************/
 
 
-CreateStatsStmt:       CREATE STATISTICS any_name opt_reloptions ON '(' 
columnList ')' FROM qualified_name
+CreateStatsStmt:       CREATE STATISTICS any_name ON '(' columnList ')' FROM 
qualified_name opt_reloptions
                                                {
                                                        CreateStatsStmt *n = 
makeNode(CreateStatsStmt);
                                                        n->defnames = $3;
-                                                       n->relation = $10;
-                                                       n->keys = $7;
-                                                       n->options = $4;
+                                                       n->relation = $9;
+                                                       n->keys = $6;
+                                                       n->options = $10;
                                                        n->if_not_exists = 
false;
                                                        $$ = (Node *)n;
                                                }
-                                       | CREATE STATISTICS IF_P NOT EXISTS 
any_name opt_reloptions ON '(' columnList ')' FROM qualified_name
+                                       | CREATE STATISTICS IF_P NOT EXISTS 
any_name ON '(' columnList ')' FROM qualified_name opt_reloptions
                                                {
                                                        CreateStatsStmt *n = 
makeNode(CreateStatsStmt);
                                                        n->defnames = $6;
-                                                       n->relation = $13;
-                                                       n->keys = $10;
-                                                       n->options = $7;
+                                                       n->relation = $12;
+                                                       n->keys = $9;
+                                                       n->options = $13;
                                                        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 0d6f65e604..7dc6011e6b 100644
--- a/src/test/regress/expected/stats_ext.out
+++ b/src/test/regress/expected/stats_ext.out
@@ -389,7 +389,7 @@ EXPLAIN (COSTS OFF)
 (2 rows)
 
 -- create statistics
-CREATE STATISTICS func_deps_stat WITH (dependencies) ON (a, b, c) FROM 
functional_dependencies;
+CREATE STATISTICS func_deps_stat ON (a, b, c) FROM functional_dependencies 
WITH (dependencies);
 ANALYZE functional_dependencies;
 EXPLAIN (COSTS OFF)
  SELECT * FROM functional_dependencies WHERE a = 1 AND b = '1';
@@ -432,7 +432,7 @@ EXPLAIN (COSTS OFF)
 (2 rows)
 
 -- create statistics
-CREATE STATISTICS func_deps_stat WITH (dependencies) ON (a, b, c) FROM 
functional_dependencies;
+CREATE STATISTICS func_deps_stat ON (a, b, c) FROM functional_dependencies 
WITH (dependencies);
 ANALYZE functional_dependencies;
 EXPLAIN (COSTS OFF)
  SELECT * FROM functional_dependencies WHERE a = 1 AND b = '1';
diff --git a/src/test/regress/sql/stats_ext.sql 
b/src/test/regress/sql/stats_ext.sql
index 72c7659c4b..0e21519dbb 100644
--- a/src/test/regress/sql/stats_ext.sql
+++ b/src/test/regress/sql/stats_ext.sql
@@ -233,7 +233,7 @@ EXPLAIN (COSTS OFF)
  SELECT * FROM functional_dependencies WHERE a = 1 AND b = '1' AND c = 1;
 
 -- create statistics
-CREATE STATISTICS func_deps_stat WITH (dependencies) ON (a, b, c) FROM 
functional_dependencies;
+CREATE STATISTICS func_deps_stat ON (a, b, c) FROM functional_dependencies 
WITH (dependencies);
 
 ANALYZE functional_dependencies;
 
@@ -259,7 +259,7 @@ EXPLAIN (COSTS OFF)
  SELECT * FROM functional_dependencies WHERE a = 1 AND b = '1' AND c = 1;
 
 -- create statistics
-CREATE STATISTICS func_deps_stat WITH (dependencies) ON (a, b, c) FROM 
functional_dependencies;
+CREATE STATISTICS func_deps_stat ON (a, b, c) FROM functional_dependencies 
WITH (dependencies);
 
 ANALYZE functional_dependencies;
 
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to