diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 94 |
1 files changed, 42 insertions, 52 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e23e68fdb33..e814939a254 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -306,8 +306,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); create_extension_opt_item alter_extension_opt_item %type <ival> opt_lock lock_type cast_context -%type <ival> vacuum_option_list vacuum_option_elem - analyze_option_list analyze_option_elem +%type <str> vac_analyze_option_name +%type <defelt> vac_analyze_option_elem +%type <list> vac_analyze_option_list %type <boolean> opt_or_replace opt_grant_grant_option opt_grant_admin_option opt_nowait opt_if_exists opt_with_data @@ -10460,85 +10461,62 @@ cluster_index_specification: VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); - n->options = VACOPT_VACUUM; + n->options = NIL; if ($2) - n->options |= VACOPT_FULL; + n->options = lappend(n->options, + makeDefElem("full", NULL, @2)); if ($3) - n->options |= VACOPT_FREEZE; + n->options = lappend(n->options, + makeDefElem("freeze", NULL, @3)); if ($4) - n->options |= VACOPT_VERBOSE; + n->options = lappend(n->options, + makeDefElem("verbose", NULL, @4)); if ($5) - n->options |= VACOPT_ANALYZE; + n->options = lappend(n->options, + makeDefElem("analyze", NULL, @5)); n->rels = $6; + n->is_vacuumcmd = true; $$ = (Node *)n; } - | VACUUM '(' vacuum_option_list ')' opt_vacuum_relation_list + | VACUUM '(' vac_analyze_option_list ')' opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); - n->options = VACOPT_VACUUM | $3; + n->options = $3; n->rels = $5; + n->is_vacuumcmd = true; $$ = (Node *) n; } ; -vacuum_option_list: - vacuum_option_elem { $$ = $1; } - | vacuum_option_list ',' vacuum_option_elem { $$ = $1 | $3; } - ; - -vacuum_option_elem: - analyze_keyword { $$ = VACOPT_ANALYZE; } - | VERBOSE { $$ = VACOPT_VERBOSE; } - | FREEZE { $$ = VACOPT_FREEZE; } - | FULL { $$ = VACOPT_FULL; } - | IDENT - { - if (strcmp($1, "disable_page_skipping") == 0) - $$ = VACOPT_DISABLE_PAGE_SKIPPING; - else if (strcmp($1, "skip_locked") == 0) - $$ = VACOPT_SKIP_LOCKED; - else - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unrecognized VACUUM option \"%s\"", $1), - parser_errposition(@1))); - } - ; - AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); - n->options = VACOPT_ANALYZE; + n->options = NIL; if ($2) - n->options |= VACOPT_VERBOSE; + n->options = lappend(n->options, + makeDefElem("verbose", NULL, @2)); n->rels = $3; + n->is_vacuumcmd = false; $$ = (Node *)n; } - | analyze_keyword '(' analyze_option_list ')' opt_vacuum_relation_list + | analyze_keyword '(' vac_analyze_option_list ')' opt_vacuum_relation_list { VacuumStmt *n = makeNode(VacuumStmt); - n->options = VACOPT_ANALYZE | $3; + n->options = $3; n->rels = $5; + n->is_vacuumcmd = false; $$ = (Node *) n; } ; -analyze_option_list: - analyze_option_elem { $$ = $1; } - | analyze_option_list ',' analyze_option_elem { $$ = $1 | $3; } - ; - -analyze_option_elem: - VERBOSE { $$ = VACOPT_VERBOSE; } - | IDENT +vac_analyze_option_list: + vac_analyze_option_elem { - if (strcmp($1, "skip_locked") == 0) - $$ = VACOPT_SKIP_LOCKED; - else - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("unrecognized ANALYZE option \"%s\"", $1), - parser_errposition(@1))); + $$ = list_make1($1); + } + | vac_analyze_option_list ',' vac_analyze_option_elem + { + $$ = lappend($1, $3); } ; @@ -10547,6 +10525,18 @@ analyze_keyword: | ANALYSE /* British */ {} ; +vac_analyze_option_elem: + vac_analyze_option_name + { + $$ = makeDefElem($1, NULL, @1); + } + ; + +vac_analyze_option_name: + NonReservedWord { $$ = $1; } + | analyze_keyword { $$ = "analyze"; } + ; + opt_analyze: analyze_keyword { $$ = true; } | /*EMPTY*/ { $$ = false; } |