mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +08:00
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
This commit is contained in:
parent
2bc588798b
commit
873ea9ee69
@ -315,10 +315,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
|||||||
create_extension_opt_item alter_extension_opt_item
|
create_extension_opt_item alter_extension_opt_item
|
||||||
|
|
||||||
%type <ival> opt_lock lock_type cast_context
|
%type <ival> opt_lock lock_type cast_context
|
||||||
%type <str> vac_analyze_option_name
|
%type <str> utility_option_name
|
||||||
%type <defelt> vac_analyze_option_elem
|
%type <defelt> utility_option_elem
|
||||||
%type <list> vac_analyze_option_list
|
%type <list> utility_option_list
|
||||||
%type <node> vac_analyze_option_arg
|
%type <node> utility_option_arg
|
||||||
%type <defelt> drop_option
|
%type <defelt> drop_option
|
||||||
%type <boolean> opt_or_replace opt_no
|
%type <boolean> opt_or_replace opt_no
|
||||||
opt_grant_grant_option opt_grant_admin_option
|
opt_grant_grant_option opt_grant_admin_option
|
||||||
@ -513,10 +513,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
|||||||
%type <node> generic_option_arg
|
%type <node> generic_option_arg
|
||||||
%type <defelt> generic_option_elem alter_generic_option_elem
|
%type <defelt> generic_option_elem alter_generic_option_elem
|
||||||
%type <list> generic_option_list alter_generic_option_list
|
%type <list> generic_option_list alter_generic_option_list
|
||||||
%type <str> explain_option_name
|
|
||||||
%type <node> explain_option_arg
|
|
||||||
%type <defelt> explain_option_elem
|
|
||||||
%type <list> explain_option_list
|
|
||||||
|
|
||||||
%type <ival> reindex_target_type reindex_target_multitable
|
%type <ival> reindex_target_type reindex_target_multitable
|
||||||
%type <ival> reindex_option_list reindex_option_elem
|
%type <ival> 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;
|
n->is_vacuumcmd = true;
|
||||||
$$ = (Node *)n;
|
$$ = (Node *)n;
|
||||||
}
|
}
|
||||||
| VACUUM '(' vac_analyze_option_list ')' opt_vacuum_relation_list
|
| VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
|
||||||
{
|
{
|
||||||
VacuumStmt *n = makeNode(VacuumStmt);
|
VacuumStmt *n = makeNode(VacuumStmt);
|
||||||
n->options = $3;
|
n->options = $3;
|
||||||
@ -10504,7 +10500,7 @@ AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list
|
|||||||
n->is_vacuumcmd = false;
|
n->is_vacuumcmd = false;
|
||||||
$$ = (Node *)n;
|
$$ = (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);
|
VacuumStmt *n = makeNode(VacuumStmt);
|
||||||
n->options = $3;
|
n->options = $3;
|
||||||
@ -10514,12 +10510,12 @@ AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
vac_analyze_option_list:
|
utility_option_list:
|
||||||
vac_analyze_option_elem
|
utility_option_elem
|
||||||
{
|
{
|
||||||
$$ = list_make1($1);
|
$$ = list_make1($1);
|
||||||
}
|
}
|
||||||
| vac_analyze_option_list ',' vac_analyze_option_elem
|
| utility_option_list ',' utility_option_elem
|
||||||
{
|
{
|
||||||
$$ = lappend($1, $3);
|
$$ = lappend($1, $3);
|
||||||
}
|
}
|
||||||
@ -10530,19 +10526,19 @@ analyze_keyword:
|
|||||||
| ANALYSE /* British */
|
| ANALYSE /* British */
|
||||||
;
|
;
|
||||||
|
|
||||||
vac_analyze_option_elem:
|
utility_option_elem:
|
||||||
vac_analyze_option_name vac_analyze_option_arg
|
utility_option_name utility_option_arg
|
||||||
{
|
{
|
||||||
$$ = makeDefElem($1, $2, @1);
|
$$ = makeDefElem($1, $2, @1);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
vac_analyze_option_name:
|
utility_option_name:
|
||||||
NonReservedWord { $$ = $1; }
|
NonReservedWord { $$ = $1; }
|
||||||
| analyze_keyword { $$ = "analyze"; }
|
| analyze_keyword { $$ = "analyze"; }
|
||||||
;
|
;
|
||||||
|
|
||||||
vac_analyze_option_arg:
|
utility_option_arg:
|
||||||
opt_boolean_or_string { $$ = (Node *) makeString($1); }
|
opt_boolean_or_string { $$ = (Node *) makeString($1); }
|
||||||
| NumericOnly { $$ = (Node *) $1; }
|
| NumericOnly { $$ = (Node *) $1; }
|
||||||
| /* EMPTY */ { $$ = NULL; }
|
| /* EMPTY */ { $$ = NULL; }
|
||||||
@ -10624,7 +10620,7 @@ ExplainStmt:
|
|||||||
n->options = list_make1(makeDefElem("verbose", NULL, @2));
|
n->options = list_make1(makeDefElem("verbose", NULL, @2));
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
| EXPLAIN '(' explain_option_list ')' ExplainableStmt
|
| EXPLAIN '(' utility_option_list ')' ExplainableStmt
|
||||||
{
|
{
|
||||||
ExplainStmt *n = makeNode(ExplainStmt);
|
ExplainStmt *n = makeNode(ExplainStmt);
|
||||||
n->query = $5;
|
n->query = $5;
|
||||||
@ -10645,35 +10641,6 @@ ExplainableStmt:
|
|||||||
| ExecuteStmt /* by default all are $$=$1 */
|
| 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:
|
* QUERY:
|
||||||
|
Loading…
Reference in New Issue
Block a user