aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Bossart <nathan@postgresql.org>2024-03-11 13:11:20 -0500
committerNathan Bossart <nathan@postgresql.org>2024-03-11 13:11:20 -0500
commit1b49d56d358a9c2e310d66c0ac87216d9b932b78 (patch)
tree1a4e29c748c1f861d235871aba051f6d16977349
parent5fb4cea1b4a28267eeb564f1e57cbdfd39f1eea6 (diff)
downloadpostgresql-1b49d56d358a9c2e310d66c0ac87216d9b932b78.tar.gz
postgresql-1b49d56d358a9c2e310d66c0ac87216d9b932b78.zip
clusterdb: Allow specifying tables to process in all databases.
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
-rw-r--r--doc/src/sgml/ref/clusterdb.sgml17
-rw-r--r--src/bin/scripts/clusterdb.c28
-rw-r--r--src/bin/scripts/t/011_clusterdb_all.pl11
3 files changed, 38 insertions, 18 deletions
diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml
index c838b22c440..d3145318b36 100644
--- a/doc/src/sgml/ref/clusterdb.sgml
+++ b/doc/src/sgml/ref/clusterdb.sgml
@@ -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>
diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
index 1f3aec1b5e1..3503a3bb584 100644
--- a/src/bin/scripts/clusterdb.c
+++ b/src/bin/scripts/clusterdb.c
@@ -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);
diff --git a/src/bin/scripts/t/011_clusterdb_all.pl b/src/bin/scripts/t/011_clusterdb_all.pl
index 04078a5b7e6..3415e1d4f49 100644
--- a/src/bin/scripts/t/011_clusterdb_all.pl
+++ b/src/bin/scripts/t/011_clusterdb_all.pl
@@ -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();