From 873ea9ee692e7829614f913685db540b17998ba6 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 30 Nov 2020 20:27:37 +0900 Subject: [PATCH] Refactor parsing rules for option lists of EXPLAIN, VACUUM and ANALYZE Those three commands have been using the same grammar rules to handle a a list of parenthesized options. This refactors the code so as they use the same parsing rules, shaving some code. A future commit will make use of those option parsing rules for more utility commands, like REINDEX and CLUSTER. Author: Alexey Kondratov, Justin Pryzby Discussion: https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru --- src/backend/parser/gram.y | 61 +++++++++------------------------------ 1 file changed, 14 insertions(+), 47 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index efc9c99754..f3ab852c13 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -315,10 +315,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); create_extension_opt_item alter_extension_opt_item %type opt_lock lock_type cast_context -%type vac_analyze_option_name -%type vac_analyze_option_elem -%type vac_analyze_option_list -%type vac_analyze_option_arg +%type utility_option_name +%type utility_option_elem +%type utility_option_list +%type utility_option_arg %type drop_option %type opt_or_replace opt_no opt_grant_grant_option opt_grant_admin_option @@ -513,10 +513,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type generic_option_arg %type generic_option_elem alter_generic_option_elem %type generic_option_list alter_generic_option_list -%type explain_option_name -%type explain_option_arg -%type explain_option_elem -%type explain_option_list %type reindex_target_type reindex_target_multitable %type reindex_option_list reindex_option_elem @@ -10483,7 +10479,7 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relati n->is_vacuumcmd = true; $$ = (Node *)n; } - | VACUUM '(' vac_analyze_option_list ')' opt_vacuum_relation_list + | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); n->options = $3; @@ -10504,7 +10500,7 @@ AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list n->is_vacuumcmd = false; $$ = (Node *)n; } - | analyze_keyword '(' vac_analyze_option_list ')' opt_vacuum_relation_list + | analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); n->options = $3; @@ -10514,12 +10510,12 @@ AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list } ; -vac_analyze_option_list: - vac_analyze_option_elem +utility_option_list: + utility_option_elem { $$ = list_make1($1); } - | vac_analyze_option_list ',' vac_analyze_option_elem + | utility_option_list ',' utility_option_elem { $$ = lappend($1, $3); } @@ -10530,19 +10526,19 @@ analyze_keyword: | ANALYSE /* British */ ; -vac_analyze_option_elem: - vac_analyze_option_name vac_analyze_option_arg +utility_option_elem: + utility_option_name utility_option_arg { $$ = makeDefElem($1, $2, @1); } ; -vac_analyze_option_name: +utility_option_name: NonReservedWord { $$ = $1; } | analyze_keyword { $$ = "analyze"; } ; -vac_analyze_option_arg: +utility_option_arg: opt_boolean_or_string { $$ = (Node *) makeString($1); } | NumericOnly { $$ = (Node *) $1; } | /* EMPTY */ { $$ = NULL; } @@ -10624,7 +10620,7 @@ ExplainStmt: n->options = list_make1(makeDefElem("verbose", NULL, @2)); $$ = (Node *) n; } - | EXPLAIN '(' explain_option_list ')' ExplainableStmt + | EXPLAIN '(' utility_option_list ')' ExplainableStmt { ExplainStmt *n = makeNode(ExplainStmt); n->query = $5; @@ -10645,35 +10641,6 @@ ExplainableStmt: | ExecuteStmt /* by default all are $$=$1 */ ; -explain_option_list: - explain_option_elem - { - $$ = list_make1($1); - } - | explain_option_list ',' explain_option_elem - { - $$ = lappend($1, $3); - } - ; - -explain_option_elem: - explain_option_name explain_option_arg - { - $$ = makeDefElem($1, $2, @1); - } - ; - -explain_option_name: - NonReservedWord { $$ = $1; } - | analyze_keyword { $$ = "analyze"; } - ; - -explain_option_arg: - opt_boolean_or_string { $$ = (Node *) makeString($1); } - | NumericOnly { $$ = (Node *) $1; } - | /* EMPTY */ { $$ = NULL; } - ; - /***************************************************************************** * * QUERY: