aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2022-07-22 19:23:39 +0200
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2022-07-22 19:23:39 +0200
commit83011ce7d7f42b744a93d2b0819597d0aa94e9cc (patch)
treec12cf093064b723cc538d5fef052342330f4d258
parent0b292bed9211e5c85b7b102690f526c3a6600c2e (diff)
downloadpostgresql-83011ce7d7f42b744a93d2b0819597d0aa94e9cc.tar.gz
postgresql-83011ce7d7f42b744a93d2b0819597d0aa94e9cc.zip
Rework grammar for REINDEX
The part of grammar have grown needlessly duplicative and more complex that necessary. Rewrite. Reviewed-by: Michaƫl Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/20220721174212.cmitjpuimx6ssyyj@alvherre.pgsql
-rw-r--r--doc/src/sgml/ref/reindex.sgml3
-rw-r--r--src/backend/parser/gram.y85
-rw-r--r--src/test/regress/expected/create_index.out6
-rw-r--r--src/test/regress/sql/create_index.sql2
4 files changed, 38 insertions, 58 deletions
diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml
index fcbda881494..6750eb6e47f 100644
--- a/doc/src/sgml/ref/reindex.sgml
+++ b/doc/src/sgml/ref/reindex.sgml
@@ -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>
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index b761a5b5d2d..ace4fb5c778 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -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; }
;
/*****************************************************************************
diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out
index d55aec3a1d0..a913a1846f9 100644
--- a/src/test/regress/expected/create_index.out
+++ b/src/test/regress/expected/create_index.out
@@ -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;
diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql
index d8fded3d930..4b75790e472 100644
--- a/src/test/regress/sql/create_index.sql
+++ b/src/test/regress/sql/create_index.sql
@@ -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;