Rework grammar for REINDEX
authorAlvaro Herrera <[email protected]>
Fri, 22 Jul 2022 17:23:39 +0000 (19:23 +0200)
committerAlvaro Herrera <[email protected]>
Fri, 22 Jul 2022 17:23:39 +0000 (19:23 +0200)
The part of grammar have grown needlessly duplicative and more complex
that necessary.  Rewrite.

Reviewed-by: MichaĆ«l Paquier <[email protected]>
Discussion: https://postgr.es/m/20220721174212[email protected]

doc/src/sgml/ref/reindex.sgml
src/backend/parser/gram.y
src/test/regress/expected/create_index.out
src/test/regress/sql/create_index.sql

index fcbda881494a9003d8e1efbba8cc5c06f5bda46c..6750eb6e47f83be25f3ee56816119bdbef4e80a1 100644 (file)
@@ -22,7 +22,8 @@ PostgreSQL documentation
  <refsynopsisdiv>
 <synopsis>
 REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] <replaceable class="parameter">name</replaceable>
-REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] { DATABASE | SYSTEM } [ CONCURRENTLY ] [ <replaceable class="parameter">name</replaceable> ]
+REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] DATABASE [ CONCURRENTLY ] [ <replaceable class="parameter">name</replaceable> ]
+REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] SYSTEM [ <replaceable class="parameter">name</replaceable> ]
 
 <phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
 
index b761a5b5d2d9852ee53c3e44a59cfd6138770cc3..ace4fb5c77881eac228a92d8150d754f3b0e931e 100644 (file)
@@ -336,7 +336,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 
 %type <str>            opt_single_name
 %type <list>       opt_qualified_name
-%type <boolean>    opt_concurrently
+%type <boolean>        opt_concurrently
 %type <dbehavior>  opt_drop_behavior
 
 %type <node>   alter_column_default opclass_item opclass_drop alter_using
@@ -564,7 +564,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <defelt> generic_option_elem alter_generic_option_elem
 %type <list>   generic_option_list alter_generic_option_list
 
-%type <ival>   reindex_target_type reindex_target_multitable reindex_name_optional
+%type <ival>   reindex_target_type
+%type <list>   opt_reindex_option_list
 
 %type <node>   copy_generic_opt_arg copy_generic_opt_arg_list_item
 %type <defelt> copy_generic_opt_elem
@@ -9091,78 +9092,54 @@ DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_d
  *
  *     QUERY:
  *
- *     REINDEX [ (options) ] type [CONCURRENTLY] <name>
+ *     REINDEX [ (options) ] {TABLE | INDEX | SCHEMA} [CONCURRENTLY] <name>
+ *     REINDEX [ (options) ] DATABASE [CONCURRENTLY] [<name>]
+ *     REINDEX [ (options) ] SYSTEM [<name>]
  *****************************************************************************/
 
 ReindexStmt:
-           REINDEX reindex_target_type opt_concurrently qualified_name
+           REINDEX opt_reindex_option_list reindex_target_type opt_concurrently qualified_name
                {
                    ReindexStmt *n = makeNode(ReindexStmt);
 
-                   n->kind = $2;
-                   n->relation = $4;
+                   n->kind = $3;
+                   n->relation = $5;
                    n->name = NULL;
-                   n->params = NIL;
-                   if ($3)
+                   n->params = $2;
+                   if ($4)
                        n->params = lappend(n->params,
-                                           makeDefElem("concurrently", NULL, @3));
+                                           makeDefElem("concurrently", NULL, @4));
                    $$ = (Node *) n;
                }
-           | REINDEX reindex_target_multitable opt_concurrently name
+           | REINDEX opt_reindex_option_list SCHEMA opt_concurrently name
                {
                    ReindexStmt *n = makeNode(ReindexStmt);
 
-                   n->kind = $2;
-                   n->name = $4;
+                   n->kind = REINDEX_OBJECT_SCHEMA;
+                   n->name = $5;
                    n->relation = NULL;
-                   n->params = NIL;
-                   if ($3)
+                   n->params = $2;
+                   if ($4)
                        n->params = lappend(n->params,
-                                           makeDefElem("concurrently", NULL, @3));
+                                           makeDefElem("concurrently", NULL, @4));
                    $$ = (Node *) n;
                }
-           | REINDEX reindex_name_optional
-               {
-                   ReindexStmt *n = makeNode(ReindexStmt);
-                   n->kind = $2;
-                   n->name = NULL;
-                   n->relation = NULL;
-                   n->params = NIL;
-                   $$ = (Node *)n;
-               }
-           | REINDEX '(' utility_option_list ')' reindex_name_optional
+           | REINDEX opt_reindex_option_list DATABASE opt_concurrently opt_single_name
                {
                    ReindexStmt *n = makeNode(ReindexStmt);
-                   n->kind = $5;
+                   n->kind = REINDEX_OBJECT_DATABASE;
                    n->name = NULL;
                    n->relation = NULL;
-                   n->params = $3;
-                   $$ = (Node *)n;
-               }
-           | REINDEX '(' utility_option_list ')' reindex_target_type opt_concurrently qualified_name
-               {
-                   ReindexStmt *n = makeNode(ReindexStmt);
-
-                   n->kind = $5;
-                   n->relation = $7;
-                   n->name = NULL;
-                   n->params = $3;
-                   if ($6)
-                       n->params = lappend(n->params,
-                                           makeDefElem("concurrently", NULL, @6));
+                   n->params = $2;
                    $$ = (Node *) n;
                }
-           | REINDEX '(' utility_option_list ')' reindex_target_multitable opt_concurrently name
+           | REINDEX opt_reindex_option_list SYSTEM_P opt_single_name
                {
                    ReindexStmt *n = makeNode(ReindexStmt);
-
-                   n->kind = $5;
-                   n->name = $7;
+                   n->kind = REINDEX_OBJECT_SYSTEM;
+                   n->name = NULL;
                    n->relation = NULL;
-                   n->params = $3;
-                   if ($6)
-                       n->params = lappend(n->params,
-                                           makeDefElem("concurrently", NULL, @6));
+                   n->params = $2;
                    $$ = (Node *) n;
                }
        ;
@@ -9170,15 +9147,9 @@ reindex_target_type:
            INDEX                   { $$ = REINDEX_OBJECT_INDEX; }
            | TABLE                 { $$ = REINDEX_OBJECT_TABLE; }
        ;
-reindex_target_multitable:
-           SCHEMA                  { $$ = REINDEX_OBJECT_SCHEMA; }
-           | SYSTEM_P              { $$ = REINDEX_OBJECT_SYSTEM; }
-           | DATABASE              { $$ = REINDEX_OBJECT_DATABASE; }
-       ;
-/* For these options the name is optional */
-reindex_name_optional:
-           SYSTEM_P                { $$ = REINDEX_OBJECT_SYSTEM; }
-           | DATABASE              { $$ = REINDEX_OBJECT_DATABASE; }
+opt_reindex_option_list:
+           '(' utility_option_list ')'             { $$ = $2; }
+           | /* EMPTY */                           { $$ = NULL; }
        ;
 
 /*****************************************************************************
index d55aec3a1d0fff1beab00ad961ac6e2d2ac0eadc..a913a1846f98a5bcf5ad8afe7456662bed946971 100644 (file)
@@ -2521,6 +2521,12 @@ ERROR:  cannot reindex system catalogs concurrently
 REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index
 ERROR:  cannot reindex system catalogs concurrently
 REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM
+ERROR:  syntax error at or near "CONCURRENTLY"
+LINE 1: REINDEX SYSTEM CONCURRENTLY postgres;
+                       ^
+REINDEX (CONCURRENTLY) SYSTEM postgres; -- ditto
+ERROR:  cannot reindex system catalogs concurrently
+REINDEX (CONCURRENTLY) SYSTEM;  -- ditto
 ERROR:  cannot reindex system catalogs concurrently
 -- Warns about catalog relations
 REINDEX SCHEMA CONCURRENTLY pg_catalog;
index d8fded3d930ae68e5016b163273e145824e7127a..4b75790e472e7df1d70eb1c9a2054f49ec2f8566 100644 (file)
@@ -1072,6 +1072,8 @@ REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index
 REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table
 REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index
 REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM
+REINDEX (CONCURRENTLY) SYSTEM postgres; -- ditto
+REINDEX (CONCURRENTLY) SYSTEM;  -- ditto
 -- Warns about catalog relations
 REINDEX SCHEMA CONCURRENTLY pg_catalog;