vacuumdb: Allow specifying objects to process in all databases.
authorNathan Bossart <nathan@postgresql.org>
Mon, 11 Mar 2024 15:33:36 +0000 (10:33 -0500)
committerNathan Bossart <nathan@postgresql.org>
Mon, 11 Mar 2024 15:33:36 +0000 (10:33 -0500)
Presently, vacuumdb's --table, --schema, and --exclude-schema
options cannot be used together with --all, i.e., you cannot
specify tables or schemas to process in all databases.  This commit
removes this unnecessary restriction, thus enabling potentially
useful commands like "vacuumdb --all --schema pg_catalog".

Reviewed-by: Kyotaro Horiguchi, Dean Rasheed
Discussion: https://postgr.es/m/20230628232402.GA1954626%40nathanxps13

doc/src/sgml/ref/vacuumdb.sgml
src/bin/scripts/t/100_vacuumdb.pl
src/bin/scripts/vacuumdb.c

index 09356ea4faeffe37e3a7206ba7c656d557e5ec82..66fccb30a2d26013abb9750be8a56185c10ebe1d 100644 (file)
@@ -36,7 +36,13 @@ PostgreSQL documentation
     </arg>
    </arg>
 
-   <arg choice="opt"><replaceable>dbname</replaceable></arg>
+   <arg choice="opt">
+    <group choice="plain">
+     <arg choice="plain"><replaceable>dbname</replaceable></arg>
+     <arg choice="plain"><option>-a</option></arg>
+     <arg choice="plain"><option>--all</option></arg>
+    </group>
+   </arg>
   </cmdsynopsis>
 
   <cmdsynopsis>
@@ -47,40 +53,44 @@ PostgreSQL documentation
    <arg choice="plain" rep="repeat">
     <arg choice="opt">
      <group choice="plain">
-       <arg choice="plain">
-        <arg choice="opt">
-         <group choice="plain">
-          <arg choice="plain"><option>-n</option></arg>
-          <arg choice="plain"><option>--schema</option></arg>
-         </group>
-         <replaceable>schema</replaceable>
-        </arg>
-       </arg>
-
-       <arg choice="plain">
-        <arg choice="opt">
-         <group choice="plain">
-          <arg choice="plain"><option>-N</option></arg>
-          <arg choice="plain"><option>--exclude-schema</option></arg>
-         </group>
-         <replaceable>schema</replaceable>
-        </arg>
-       </arg>
+      <arg choice="plain"><option>-n</option></arg>
+      <arg choice="plain"><option>--schema</option></arg>
      </group>
+     <replaceable>schema</replaceable>
     </arg>
    </arg>
 
-   <arg choice="opt"><replaceable>dbname</replaceable></arg>
+   <arg choice="opt">
+    <group choice="plain">
+     <arg choice="plain"><replaceable>dbname</replaceable></arg>
+     <arg choice="plain"><option>-a</option></arg>
+     <arg choice="plain"><option>--all</option></arg>
+    </group>
+   </arg>
   </cmdsynopsis>
 
   <cmdsynopsis>
    <command>vacuumdb</command>
    <arg rep="repeat"><replaceable>connection-option</replaceable></arg>
    <arg rep="repeat"><replaceable>option</replaceable></arg>
-   <group choice="plain">
-    <arg choice="plain"><option>-a</option></arg>
-    <arg choice="plain"><option>--all</option></arg>
-   </group>
+
+   <arg choice="plain" rep="repeat">
+    <arg choice="opt">
+     <group choice="plain">
+      <arg choice="plain"><option>-N</option></arg>
+      <arg choice="plain"><option>--exclude-schema</option></arg>
+     </group>
+     <replaceable>schema</replaceable>
+    </arg>
+   </arg>
+
+   <arg choice="opt">
+    <group choice="plain">
+     <arg choice="plain"><replaceable>dbname</replaceable></arg>
+     <arg choice="plain"><option>-a</option></arg>
+     <arg choice="plain"><option>--all</option></arg>
+    </group>
+   </arg>
   </cmdsynopsis>
  </refsynopsisdiv>
 
index 0601fde205f9ab3ba2083fa1f87dfd720a87319f..1d8558c780c9d4a0f0d018d47b22dc2839a196b7 100644 (file)
@@ -184,18 +184,18 @@ $node->command_fails_like(
        [ 'vacuumdb', '-n', 'pg_catalog', '-N', '"Foo"', 'postgres' ],
        qr/cannot vacuum all tables in schema\(s\) and exclude schema\(s\) at the same time/,
        'cannot use options -n and -N at the same time');
-$node->command_fails_like(
-       [ 'vacuumdb', '-a', '-N', '"Foo"' ],
-       qr/cannot exclude specific schema\(s\) in all databases/,
-       'cannot use options -a and -N at the same time');
-$node->command_fails_like(
-       [ 'vacuumdb', '-a', '-n', '"Foo"' ],
-       qr/cannot vacuum specific schema\(s\) in all databases/,
-       'cannot use options -a and -n at the same time');
-$node->command_fails_like(
-       [ 'vacuumdb', '-a', '-t', '"Foo".bar' ],
-       qr/cannot vacuum specific table\(s\) in all databases/,
-       'cannot use options -a and -t at the same time');
+$node->issues_sql_like(
+       [ 'vacuumdb', '-a', '-N', 'pg_catalog' ],
+       qr/(?:(?!VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class).)*/,
+       'vacuumdb -a -N');
+$node->issues_sql_like(
+       [ 'vacuumdb', '-a', '-n', 'pg_catalog' ],
+       qr/VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class/,
+       'vacuumdb -a -n');
+$node->issues_sql_like(
+       [ 'vacuumdb', '-a', '-t', 'pg_class' ],
+       qr/VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class/,
+       'vacuumdb -a -t');
 $node->command_fails_like(
        [ 'vacuumdb', '-a', '-d', 'postgres' ],
        qr/cannot vacuum all databases and a specific one at the same time/,
index 291766793ec18a56cf2f34be951039ebca389c17..7138c6e97e44a2fc9611dce1729a506566ef52ff 100644 (file)
@@ -72,6 +72,7 @@ static void vacuum_one_database(ConnParams *cparams,
 static void vacuum_all_databases(ConnParams *cparams,
                                                                 vacuumingOptions *vacopts,
                                                                 bool analyze_in_stages,
+                                                                SimpleStringList *objects,
                                                                 int concurrentCons,
                                                                 const char *progname, bool echo, bool quiet);
 
@@ -378,6 +379,7 @@ main(int argc, char *argv[])
 
                vacuum_all_databases(&cparams, &vacopts,
                                                         analyze_in_stages,
+                                                        &objects,
                                                         concurrentCons,
                                                         progname, echo, quiet);
        }
@@ -429,18 +431,6 @@ check_objfilter(void)
                (objfilter & OBJFILTER_DATABASE))
                pg_fatal("cannot vacuum all databases and a specific one at the same time");
 
-       if ((objfilter & OBJFILTER_ALL_DBS) &&
-               (objfilter & OBJFILTER_TABLE))
-               pg_fatal("cannot vacuum specific table(s) in all databases");
-
-       if ((objfilter & OBJFILTER_ALL_DBS) &&
-               (objfilter & OBJFILTER_SCHEMA))
-               pg_fatal("cannot vacuum specific schema(s) in all databases");
-
-       if ((objfilter & OBJFILTER_ALL_DBS) &&
-               (objfilter & OBJFILTER_SCHEMA_EXCLUDE))
-               pg_fatal("cannot exclude specific schema(s) in all databases");
-
        if ((objfilter & OBJFILTER_TABLE) &&
                (objfilter & OBJFILTER_SCHEMA))
                pg_fatal("cannot vacuum all tables in schema(s) and specific table(s) at the same time");
@@ -895,6 +885,7 @@ static void
 vacuum_all_databases(ConnParams *cparams,
                                         vacuumingOptions *vacopts,
                                         bool analyze_in_stages,
+                                        SimpleStringList *objects,
                                         int concurrentCons,
                                         const char *progname, bool echo, bool quiet)
 {
@@ -927,7 +918,7 @@ vacuum_all_databases(ConnParams *cparams,
 
                                vacuum_one_database(cparams, vacopts,
                                                                        stage,
-                                                                       NULL,
+                                                                       objects,
                                                                        concurrentCons,
                                                                        progname, echo, quiet);
                        }
@@ -941,7 +932,7 @@ vacuum_all_databases(ConnParams *cparams,
 
                        vacuum_one_database(cparams, vacopts,
                                                                ANALYZE_NO_STAGE,
-                                                               NULL,
+                                                               objects,
                                                                concurrentCons,
                                                                progname, echo, quiet);
                }