From 41702c0b900ce4fb1c195009fe3d2dfbcd53ca8d Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Fri, 22 Mar 2019 10:31:31 +0900 Subject: [PATCH v19 1/3] All VACUUM command options allow an argument. All existing VACUUM command options allow a boolean argument like EXPLAIN command. --- doc/src/sgml/ref/vacuum.sgml | 27 +++++++++++++++++++++------ src/backend/commands/vacuum.c | 13 +++++++------ src/backend/parser/gram.y | 10 ++++++++-- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/doc/src/sgml/ref/vacuum.sgml b/doc/src/sgml/ref/vacuum.sgml index fd911f5..99dda89 100644 --- a/doc/src/sgml/ref/vacuum.sgml +++ b/doc/src/sgml/ref/vacuum.sgml @@ -26,12 +26,13 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ option can be one of: - FULL - FREEZE - VERBOSE - ANALYZE - DISABLE_PAGE_SKIPPING - SKIP_LOCKED + FULL [ boolean ] + FREEZE [ boolean ] + VERBOSE [ boolean ] + ANALYZE [ boolean ] + PARALLEL [ N ] + DISABLE_PAGE_SKIPPING [ boolean ] + SKIP_LOCKED [ boolean ] and table_and_columns is: @@ -182,6 +183,20 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ boolean + + + Specifies whether the selected option should be turned on or off. + You can write TRUE, ON, or + 1 to enable the option, and FALSE, + OFF, or 0 to disable it. The + boolean value can also + be omitted, in which case TRUE is assumed. + + + + + table_name diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index f0afeaf..72f140e 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -36,6 +36,7 @@ #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" #include "commands/cluster.h" +#include "commands/defrem.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "nodes/makefuncs.h" @@ -97,9 +98,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* Parse common options for VACUUM and ANALYZE */ if (strcmp(opt->defname, "verbose") == 0) - params.options |= VACOPT_VERBOSE; + params.options |= defGetBoolean(opt) ? VACOPT_VERBOSE : 0; else if (strcmp(opt->defname, "skip_locked") == 0) - params.options |= VACOPT_SKIP_LOCKED; + params.options |= defGetBoolean(opt) ? VACOPT_SKIP_LOCKED : 0; else if (!vacstmt->is_vacuumcmd) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -108,13 +109,13 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* Parse options available on VACUUM */ else if (strcmp(opt->defname, "analyze") == 0) - params.options |= VACOPT_ANALYZE; + params.options |= defGetBoolean(opt) ? VACOPT_ANALYZE : 0; else if (strcmp(opt->defname, "freeze") == 0) - params.options |= VACOPT_FREEZE; + params.options |= defGetBoolean(opt) ? VACOPT_FREEZE : 0; else if (strcmp(opt->defname, "full") == 0) - params.options |= VACOPT_FULL; + params.options |= defGetBoolean(opt) ? VACOPT_FULL : 0; else if (strcmp(opt->defname, "disable_page_skipping") == 0) - params.options |= VACOPT_DISABLE_PAGE_SKIPPING; + params.options |= defGetBoolean(opt) ? VACOPT_DISABLE_PAGE_SKIPPING : 0; else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 502e51b..921e7d2 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -309,6 +309,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type vac_analyze_option_name %type vac_analyze_option_elem %type vac_analyze_option_list +%type vac_analyze_option_arg %type opt_or_replace opt_grant_grant_option opt_grant_admin_option opt_nowait opt_if_exists opt_with_data @@ -10528,9 +10529,9 @@ analyze_keyword: ; vac_analyze_option_elem: - vac_analyze_option_name + vac_analyze_option_name vac_analyze_option_arg { - $$ = makeDefElem($1, NULL, @1); + $$ = makeDefElem($1, $2, @1); } ; @@ -10539,6 +10540,11 @@ vac_analyze_option_name: | analyze_keyword { $$ = "analyze"; } ; +vac_analyze_option_arg: + opt_boolean_or_string { $$ = (Node *) makeString($1); } + | /* EMPTY */ { $$ = NULL; } + ; + opt_analyze: analyze_keyword { $$ = true; } | /*EMPTY*/ { $$ = false; } -- 2.10.5