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 REINDEX [ ( option [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] name -REINDEX [ ( option [, ...] ) ] { DATABASE | SYSTEM } [ CONCURRENTLY ] [ name ] +REINDEX [ ( option [, ...] ) ] DATABASE [ CONCURRENTLY ] [ name ] +REINDEX [ ( option [, ...] ) ] SYSTEM [ name ] where option can be one of: 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 opt_single_name %type opt_qualified_name -%type opt_concurrently +%type opt_concurrently %type opt_drop_behavior %type alter_column_default opclass_item opclass_drop alter_using @@ -564,7 +564,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type generic_option_elem alter_generic_option_elem %type generic_option_list alter_generic_option_list -%type reindex_target_type reindex_target_multitable reindex_name_optional +%type reindex_target_type +%type opt_reindex_option_list %type copy_generic_opt_arg copy_generic_opt_arg_list_item %type 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] + * REINDEX [ (options) ] {TABLE | INDEX | SCHEMA} [CONCURRENTLY] + * REINDEX [ (options) ] DATABASE [CONCURRENTLY] [] + * REINDEX [ (options) ] SYSTEM [] *****************************************************************************/ 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 + | REINDEX opt_reindex_option_list DATABASE opt_concurrently opt_single_name { ReindexStmt *n = makeNode(ReindexStmt); - n->kind = $2; + n->kind = REINDEX_OBJECT_DATABASE; n->name = NULL; n->relation = NULL; - n->params = NIL; - $$ = (Node *)n; - } - | REINDEX '(' utility_option_list ')' reindex_name_optional - { - ReindexStmt *n = makeNode(ReindexStmt); - n->kind = $5; - 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;