diff options
author | Nathan Bossart <nathan@postgresql.org> | 2024-03-11 13:11:20 -0500 |
---|---|---|
committer | Nathan Bossart <nathan@postgresql.org> | 2024-03-11 13:11:20 -0500 |
commit | 1b49d56d358a9c2e310d66c0ac87216d9b932b78 (patch) | |
tree | 1a4e29c748c1f861d235871aba051f6d16977349 | |
parent | 5fb4cea1b4a28267eeb564f1e57cbdfd39f1eea6 (diff) | |
download | postgresql-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.sgml | 17 | ||||
-rw-r--r-- | src/bin/scripts/clusterdb.c | 28 | ||||
-rw-r--r-- | src/bin/scripts/t/011_clusterdb_all.pl | 11 |
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(); |