Commit 41b54ba7 authored by Robert Haas's avatar Robert Haas

Allow existing VACUUM options to take a Boolean argument.

This makes VACUUM work more like EXPLAIN already does without changing
the meaning of any commands that already work.  It is intended to
facilitate the addition of future VACUUM options that may take
non-Boolean parameters or that default to false.

Masahiko Sawada, reviewed by me.

Discussion: http://postgr.es/m/CA+TgmobpYrXr5sUaEe_T0boabV0DSm=utSOZzwCUNqfLEEm8Mw@mail.gmail.com
Discussion: http://postgr.es/m/CAD21AoBaFcKBAeL5_++j+Vzir2vBBcF4juW7qH8b3HsQY=Q6+w@mail.gmail.com
parent c900c152
...@@ -26,12 +26,12 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet ...@@ -26,12 +26,12 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet
<phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase> <phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
FULL FULL [ <replaceable class="parameter">boolean</replaceable> ]
FREEZE FREEZE [ <replaceable class="parameter">boolean</replaceable> ]
VERBOSE VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
ANALYZE ANALYZE [ <replaceable class="parameter">boolean</replaceable> ]
DISABLE_PAGE_SKIPPING DISABLE_PAGE_SKIPPING [ <replaceable class="parameter">boolean</replaceable> ]
SKIP_LOCKED SKIP_LOCKED [ <replaceable class="parameter">boolean</replaceable> ]
<phrase>and <replaceable class="parameter">table_and_columns</replaceable> is:</phrase> <phrase>and <replaceable class="parameter">table_and_columns</replaceable> is:</phrase>
...@@ -181,6 +181,20 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet ...@@ -181,6 +181,20 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><replaceable class="parameter">boolean</replaceable></term>
<listitem>
<para>
Specifies whether the selected option should be turned on or off.
You can write <literal>TRUE</literal>, <literal>ON</literal>, or
<literal>1</literal> to enable the option, and <literal>FALSE</literal>,
<literal>OFF</literal>, or <literal>0</literal> to disable it. The
<replaceable class="parameter">boolean</replaceable> value can also
be omitted, in which case <literal>TRUE</literal> is assumed.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><replaceable class="parameter">table_name</replaceable></term> <term><replaceable class="parameter">table_name</replaceable></term>
<listitem> <listitem>
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "catalog/pg_inherits.h" #include "catalog/pg_inherits.h"
#include "catalog/pg_namespace.h" #include "catalog/pg_namespace.h"
#include "commands/cluster.h" #include "commands/cluster.h"
#include "commands/defrem.h"
#include "commands/vacuum.h" #include "commands/vacuum.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "nodes/makefuncs.h" #include "nodes/makefuncs.h"
...@@ -86,10 +87,14 @@ void ...@@ -86,10 +87,14 @@ void
ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
{ {
VacuumParams params; VacuumParams params;
bool verbose = false;
bool skip_locked = false;
bool analyze = false;
bool freeze = false;
bool full = false;
bool disable_page_skipping = false;
ListCell *lc; ListCell *lc;
params.options = vacstmt->is_vacuumcmd ? VACOPT_VACUUM : VACOPT_ANALYZE;
/* Parse options list */ /* Parse options list */
foreach(lc, vacstmt->options) foreach(lc, vacstmt->options)
{ {
...@@ -97,9 +102,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) ...@@ -97,9 +102,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
/* Parse common options for VACUUM and ANALYZE */ /* Parse common options for VACUUM and ANALYZE */
if (strcmp(opt->defname, "verbose") == 0) if (strcmp(opt->defname, "verbose") == 0)
params.options |= VACOPT_VERBOSE; verbose = defGetBoolean(opt);
else if (strcmp(opt->defname, "skip_locked") == 0) else if (strcmp(opt->defname, "skip_locked") == 0)
params.options |= VACOPT_SKIP_LOCKED; skip_locked = defGetBoolean(opt);
else if (!vacstmt->is_vacuumcmd) else if (!vacstmt->is_vacuumcmd)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),
...@@ -108,13 +113,13 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) ...@@ -108,13 +113,13 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
/* Parse options available on VACUUM */ /* Parse options available on VACUUM */
else if (strcmp(opt->defname, "analyze") == 0) else if (strcmp(opt->defname, "analyze") == 0)
params.options |= VACOPT_ANALYZE; analyze = defGetBoolean(opt);
else if (strcmp(opt->defname, "freeze") == 0) else if (strcmp(opt->defname, "freeze") == 0)
params.options |= VACOPT_FREEZE; freeze = defGetBoolean(opt);
else if (strcmp(opt->defname, "full") == 0) else if (strcmp(opt->defname, "full") == 0)
params.options |= VACOPT_FULL; full = defGetBoolean(opt);
else if (strcmp(opt->defname, "disable_page_skipping") == 0) else if (strcmp(opt->defname, "disable_page_skipping") == 0)
params.options |= VACOPT_DISABLE_PAGE_SKIPPING; disable_page_skipping = defGetBoolean(opt);
else else
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),
...@@ -122,6 +127,16 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) ...@@ -122,6 +127,16 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
parser_errposition(pstate, opt->location))); parser_errposition(pstate, opt->location)));
} }
/* Set vacuum options */
params.options =
(vacstmt->is_vacuumcmd ? VACOPT_VACUUM : VACOPT_ANALYZE) |
(verbose ? VACOPT_VERBOSE : 0) |
(skip_locked ? VACOPT_SKIP_LOCKED : 0) |
(analyze ? VACOPT_ANALYZE : 0) |
(freeze ? VACOPT_FREEZE : 0) |
(full ? VACOPT_FULL : 0) |
(disable_page_skipping ? VACOPT_DISABLE_PAGE_SKIPPING : 0);
/* sanity checks on options */ /* sanity checks on options */
Assert(params.options & (VACOPT_VACUUM | VACOPT_ANALYZE)); Assert(params.options & (VACOPT_VACUUM | VACOPT_ANALYZE));
Assert((params.options & VACOPT_VACUUM) || Assert((params.options & VACOPT_VACUUM) ||
......
...@@ -309,6 +309,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); ...@@ -309,6 +309,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <str> vac_analyze_option_name %type <str> vac_analyze_option_name
%type <defelt> vac_analyze_option_elem %type <defelt> vac_analyze_option_elem
%type <list> vac_analyze_option_list %type <list> vac_analyze_option_list
%type <node> vac_analyze_option_arg
%type <boolean> opt_or_replace %type <boolean> opt_or_replace
opt_grant_grant_option opt_grant_admin_option opt_grant_grant_option opt_grant_admin_option
opt_nowait opt_if_exists opt_with_data opt_nowait opt_if_exists opt_with_data
...@@ -10543,9 +10544,9 @@ analyze_keyword: ...@@ -10543,9 +10544,9 @@ analyze_keyword:
; ;
vac_analyze_option_elem: vac_analyze_option_elem:
vac_analyze_option_name vac_analyze_option_name vac_analyze_option_arg
{ {
$$ = makeDefElem($1, NULL, @1); $$ = makeDefElem($1, $2, @1);
} }
; ;
...@@ -10554,6 +10555,11 @@ vac_analyze_option_name: ...@@ -10554,6 +10555,11 @@ vac_analyze_option_name:
| analyze_keyword { $$ = "analyze"; } | analyze_keyword { $$ = "analyze"; }
; ;
vac_analyze_option_arg:
opt_boolean_or_string { $$ = (Node *) makeString($1); }
| /* EMPTY */ { $$ = NULL; }
;
opt_analyze: opt_analyze:
analyze_keyword { $$ = true; } analyze_keyword { $$ = true; }
| /*EMPTY*/ { $$ = false; } | /*EMPTY*/ { $$ = false; }
......
...@@ -3444,6 +3444,8 @@ psql_completion(const char *text, int start, int end) ...@@ -3444,6 +3444,8 @@ psql_completion(const char *text, int start, int end)
if (ends_with(prev_wd, '(') || ends_with(prev_wd, ',')) if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
COMPLETE_WITH("FULL", "FREEZE", "ANALYZE", "VERBOSE", COMPLETE_WITH("FULL", "FREEZE", "ANALYZE", "VERBOSE",
"DISABLE_PAGE_SKIPPING", "SKIP_LOCKED"); "DISABLE_PAGE_SKIPPING", "SKIP_LOCKED");
else if (TailMatches("FULL|FREEZE|ANALYZE|VERBOSE|DISABLE_PAGE_SKIPPING|SKIP_LOCKED"))
COMPLETE_WITH("ON", "OFF");
} }
else if (HeadMatches("VACUUM") && TailMatches("(")) else if (HeadMatches("VACUUM") && TailMatches("("))
/* "VACUUM (" should be caught above, so assume we want columns */ /* "VACUUM (" should be caught above, so assume we want columns */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment