clusterdb: Allow specifying tables to process in all databases.
authorNathan Bossart <nathan@postgresql.org>
Mon, 11 Mar 2024 18:11:20 +0000 (13:11 -0500)
committerNathan Bossart <nathan@postgresql.org>
Mon, 11 Mar 2024 18:11:20 +0000 (13:11 -0500)
Presently, clusterdb's --table option cannot be used together with
--all, i.e., you cannot specify tables to process in all databases.
This commit removes this unnecessary restriction.  In passing,
change the synopsis in the documentation to use "[option...]"
instead of "[--verbose | -v]".  There are other general-purpose
options (e.g., --quiet and --echo), but the synopsis currently only
lists --verbose.

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

doc/src/sgml/ref/clusterdb.sgml
src/bin/scripts/clusterdb.c
src/bin/scripts/t/011_clusterdb_all.pl

index c838b22c4405349928125534867592a5b1fab1d8..d3145318b361fb506c2f2a9739ad6309da3c8bb2 100644 (file)
@@ -23,7 +23,7 @@ PostgreSQL documentation
   <cmdsynopsis>
    <command>clusterdb</command>
    <arg rep="repeat"><replaceable>connection-option</replaceable></arg>
-   <group choice="opt"><arg choice="plain"><option>--verbose</option></arg><arg choice="plain"><option>-v</option></arg></group>
+   <arg rep="repeat"><replaceable>option</replaceable></arg>
 
    <arg choice="plain" rep="repeat">
      <arg choice="opt">
@@ -35,14 +35,13 @@ PostgreSQL documentation
      </arg>
    </arg>
 
-   <arg choice="opt"><replaceable>dbname</replaceable></arg>
-  </cmdsynopsis>
-
-  <cmdsynopsis>
-   <command>clusterdb</command>
-   <arg rep="repeat"><replaceable>connection-option</replaceable></arg>
-   <group choice="opt"><arg choice="plain"><option>--verbose</option></arg><arg choice="plain"><option>-v</option></arg></group>
-   <group choice="plain"><arg choice="plain"><option>--all</option></arg><arg choice="plain"><option>-a</option></arg></group>
+   <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 1f3aec1b5e175eaa5cd62af88b636db4079186bf..3503a3bb5840fd14038daa84d68a56aac9c9fae1 100644 (file)
@@ -21,8 +21,9 @@
 
 static void cluster_one_database(const ConnParams *cparams, const char *table,
                                                                 const char *progname, bool verbose, bool echo);
-static void cluster_all_databases(ConnParams *cparams, const char *progname,
-                                                                 bool verbose, bool echo, bool quiet);
+static void cluster_all_databases(ConnParams *cparams, SimpleStringList *tables,
+                                                                 const char *progname, bool verbose, bool echo,
+                                                                 bool quiet);
 static void help(const char *progname);
 
 
@@ -147,12 +148,10 @@ main(int argc, char *argv[])
                if (dbname)
                        pg_fatal("cannot cluster all databases and a specific one at the same time");
 
-               if (tables.head != NULL)
-                       pg_fatal("cannot cluster specific table(s) in all databases");
-
                cparams.dbname = maintenance_db;
 
-               cluster_all_databases(&cparams, progname, verbose, echo, quiet);
+               cluster_all_databases(&cparams, &tables,
+                                                         progname, verbose, echo, quiet);
        }
        else
        {
@@ -226,8 +225,9 @@ cluster_one_database(const ConnParams *cparams, const char *table,
 
 
 static void
-cluster_all_databases(ConnParams *cparams, const char *progname,
-                                         bool verbose, bool echo, bool quiet)
+cluster_all_databases(ConnParams *cparams, SimpleStringList *tables,
+                                         const char *progname, bool verbose, bool echo,
+                                         bool quiet)
 {
        PGconn     *conn;
        PGresult   *result;
@@ -251,7 +251,17 @@ cluster_all_databases(ConnParams *cparams, const char *progname,
 
                cparams->override_dbname = dbname;
 
-               cluster_one_database(cparams, NULL, progname, verbose, echo);
+               if (tables->head != NULL)
+               {
+                       SimpleStringListCell *cell;
+
+                       for (cell = tables->head; cell; cell = cell->next)
+                               cluster_one_database(cparams, cell->val,
+                                                                        progname, verbose, echo);
+               }
+               else
+                       cluster_one_database(cparams, NULL,
+                                                                progname, verbose, echo);
        }
 
        PQclear(result);
index 04078a5b7e61e5cb84595d0795800cbcc668061d..3415e1d4f49c794f312c952a968578e96b4a0c1f 100644 (file)
@@ -33,4 +33,15 @@ $node->command_fails_like([ 'clusterdb', '-d', 'regression_invalid'],
   qr/FATAL:  cannot connect to invalid database "regression_invalid"/,
   'clusterdb cannot target invalid database');
 
+$node->safe_psql('postgres',
+       'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a); CLUSTER test1 USING test1x'
+);
+$node->safe_psql('template1',
+       'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a); CLUSTER test1 USING test1x'
+);
+$node->issues_sql_like(
+       [ 'clusterdb', '-a', '-t', 'test1' ],
+       qr/statement: CLUSTER public\.test1/s,
+       'cluster specific table in all databases');
+
 done_testing();