Hello, On 2025-Jul-23, Andres Freund wrote:
> On 2025-07-23 19:59:52 +0200, Álvaro Herrera wrote: > > ... so using the same set of productions, I can rewrite the current > > CLUSTER rule in this way and it won't be a problem for the REPACK > > changes. > > But it comes at the price of henceforth duplicating all ClusterStmt, once for > VERBOSE and once without. That's not exactly a free lunch... Yeah, thanks for taking a look. That duplication is just me being dumb. Here's a version without that. The only thing that needed to change was changing "CLUSTER opt_verbose" to "CLUSTER VERBOSE" so that the unadorned CLUSTER is handled by "CLUSTER opt_utility_option_list" instead. -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/ "How amazing is that? I call it a night and come back to find that a bug has been identified and patched while I sleep." (Robert Davidson) http://archives.postgresql.org/pgsql-sql/2006-03/msg00378.php
>From f65f4a9a8584e3a6fd059d2ef42559b0d3508ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Herrera?= <alvhe...@kurilemu.de> Date: Wed, 23 Jul 2025 18:13:49 +0200 Subject: [PATCH v3] Refactor grammar to create opt_utility_option_list This changes the grammar for REINDEX, CHECKPOINT and CLUSTER; they still accept the same options as before, but the grammar is written differently for convenience of future development. --- src/backend/parser/gram.y | 43 ++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 73345bb3c70..fc9a8d64c08 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -316,10 +316,11 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type <str> opt_single_name %type <list> opt_qualified_name %type <boolean> opt_concurrently %type <dbehavior> opt_drop_behavior +%type <list> opt_utility_option_list %type <node> alter_column_default opclass_item opclass_drop alter_using %type <ival> add_drop opt_asc_desc opt_nulls_order %type <node> alter_table_cmd alter_type_cmd opt_collate_clause @@ -554,11 +555,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type <node> generic_option_arg %type <defelt> generic_option_elem alter_generic_option_elem %type <list> generic_option_list alter_generic_option_list %type <ival> reindex_target_relation reindex_target_all -%type <list> opt_reindex_option_list %type <node> copy_generic_opt_arg copy_generic_opt_arg_list_item %type <defelt> copy_generic_opt_elem %type <list> copy_generic_opt_list copy_generic_opt_arg_list %type <list> copy_options @@ -1139,10 +1139,15 @@ opt_drop_behavior: CASCADE { $$ = DROP_CASCADE; } | RESTRICT { $$ = DROP_RESTRICT; } | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ } ; +opt_utility_option_list: + '(' utility_option_list ')' { $$ = $2; } + | /* EMPTY */ { $$ = NULL; } + ; + /***************************************************************************** * * CALL statement * *****************************************************************************/ @@ -2026,22 +2031,16 @@ constraints_set_mode: /* * Checkpoint statement */ CheckPointStmt: - CHECKPOINT + CHECKPOINT opt_utility_option_list { CheckPointStmt *n = makeNode(CheckPointStmt); $$ = (Node *) n; - } - | CHECKPOINT '(' utility_option_list ')' - { - CheckPointStmt *n = makeNode(CheckPointStmt); - - $$ = (Node *) n; - n->options = $3; + n->options = $2; } ; /***************************************************************************** @@ -9352,11 +9351,11 @@ DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_d * REINDEX [ (options) ] {INDEX | TABLE | SCHEMA} [CONCURRENTLY] <name> * REINDEX [ (options) ] {DATABASE | SYSTEM} [CONCURRENTLY] [<name>] *****************************************************************************/ ReindexStmt: - REINDEX opt_reindex_option_list reindex_target_relation opt_concurrently qualified_name + REINDEX opt_utility_option_list reindex_target_relation opt_concurrently qualified_name { ReindexStmt *n = makeNode(ReindexStmt); n->kind = $3; n->relation = $5; @@ -9365,11 +9364,11 @@ ReindexStmt: if ($4) n->params = lappend(n->params, makeDefElem("concurrently", NULL, @4)); $$ = (Node *) n; } - | REINDEX opt_reindex_option_list SCHEMA opt_concurrently name + | REINDEX opt_utility_option_list SCHEMA opt_concurrently name { ReindexStmt *n = makeNode(ReindexStmt); n->kind = REINDEX_OBJECT_SCHEMA; n->relation = NULL; @@ -9378,11 +9377,11 @@ ReindexStmt: if ($4) n->params = lappend(n->params, makeDefElem("concurrently", NULL, @4)); $$ = (Node *) n; } - | REINDEX opt_reindex_option_list reindex_target_all opt_concurrently opt_single_name + | REINDEX opt_utility_option_list reindex_target_all opt_concurrently opt_single_name { ReindexStmt *n = makeNode(ReindexStmt); n->kind = $3; n->relation = NULL; @@ -9400,14 +9399,10 @@ reindex_target_relation: ; reindex_target_all: SYSTEM_P { $$ = REINDEX_OBJECT_SYSTEM; } | DATABASE { $$ = REINDEX_OBJECT_DATABASE; } ; -opt_reindex_option_list: - '(' utility_option_list ')' { $$ = $2; } - | /* EMPTY */ { $$ = NULL; } - ; /***************************************************************************** * * ALTER TABLESPACE * @@ -11901,53 +11896,49 @@ ClusterStmt: n->relation = $5; n->indexname = $6; n->params = $3; $$ = (Node *) n; } - | CLUSTER '(' utility_option_list ')' + | CLUSTER opt_utility_option_list { ClusterStmt *n = makeNode(ClusterStmt); n->relation = NULL; n->indexname = NULL; - n->params = $3; + n->params = $2; $$ = (Node *) n; } /* unparenthesized VERBOSE kept for pre-14 compatibility */ | CLUSTER opt_verbose qualified_name cluster_index_specification { ClusterStmt *n = makeNode(ClusterStmt); n->relation = $3; n->indexname = $4; - n->params = NIL; if ($2) - n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); + n->params = list_make1(makeDefElem("verbose", NULL, @2)); $$ = (Node *) n; } /* unparenthesized VERBOSE kept for pre-17 compatibility */ - | CLUSTER opt_verbose + | CLUSTER VERBOSE { ClusterStmt *n = makeNode(ClusterStmt); n->relation = NULL; n->indexname = NULL; - n->params = NIL; - if ($2) - n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); + n->params = list_make1(makeDefElem("verbose", NULL, @2)); $$ = (Node *) n; } /* kept for pre-8.3 compatibility */ | CLUSTER opt_verbose name ON qualified_name { ClusterStmt *n = makeNode(ClusterStmt); n->relation = $5; n->indexname = $3; - n->params = NIL; if ($2) - n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); + n->params = list_make1(makeDefElem("verbose", NULL, @2)); $$ = (Node *) n; } ; cluster_index_specification: -- 2.39.5