vacuumdb: Allow specifying objects to process in all databases.

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
This commit is contained in:
Nathan Bossart 2024-03-11 10:33:36 -05:00
parent 674e49c73c
commit 648928c79b
3 changed files with 52 additions and 51 deletions

View File

@ -36,7 +36,13 @@ PostgreSQL documentation
</arg> </arg>
</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>
<cmdsynopsis> <cmdsynopsis>
@ -47,40 +53,44 @@ PostgreSQL documentation
<arg choice="plain" rep="repeat"> <arg choice="plain" rep="repeat">
<arg choice="opt"> <arg choice="opt">
<group choice="plain"> <group choice="plain">
<arg choice="plain"> <arg choice="plain"><option>-n</option></arg>
<arg choice="opt"> <arg choice="plain"><option>--schema</option></arg>
<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>
</group> </group>
<replaceable>schema</replaceable>
</arg> </arg>
</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>
<cmdsynopsis> <cmdsynopsis>
<command>vacuumdb</command> <command>vacuumdb</command>
<arg rep="repeat"><replaceable>connection-option</replaceable></arg> <arg rep="repeat"><replaceable>connection-option</replaceable></arg>
<arg rep="repeat"><replaceable>option</replaceable></arg> <arg rep="repeat"><replaceable>option</replaceable></arg>
<group choice="plain">
<arg choice="plain"><option>-a</option></arg> <arg choice="plain" rep="repeat">
<arg choice="plain"><option>--all</option></arg> <arg choice="opt">
</group> <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> </cmdsynopsis>
</refsynopsisdiv> </refsynopsisdiv>

View File

@ -184,18 +184,18 @@ $node->command_fails_like(
[ 'vacuumdb', '-n', 'pg_catalog', '-N', '"Foo"', 'postgres' ], [ 'vacuumdb', '-n', 'pg_catalog', '-N', '"Foo"', 'postgres' ],
qr/cannot vacuum all tables in schema\(s\) and exclude schema\(s\) at the same time/, 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'); 'cannot use options -n and -N at the same time');
$node->command_fails_like( $node->issues_sql_like(
[ 'vacuumdb', '-a', '-N', '"Foo"' ], [ 'vacuumdb', '-a', '-N', 'pg_catalog' ],
qr/cannot exclude specific schema\(s\) in all databases/, qr/(?:(?!VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class).)*/,
'cannot use options -a and -N at the same time'); 'vacuumdb -a -N');
$node->command_fails_like( $node->issues_sql_like(
[ 'vacuumdb', '-a', '-n', '"Foo"' ], [ 'vacuumdb', '-a', '-n', 'pg_catalog' ],
qr/cannot vacuum specific schema\(s\) in all databases/, qr/VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class/,
'cannot use options -a and -n at the same time'); 'vacuumdb -a -n');
$node->command_fails_like( $node->issues_sql_like(
[ 'vacuumdb', '-a', '-t', '"Foo".bar' ], [ 'vacuumdb', '-a', '-t', 'pg_class' ],
qr/cannot vacuum specific table\(s\) in all databases/, qr/VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class/,
'cannot use options -a and -t at the same time'); 'vacuumdb -a -t');
$node->command_fails_like( $node->command_fails_like(
[ 'vacuumdb', '-a', '-d', 'postgres' ], [ 'vacuumdb', '-a', '-d', 'postgres' ],
qr/cannot vacuum all databases and a specific one at the same time/, qr/cannot vacuum all databases and a specific one at the same time/,

View File

@ -72,6 +72,7 @@ static void vacuum_one_database(ConnParams *cparams,
static void vacuum_all_databases(ConnParams *cparams, static void vacuum_all_databases(ConnParams *cparams,
vacuumingOptions *vacopts, vacuumingOptions *vacopts,
bool analyze_in_stages, bool analyze_in_stages,
SimpleStringList *objects,
int concurrentCons, int concurrentCons,
const char *progname, bool echo, bool quiet); const char *progname, bool echo, bool quiet);
@ -378,6 +379,7 @@ main(int argc, char *argv[])
vacuum_all_databases(&cparams, &vacopts, vacuum_all_databases(&cparams, &vacopts,
analyze_in_stages, analyze_in_stages,
&objects,
concurrentCons, concurrentCons,
progname, echo, quiet); progname, echo, quiet);
} }
@ -429,18 +431,6 @@ check_objfilter(void)
(objfilter & OBJFILTER_DATABASE)) (objfilter & OBJFILTER_DATABASE))
pg_fatal("cannot vacuum all databases and a specific one at the same time"); 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) && if ((objfilter & OBJFILTER_TABLE) &&
(objfilter & OBJFILTER_SCHEMA)) (objfilter & OBJFILTER_SCHEMA))
pg_fatal("cannot vacuum all tables in schema(s) and specific table(s) at the same time"); 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, vacuum_all_databases(ConnParams *cparams,
vacuumingOptions *vacopts, vacuumingOptions *vacopts,
bool analyze_in_stages, bool analyze_in_stages,
SimpleStringList *objects,
int concurrentCons, int concurrentCons,
const char *progname, bool echo, bool quiet) const char *progname, bool echo, bool quiet)
{ {
@ -927,7 +918,7 @@ vacuum_all_databases(ConnParams *cparams,
vacuum_one_database(cparams, vacopts, vacuum_one_database(cparams, vacopts,
stage, stage,
NULL, objects,
concurrentCons, concurrentCons,
progname, echo, quiet); progname, echo, quiet);
} }
@ -941,7 +932,7 @@ vacuum_all_databases(ConnParams *cparams,
vacuum_one_database(cparams, vacopts, vacuum_one_database(cparams, vacopts,
ANALYZE_NO_STAGE, ANALYZE_NO_STAGE,
NULL, objects,
concurrentCons, concurrentCons,
progname, echo, quiet); progname, echo, quiet);
} }