Refactor CLUSTER and REINDEX grammar to use DefElem for option lists
authorMichael Paquier <michael@paquier.xyz>
Thu, 3 Dec 2020 01:13:21 +0000 (10:13 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 3 Dec 2020 01:13:21 +0000 (10:13 +0900)
This changes CLUSTER and REINDEX so as a parenthesized grammar becomes
possible for options, while unifying the grammar parsing rules for
option lists with the existing ones.

This is a follow-up of the work done in 873ea9e for VACUUM, ANALYZE and
EXPLAIN.  This benefits REINDEX for a potential backend-side filtering
for collatable-sensitive indexes and TABLESPACE, while CLUSTER would
benefit from the latter.

Author: Alexey Kondratov, Justin Pryzby
Discussion: https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru

15 files changed:
doc/src/sgml/ref/cluster.sgml
doc/src/sgml/ref/reindex.sgml
src/backend/commands/cluster.c
src/backend/commands/indexcmds.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/parser/gram.y
src/backend/tcop/utility.c
src/bin/psql/tab-complete.c
src/include/catalog/index.h
src/include/commands/cluster.h
src/include/commands/defrem.h
src/include/nodes/parsenodes.h
src/test/regress/expected/create_index.out
src/test/regress/sql/create_index.sql

index b9450e7366ae35355f2bc6a2704370fecd0c8079..5dd21a0189f4cfa144a8a6a7f599dfa45673b961 100644 (file)
@@ -22,7 +22,13 @@ PostgreSQL documentation
  <refsynopsisdiv>
 <synopsis>
 CLUSTER [VERBOSE] <replaceable class="parameter">table_name</replaceable> [ USING <replaceable class="parameter">index_name</replaceable> ]
+CLUSTER ( <replaceable class="parameter">option</replaceable> [, ...] ) <replaceable class="parameter">table_name</replaceable> [ USING <replaceable class="parameter">index_name</replaceable> ]
 CLUSTER [VERBOSE]
+
+<phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
+
+    VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
+
 </synopsis>
  </refsynopsisdiv>
 
@@ -107,6 +113,20 @@ CLUSTER [VERBOSE]
      </para>
     </listitem>
    </varlistentry>
+
+   <varlistentry>
+    <term><replaceable class="parameter">boolean</replaceable></term>
+    <listitem>
+     <para>
+      Specifies whether the selected option should be turned on or off.
+      You can write <literal>TRUE</literal>, <literal>ON</literal>, or
+      <literal>1</literal> to enable the option, and <literal>FALSE</literal>,
+      <literal>OFF</literal>, or <literal>0</literal> to disable it.  The
+      <replaceable class="parameter">boolean</replaceable> value can also
+      be omitted, in which case <literal>TRUE</literal> is assumed.
+     </para>
+    </listitem>
+   </varlistentry>
   </variablelist>
  </refsect1>
 
index f6d425a6910e0bf03d9f47968eae855f2c8c13dc..6e1cf067130c924947e750231ac7a76f70801c3c 100644 (file)
@@ -25,7 +25,8 @@ REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] { IN
 
 <phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
 
-    VERBOSE
+    CONCURRENTLY [ <replaceable class="parameter">boolean</replaceable> ]
+    VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
 </synopsis>
  </refsynopsisdiv>
 
@@ -194,6 +195,21 @@ REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] { IN
      </para>
     </listitem>
    </varlistentry>
+
+   <varlistentry>
+    <term><replaceable class="parameter">boolean</replaceable></term>
+    <listitem>
+     <para>
+      Specifies whether the selected option should be turned on or off.
+      You can write <literal>TRUE</literal>, <literal>ON</literal>, or
+      <literal>1</literal> to enable the option, and <literal>FALSE</literal>,
+      <literal>OFF</literal>, or <literal>0</literal> to disable it.  The
+      <replaceable class="parameter">boolean</replaceable> value can also
+      be omitted, in which case <literal>TRUE</literal> is assumed.
+     </para>
+    </listitem>
+   </varlistentry>
+
   </variablelist>
  </refsect1>
 
index 04d12a7ece69855b12c86c468d17706b08795edf..fd5a6eec862617a4d3b4ce6cfa80accbe2854a89 100644 (file)
@@ -35,6 +35,7 @@
 #include "catalog/pg_am.h"
 #include "catalog/toasting.h"
 #include "commands/cluster.h"
+#include "commands/defrem.h"
 #include "commands/progress.h"
 #include "commands/tablecmds.h"
 #include "commands/vacuum.h"
@@ -99,8 +100,29 @@ static List *get_tables_to_cluster(MemoryContext cluster_context);
  *---------------------------------------------------------------------------
  */
 void
-cluster(ClusterStmt *stmt, bool isTopLevel)
+cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel)
 {
+   ListCell   *lc;
+   int         options = 0;
+   bool        verbose = false;
+
+   /* Parse option list */
+   foreach(lc, stmt->params)
+   {
+       DefElem    *opt = (DefElem *) lfirst(lc);
+
+       if (strcmp(opt->defname, "verbose") == 0)
+           verbose = defGetBoolean(opt);
+       else
+           ereport(ERROR,
+                   (errcode(ERRCODE_SYNTAX_ERROR),
+                    errmsg("unrecognized CLUSTER option \"%s\"",
+                           opt->defname),
+                    parser_errposition(pstate, opt->location)));
+   }
+
+   options = (verbose ? CLUOPT_VERBOSE : 0);
+
    if (stmt->relation != NULL)
    {
        /* This is the single-relation case. */
@@ -170,7 +192,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
        table_close(rel, NoLock);
 
        /* Do the job. */
-       cluster_rel(tableOid, indexOid, stmt->options);
+       cluster_rel(tableOid, indexOid, options);
    }
    else
    {
@@ -219,7 +241,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
            PushActiveSnapshot(GetTransactionSnapshot());
            /* Do the job. */
            cluster_rel(rvtc->tableOid, rvtc->indexOid,
-                       stmt->options | CLUOPT_RECHECK);
+                       options | CLUOPT_RECHECK);
            PopActiveSnapshot();
            CommitTransactionCommand();
        }
index d35deb433aad40d769b58c0229389b8b468acb0c..14d24b3cc40343b4b3255c9ce7d67a06c09588d2 100644 (file)
@@ -2451,6 +2451,42 @@ ChooseIndexColumnNames(List *indexElems)
    return result;
 }
 
+/*
+ * ReindexParseOptions
+ *     Parse list of REINDEX options, returning a bitmask of ReindexOption.
+ */
+int
+ReindexParseOptions(ParseState *pstate, ReindexStmt *stmt)
+{
+   ListCell   *lc;
+   int         options = 0;
+   bool        concurrently = false;
+   bool        verbose = false;
+
+   /* Parse option list */
+   foreach(lc, stmt->params)
+   {
+       DefElem    *opt = (DefElem *) lfirst(lc);
+
+       if (strcmp(opt->defname, "verbose") == 0)
+           verbose = defGetBoolean(opt);
+       else if (strcmp(opt->defname, "concurrently") == 0)
+           concurrently = defGetBoolean(opt);
+       else
+           ereport(ERROR,
+                   (errcode(ERRCODE_SYNTAX_ERROR),
+                    errmsg("unrecognized REINDEX option \"%s\"",
+                           opt->defname),
+                    parser_errposition(pstate, opt->location)));
+   }
+
+   options =
+       (verbose ? REINDEXOPT_VERBOSE : 0) |
+       (concurrently ? REINDEXOPT_CONCURRENTLY : 0);
+
+   return options;
+}
+
 /*
  * ReindexIndex
  *     Recreate a specific index.
index 74882597f923c8cf555033bd841a306e009885df..910906f63968bcbc430bd7d9678c295751779293 100644 (file)
@@ -3349,7 +3349,7 @@ _copyClusterStmt(const ClusterStmt *from)
 
    COPY_NODE_FIELD(relation);
    COPY_STRING_FIELD(indexname);
-   COPY_SCALAR_FIELD(options);
+   COPY_NODE_FIELD(params);
 
    return newnode;
 }
@@ -4443,7 +4443,7 @@ _copyReindexStmt(const ReindexStmt *from)
    COPY_SCALAR_FIELD(kind);
    COPY_NODE_FIELD(relation);
    COPY_STRING_FIELD(name);
-   COPY_SCALAR_FIELD(options);
+   COPY_NODE_FIELD(params);
 
    return newnode;
 }
index e69815d1c52c53da3162da1c0c3d4054001899f5..687609f59eb8dcd03552eb3af6a64148c7a18179 100644 (file)
@@ -1210,7 +1210,7 @@ _equalClusterStmt(const ClusterStmt *a, const ClusterStmt *b)
 {
    COMPARE_NODE_FIELD(relation);
    COMPARE_STRING_FIELD(indexname);
-   COMPARE_SCALAR_FIELD(options);
+   COMPARE_NODE_FIELD(params);
 
    return true;
 }
@@ -2130,7 +2130,7 @@ _equalReindexStmt(const ReindexStmt *a, const ReindexStmt *b)
    COMPARE_SCALAR_FIELD(kind);
    COMPARE_NODE_FIELD(relation);
    COMPARE_STRING_FIELD(name);
-   COMPARE_SCALAR_FIELD(options);
+   COMPARE_NODE_FIELD(params);
 
    return true;
 }
index cbd5fa3cc05d76b889febf66ce85c9ccbf1b16d7..61f023604153d4224578bb034cee567bd253d49e 100644 (file)
@@ -515,7 +515,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <list>   generic_option_list alter_generic_option_list
 
 %type <ival>   reindex_target_type reindex_target_multitable
-%type <ival>   reindex_option_list reindex_option_elem
 
 %type <node>   copy_generic_opt_arg copy_generic_opt_arg_list_item
 %type <defelt> copy_generic_opt_elem
@@ -8217,9 +8216,10 @@ ReindexStmt:
                    n->kind = $2;
                    n->relation = $4;
                    n->name = NULL;
-                   n->options = 0;
+                   n->params = NIL;
                    if ($3)
-                       n->options |= REINDEXOPT_CONCURRENTLY;
+                       n->params = lappend(n->params,
+                               makeDefElem("concurrently", NULL, @3));
                    $$ = (Node *)n;
                }
            | REINDEX reindex_target_multitable opt_concurrently name
@@ -8228,31 +8228,34 @@ ReindexStmt:
                    n->kind = $2;
                    n->name = $4;
                    n->relation = NULL;
-                   n->options = 0;
+                   n->params = NIL;
                    if ($3)
-                       n->options |= REINDEXOPT_CONCURRENTLY;
+                       n->params = lappend(n->params,
+                               makeDefElem("concurrently", NULL, @3));
                    $$ = (Node *)n;
                }
-           | REINDEX '(' reindex_option_list ')' reindex_target_type opt_concurrently qualified_name
+           | 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->options = $3;
+                   n->params = $3;
                    if ($6)
-                       n->options |= REINDEXOPT_CONCURRENTLY;
+                       n->params = lappend(n->params,
+                               makeDefElem("concurrently", NULL, @6));
                    $$ = (Node *)n;
                }
-           | REINDEX '(' reindex_option_list ')' reindex_target_multitable opt_concurrently name
+           | REINDEX '(' utility_option_list ')' reindex_target_multitable opt_concurrently name
                {
                    ReindexStmt *n = makeNode(ReindexStmt);
                    n->kind = $5;
                    n->name = $7;
                    n->relation = NULL;
-                   n->options = $3;
+                   n->params = $3;
                    if ($6)
-                       n->options |= REINDEXOPT_CONCURRENTLY;
+                       n->params = lappend(n->params,
+                               makeDefElem("concurrently", NULL, @6));
                    $$ = (Node *)n;
                }
        ;
@@ -8265,13 +8268,6 @@ reindex_target_multitable:
            | SYSTEM_P              { $$ = REINDEX_OBJECT_SYSTEM; }
            | DATABASE              { $$ = REINDEX_OBJECT_DATABASE; }
        ;
-reindex_option_list:
-           reindex_option_elem                             { $$ = $1; }
-           | reindex_option_list ',' reindex_option_elem   { $$ = $1 | $3; }
-       ;
-reindex_option_elem:
-           VERBOSE { $$ = REINDEXOPT_VERBOSE; }
-       ;
 
 /*****************************************************************************
  *
@@ -10407,6 +10403,7 @@ CreateConversionStmt:
  *
  *     QUERY:
  *             CLUSTER [VERBOSE] <qualified_name> [ USING <index_name> ]
+ *             CLUSTER [ (options) ] <qualified_name> [ USING <index_name> ]
  *             CLUSTER [VERBOSE]
  *             CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
  *
@@ -10418,9 +10415,18 @@ ClusterStmt:
                    ClusterStmt *n = makeNode(ClusterStmt);
                    n->relation = $3;
                    n->indexname = $4;
-                   n->options = 0;
+                   n->params = NIL;
                    if ($2)
-                       n->options |= CLUOPT_VERBOSE;
+                       n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
+                   $$ = (Node*)n;
+               }
+
+           | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
+               {
+                   ClusterStmt *n = makeNode(ClusterStmt);
+                   n->relation = $5;
+                   n->indexname = $6;
+                   n->params = $3;
                    $$ = (Node*)n;
                }
            | CLUSTER opt_verbose
@@ -10428,9 +10434,9 @@ ClusterStmt:
                    ClusterStmt *n = makeNode(ClusterStmt);
                    n->relation = NULL;
                    n->indexname = NULL;
-                   n->options = 0;
+                   n->params = NIL;
                    if ($2)
-                       n->options |= CLUOPT_VERBOSE;
+                       n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
                    $$ = (Node*)n;
                }
            /* kept for pre-8.3 compatibility */
@@ -10439,9 +10445,9 @@ ClusterStmt:
                    ClusterStmt *n = makeNode(ClusterStmt);
                    n->relation = $5;
                    n->indexname = $3;
-                   n->options = 0;
+                   n->params = NIL;
                    if ($2)
-                       n->options |= CLUOPT_VERBOSE;
+                       n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
                    $$ = (Node*)n;
                }
        ;
index 81ac9b1cb2dd78a6094c3ab439340688e372594a..a42ead7d698e746c66089e205e80c8339ab0b7e1 100644 (file)
@@ -22,6 +22,7 @@
 #include "access/xact.h"
 #include "access/xlog.h"
 #include "catalog/catalog.h"
+#include "catalog/index.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_inherits.h"
 #include "catalog/toasting.h"
@@ -818,7 +819,7 @@ standard_ProcessUtility(PlannedStmt *pstmt,
            break;
 
        case T_ClusterStmt:
-           cluster((ClusterStmt *) parsetree, isTopLevel);
+           cluster(pstate, (ClusterStmt *) parsetree, isTopLevel);
            break;
 
        case T_VacuumStmt:
@@ -918,20 +919,20 @@ standard_ProcessUtility(PlannedStmt *pstmt,
        case T_ReindexStmt:
            {
                ReindexStmt *stmt = (ReindexStmt *) parsetree;
+               int         options;
 
-               if ((stmt->options & REINDEXOPT_CONCURRENTLY) != 0)
+               options = ReindexParseOptions(pstate, stmt);
+               if ((options & REINDEXOPT_CONCURRENTLY) != 0)
                    PreventInTransactionBlock(isTopLevel,
                                              "REINDEX CONCURRENTLY");
 
                switch (stmt->kind)
                {
                    case REINDEX_OBJECT_INDEX:
-                       ReindexIndex(stmt->relation, stmt->options,
-                                    isTopLevel);
+                       ReindexIndex(stmt->relation, options, isTopLevel);
                        break;
                    case REINDEX_OBJECT_TABLE:
-                       ReindexTable(stmt->relation, stmt->options,
-                                    isTopLevel);
+                       ReindexTable(stmt->relation, options, isTopLevel);
                        break;
                    case REINDEX_OBJECT_SCHEMA:
                    case REINDEX_OBJECT_SYSTEM:
@@ -947,7 +948,7 @@ standard_ProcessUtility(PlannedStmt *pstmt,
                                                  (stmt->kind == REINDEX_OBJECT_SCHEMA) ? "REINDEX SCHEMA" :
                                                  (stmt->kind == REINDEX_OBJECT_SYSTEM) ? "REINDEX SYSTEM" :
                                                  "REINDEX DATABASE");
-                       ReindexMultipleTables(stmt->name, stmt->kind, stmt->options);
+                       ReindexMultipleTables(stmt->name, stmt->kind, options);
                        break;
                    default:
                        elog(ERROR, "unrecognized object type: %d",
index 8afc780acc35b38dd371bf91e813548ed71aa4f8..3a43c09bf6807202106a6664d439cf2b1172b162 100644 (file)
@@ -2287,21 +2287,33 @@ psql_completion(const char *text, int start, int end)
 /* CLUSTER */
    else if (Matches("CLUSTER"))
        COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables, "UNION SELECT 'VERBOSE'");
-   else if (Matches("CLUSTER", "VERBOSE"))
+   else if (Matches("CLUSTER", "VERBOSE") ||
+            Matches("CLUSTER", "(*)"))
        COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables, NULL);
    /* If we have CLUSTER <sth>, then add "USING" */
-   else if (Matches("CLUSTER", MatchAnyExcept("VERBOSE|ON")))
+   else if (Matches("CLUSTER", MatchAnyExcept("VERBOSE|ON|(|(*)")))
        COMPLETE_WITH("USING");
    /* If we have CLUSTER VERBOSE <sth>, then add "USING" */
-   else if (Matches("CLUSTER", "VERBOSE", MatchAny))
+   else if (Matches("CLUSTER", "VERBOSE|(*)", MatchAny))
        COMPLETE_WITH("USING");
    /* If we have CLUSTER <sth> USING, then add the index as well */
    else if (Matches("CLUSTER", MatchAny, "USING") ||
-            Matches("CLUSTER", "VERBOSE", MatchAny, "USING"))
+            Matches("CLUSTER", "VERBOSE|(*)", MatchAny, "USING"))
    {
        completion_info_charp = prev2_wd;
        COMPLETE_WITH_QUERY(Query_for_index_of_table);
    }
+   else if (HeadMatches("CLUSTER", "(*") &&
+            !HeadMatches("CLUSTER", "(*)"))
+   {
+       /*
+        * This fires if we're in an unfinished parenthesized option list.
+        * get_previous_words treats a completed parenthesized option list as
+        * one word, so the above test is correct.
+        */
+       if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+           COMPLETE_WITH("VERBOSE");
+   }
 
 /* COMMENT */
    else if (Matches("COMMENT"))
@@ -3565,7 +3577,7 @@ psql_completion(const char *text, int start, int end)
         * one word, so the above test is correct.
         */
        if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
-           COMPLETE_WITH("VERBOSE");
+           COMPLETE_WITH("CONCURRENTLY", "VERBOSE");
    }
 
 /* SECURITY LABEL */
index f4559b09d73556cbabcd63e5b6dc8626903bfb81..c0416280499d42b05edcb003da4f3ca3a3bd2072 100644 (file)
@@ -29,6 +29,15 @@ typedef enum
    INDEX_DROP_SET_DEAD
 } IndexStateFlagsAction;
 
+/* options for REINDEX */
+typedef enum ReindexOption
+{
+   REINDEXOPT_VERBOSE = 1 << 0,    /* print progress info */
+   REINDEXOPT_REPORT_PROGRESS = 1 << 1,    /* report pgstat progress */
+   REINDEXOPT_MISSING_OK = 1 << 2, /* skip missing relations */
+   REINDEXOPT_CONCURRENTLY = 1 << 3    /* concurrent mode */
+} ReindexOption;
+
 /* state info for validate_index bulkdelete callback */
 typedef struct ValidateIndexState
 {
index e05884781b94d972129682070af3c59317daa1eb..7cfb37c9b2be587d2a0b3fc96866d35ff49d6ee6 100644 (file)
 #define CLUSTER_H
 
 #include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
 #include "storage/lock.h"
 #include "utils/relcache.h"
 
 
-extern void cluster(ClusterStmt *stmt, bool isTopLevel);
+/* options for CLUSTER */
+typedef enum ClusterOption
+{
+   CLUOPT_RECHECK = 1 << 0,    /* recheck relation state */
+   CLUOPT_VERBOSE = 1 << 1     /* print progress info */
+} ClusterOption;
+
+extern void cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel);
 extern void cluster_rel(Oid tableOid, Oid indexOid, int options);
 extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid,
                                       bool recheck, LOCKMODE lockmode);
index 7a079ef07f064c76c38ceee9f59f798afb391d1d..1133ae1143716d7033b2e95c0a8dd3c996732c28 100644 (file)
@@ -34,6 +34,7 @@ extern ObjectAddress DefineIndex(Oid relationId,
                                 bool check_not_in_use,
                                 bool skip_build,
                                 bool quiet);
+extern int ReindexParseOptions(ParseState *pstate, ReindexStmt *stmt);
 extern void ReindexIndex(RangeVar *indexRelation, int options, bool isTopLevel);
 extern Oid ReindexTable(RangeVar *relation, int options, bool isTopLevel);
 extern void ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind,
index 92df76c2d355134c31a66ec380e63260e8a77810..ec14fc2036f16c21899ff24eb49ab43a83d20cb2 100644 (file)
@@ -3197,18 +3197,12 @@ typedef struct AlterSystemStmt
  *     Cluster Statement (support pbrown's cluster index implementation)
  * ----------------------
  */
-typedef enum ClusterOption
-{
-   CLUOPT_RECHECK = 1 << 0,    /* recheck relation state */
-   CLUOPT_VERBOSE = 1 << 1     /* print progress info */
-} ClusterOption;
-
 typedef struct ClusterStmt
 {
    NodeTag     type;
    RangeVar   *relation;       /* relation being indexed, or NULL if all */
    char       *indexname;      /* original index defined */
-   int         options;        /* OR of ClusterOption flags */
+   List       *params;         /* list of DefElem nodes */
 } ClusterStmt;
 
 /* ----------------------
@@ -3346,13 +3340,6 @@ typedef struct ConstraintsSetStmt
  *     REINDEX Statement
  * ----------------------
  */
-
-/* Reindex options */
-#define REINDEXOPT_VERBOSE (1 << 0) /* print progress info */
-#define REINDEXOPT_REPORT_PROGRESS (1 << 1) /* report pgstat progress */
-#define REINDEXOPT_MISSING_OK (1 << 2) /* skip missing relations */
-#define REINDEXOPT_CONCURRENTLY (1 << 3)   /* concurrent mode */
-
 typedef enum ReindexObjectType
 {
    REINDEX_OBJECT_INDEX,       /* index */
@@ -3369,7 +3356,7 @@ typedef struct ReindexStmt
                                 * etc. */
    RangeVar   *relation;       /* Table or index to reindex */
    const char *name;           /* name of database to reindex */
-   int         options;        /* Reindex options flags */
+   List       *params;         /* list of DefElem nodes */
 } ReindexStmt;
 
 /* ----------------------
index 18bb92b810af49fcd0dc62a7cf526231400247da..fc6afab58ab307148af5d3ae9d9834917adf0c2f 100644 (file)
@@ -2024,7 +2024,7 @@ CREATE TABLE concur_reindex_tab (c1 int);
 -- REINDEX
 REINDEX TABLE concur_reindex_tab; -- notice
 NOTICE:  table "concur_reindex_tab" has no indexes to reindex
-REINDEX TABLE CONCURRENTLY concur_reindex_tab; -- notice
+REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice
 NOTICE:  table "concur_reindex_tab" has no indexes that can be reindexed concurrently
 ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index
 -- Normal index with integer column
index 55326eb47b248dc214e92947b74aae0bf3f187cd..824cb9f9e82c8a8cc9d68e2abd8d9bd68a89f6b5 100644 (file)
@@ -796,7 +796,7 @@ DROP TABLE reindex_verbose;
 CREATE TABLE concur_reindex_tab (c1 int);
 -- REINDEX
 REINDEX TABLE concur_reindex_tab; -- notice
-REINDEX TABLE CONCURRENTLY concur_reindex_tab; -- notice
+REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice
 ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index
 -- Normal index with integer column
 CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1);