@@ -306,8 +306,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
306306 create_extension_opt_item alter_extension_opt_item
307307
308308%type <ival> opt_lock lock_type cast_context
309- %type <ival> vacuum_option_list vacuum_option_elem
310- analyze_option_list analyze_option_elem
309+ %type <str> vac_analyze_option_name
310+ %type <defelt> vac_analyze_option_elem
311+ %type <list> vac_analyze_option_list
311312%type <boolean> opt_or_replace
312313 opt_grant_grant_option opt_grant_admin_option
313314 opt_nowait opt_if_exists opt_with_data
@@ -10460,85 +10461,62 @@ cluster_index_specification:
1046010461VacuumStmt : VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
1046110462 {
1046210463 VacuumStmt *n = makeNode(VacuumStmt);
10463- n->options = VACOPT_VACUUM ;
10464+ n->options = NIL ;
1046410465 if ($2 )
10465- n->options |= VACOPT_FULL;
10466+ n->options = lappend(n->options,
10467+ makeDefElem (" full" , NULL , @2 ));
1046610468 if ($3 )
10467- n->options |= VACOPT_FREEZE;
10469+ n->options = lappend(n->options,
10470+ makeDefElem (" freeze" , NULL , @3 ));
1046810471 if ($4 )
10469- n->options |= VACOPT_VERBOSE;
10472+ n->options = lappend(n->options,
10473+ makeDefElem (" verbose" , NULL , @4 ));
1047010474 if ($5 )
10471- n->options |= VACOPT_ANALYZE;
10475+ n->options = lappend(n->options,
10476+ makeDefElem (" analyze" , NULL , @5 ));
1047210477 n->rels = $6 ;
10478+ n->is_vacuumcmd = true ;
1047310479 $$ = (Node *)n;
1047410480 }
10475- | VACUUM ' (' vacuum_option_list ' )' opt_vacuum_relation_list
10481+ | VACUUM ' (' vac_analyze_option_list ' )' opt_vacuum_relation_list
1047610482 {
1047710483 VacuumStmt *n = makeNode(VacuumStmt);
10478- n->options = VACOPT_VACUUM | $3 ;
10484+ n->options = $3 ;
1047910485 n->rels = $5 ;
10486+ n->is_vacuumcmd = true ;
1048010487 $$ = (Node *) n;
1048110488 }
1048210489 ;
1048310490
10484- vacuum_option_list :
10485- vacuum_option_elem { $$ = $1 ; }
10486- | vacuum_option_list ' ,' vacuum_option_elem { $$ = $1 | $3 ; }
10487- ;
10488-
10489- vacuum_option_elem :
10490- analyze_keyword { $$ = VACOPT_ANALYZE; }
10491- | VERBOSE { $$ = VACOPT_VERBOSE; }
10492- | FREEZE { $$ = VACOPT_FREEZE; }
10493- | FULL { $$ = VACOPT_FULL; }
10494- | IDENT
10495- {
10496- if (strcmp($1 , " disable_page_skipping" ) == 0 )
10497- $$ = VACOPT_DISABLE_PAGE_SKIPPING;
10498- else if (strcmp($1 , " skip_locked" ) == 0 )
10499- $$ = VACOPT_SKIP_LOCKED;
10500- else
10501- ereport (ERROR,
10502- (errcode(ERRCODE_SYNTAX_ERROR),
10503- errmsg(" unrecognized VACUUM option \" %s\" " , $1 ),
10504- parser_errposition(@1 )));
10505- }
10506- ;
10507-
1050810491AnalyzeStmt : analyze_keyword opt_verbose opt_vacuum_relation_list
1050910492 {
1051010493 VacuumStmt *n = makeNode(VacuumStmt);
10511- n->options = VACOPT_ANALYZE ;
10494+ n->options = NIL ;
1051210495 if ($2 )
10513- n->options |= VACOPT_VERBOSE;
10496+ n->options = lappend(n->options,
10497+ makeDefElem (" verbose" , NULL , @2 ));
1051410498 n->rels = $3 ;
10499+ n->is_vacuumcmd = false ;
1051510500 $$ = (Node *)n;
1051610501 }
10517- | analyze_keyword ' (' analyze_option_list ' )' opt_vacuum_relation_list
10502+ | analyze_keyword ' (' vac_analyze_option_list ' )' opt_vacuum_relation_list
1051810503 {
1051910504 VacuumStmt *n = makeNode(VacuumStmt);
10520- n->options = VACOPT_ANALYZE | $3 ;
10505+ n->options = $3 ;
1052110506 n->rels = $5 ;
10507+ n->is_vacuumcmd = false ;
1052210508 $$ = (Node *) n;
1052310509 }
1052410510 ;
1052510511
10526- analyze_option_list :
10527- analyze_option_elem { $$ = $1 ; }
10528- | analyze_option_list ' ,' analyze_option_elem { $$ = $1 | $3 ; }
10529- ;
10530-
10531- analyze_option_elem :
10532- VERBOSE { $$ = VACOPT_VERBOSE; }
10533- | IDENT
10512+ vac_analyze_option_list :
10513+ vac_analyze_option_elem
1053410514 {
10535- if (strcmp($1 , " skip_locked" ) == 0 )
10536- $$ = VACOPT_SKIP_LOCKED;
10537- else
10538- ereport (ERROR,
10539- (errcode(ERRCODE_SYNTAX_ERROR),
10540- errmsg(" unrecognized ANALYZE option \" %s\" " , $1 ),
10541- parser_errposition(@1 )));
10515+ $$ = list_make1($1 );
10516+ }
10517+ | vac_analyze_option_list ' ,' vac_analyze_option_elem
10518+ {
10519+ $$ = lappend($1 , $3 );
1054210520 }
1054310521 ;
1054410522
@@ -10547,6 +10525,18 @@ analyze_keyword:
1054710525 | ANALYSE /* British */ {}
1054810526 ;
1054910527
10528+ vac_analyze_option_elem :
10529+ vac_analyze_option_name
10530+ {
10531+ $$ = makeDefElem($1 , NULL , @1 );
10532+ }
10533+ ;
10534+
10535+ vac_analyze_option_name :
10536+ NonReservedWord { $$ = $1 ; }
10537+ | analyze_keyword { $$ = " analyze" ; }
10538+ ;
10539+
1055010540opt_analyze :
1055110541 analyze_keyword { $$ = true ; }
1055210542 | /* EMPTY*/ { $$ = false ; }
0 commit comments