]> granicus.if.org Git - postgresql/commitdiff
Allow existing VACUUM options to take a Boolean argument.
authorRobert Haas <rhaas@postgresql.org>
Fri, 29 Mar 2019 12:22:49 +0000 (08:22 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 29 Mar 2019 12:22:49 +0000 (08:22 -0400)
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

doc/src/sgml/ref/vacuum.sgml
src/backend/commands/vacuum.c
src/backend/parser/gram.y
src/bin/psql/tab-complete.c

index fd911f5776695d3b5aa0a57b16ac8c4088b2cc8c..906d0c2ad7c18c46962fb8855281f8b874c8a5ac 100644 (file)
@@ -26,12 +26,12 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet
 
 <phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
 
-    FULL
-    FREEZE
-    VERBOSE
-    ANALYZE
-    DISABLE_PAGE_SKIPPING
-    SKIP_LOCKED
+    FULL [ <replaceable class="parameter">boolean</replaceable> ]
+    FREEZE [ <replaceable class="parameter">boolean</replaceable> ]
+    VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
+    ANALYZE [ <replaceable class="parameter">boolean</replaceable> ]
+    DISABLE_PAGE_SKIPPING [ <replaceable class="parameter">boolean</replaceable> ]
+    SKIP_LOCKED [ <replaceable class="parameter">boolean</replaceable> ]
 
 <phrase>and <replaceable class="parameter">table_and_columns</replaceable> is:</phrase>
 
@@ -181,6 +181,20 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ <replaceable class="paramet
     </listitem>
    </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>
     <term><replaceable class="parameter">table_name</replaceable></term>
     <listitem>
index f0afeaf40c27eeca9d6f0d1b5ab08528c84ecffb..10df766f1cab9c5c11932371115e384c3b62eb57 100644 (file)
@@ -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"
@@ -86,10 +87,14 @@ void
 ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 {
        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;
 
-       params.options = vacstmt->is_vacuumcmd ? VACOPT_VACUUM : VACOPT_ANALYZE;
-
        /* Parse options list */
        foreach(lc, vacstmt->options)
        {
@@ -97,9 +102,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;
+                       verbose = defGetBoolean(opt);
                else if (strcmp(opt->defname, "skip_locked") == 0)
-                       params.options |= VACOPT_SKIP_LOCKED;
+                       skip_locked = defGetBoolean(opt);
                else if (!vacstmt->is_vacuumcmd)
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
@@ -108,13 +113,13 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 
                /* Parse options available on VACUUM */
                else if (strcmp(opt->defname, "analyze") == 0)
-                               params.options |= VACOPT_ANALYZE;
+                       analyze = defGetBoolean(opt);
                else if (strcmp(opt->defname, "freeze") == 0)
-                               params.options |= VACOPT_FREEZE;
+                       freeze = defGetBoolean(opt);
                else if (strcmp(opt->defname, "full") == 0)
-                       params.options |= VACOPT_FULL;
+                       full = defGetBoolean(opt);
                else if (strcmp(opt->defname, "disable_page_skipping") == 0)
-                       params.options |= VACOPT_DISABLE_PAGE_SKIPPING;
+                       disable_page_skipping = defGetBoolean(opt);
                else
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
@@ -122,6 +127,16 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
                                         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 */
        Assert(params.options & (VACOPT_VACUUM | VACOPT_ANALYZE));
        Assert((params.options & VACOPT_VACUUM) ||
index d711f9a7368bbd5c3063fc8768b97364cda234bf..28f62de97e52ce72c0e18d10e99230282cf2bc63 100644 (file)
@@ -309,6 +309,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <str>            vac_analyze_option_name
 %type <defelt> vac_analyze_option_elem
 %type <list>   vac_analyze_option_list
+%type <node>   vac_analyze_option_arg
 %type <boolean>        opt_or_replace
                                opt_grant_grant_option opt_grant_admin_option
                                opt_nowait opt_if_exists opt_with_data
@@ -10543,9 +10544,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);
                                }
                ;
 
@@ -10554,6 +10555,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; }
index ab69a2c946d2c70b731878622e5639477bb107e1..d6d8fd02f5a6fe7af3e891a13097a17d2daef73f 100644 (file)
@@ -3444,6 +3444,8 @@ psql_completion(const char *text, int start, int end)
                if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
                        COMPLETE_WITH("FULL", "FREEZE", "ANALYZE", "VERBOSE",
                                                  "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("("))
                /* "VACUUM (" should be caught above, so assume we want columns */