pg_{dump,restore}: Refactor handling of conflicting options.

This commit makes use of the function added by commit b2898baaf7
for these applications' handling of conflicting options.  It
doesn't fix any bugs, but it does trim several lines of code.

Author: Jian He <jian.universality@gmail.com>
Reviewed-by: Steven Niu <niushiji@gmail.com>
Reviewed-by: Zsolt Parragi <zsolt.parragi@percona.com>
Discussion: https://postgr.es/m/CACJufxHDYn%2B3-2jR_kwYB0U7UrNP%2B0EPvAWzBBD5EfUzzr1uiw%40mail.gmail.com
This commit is contained in:
Nathan Bossart 2026-03-09 11:37:46 -05:00
parent 91f33a2ae9
commit 7c8280eeb5
6 changed files with 91 additions and 146 deletions

View file

@ -826,52 +826,39 @@ main(int argc, char **argv)
if (dopt.column_inserts && dopt.dump_inserts == 0) if (dopt.column_inserts && dopt.dump_inserts == 0)
dopt.dump_inserts = DUMP_DEFAULT_ROWS_PER_INSERT; dopt.dump_inserts = DUMP_DEFAULT_ROWS_PER_INSERT;
/* reject conflicting "-only" options */ /* *-only options are incompatible with each other */
if (data_only && schema_only) check_mut_excl_opts(data_only, "-a/--data-only",
pg_fatal("options %s and %s cannot be used together", schema_only, "-s/--schema-only",
"-s/--schema-only", "-a/--data-only"); statistics_only, "--statistics-only");
if (schema_only && statistics_only)
pg_fatal("options %s and %s cannot be used together",
"-s/--schema-only", "--statistics-only");
if (data_only && statistics_only)
pg_fatal("options %s and %s cannot be used together",
"-a/--data-only", "--statistics-only");
/* reject conflicting "-only" and "no-" options */ /* --no-* and *-only for same thing are incompatible */
if (data_only && no_data) check_mut_excl_opts(data_only, "-a/--data-only",
pg_fatal("options %s and %s cannot be used together", no_data, "--no-data");
"-a/--data-only", "--no-data"); check_mut_excl_opts(schema_only, "-s/--schema-only",
if (schema_only && no_schema) no_schema, "--no-schema");
pg_fatal("options %s and %s cannot be used together", check_mut_excl_opts(statistics_only, "--statistics-only",
"-s/--schema-only", "--no-schema"); no_statistics, "--no-statistics");
if (statistics_only && no_statistics)
pg_fatal("options %s and %s cannot be used together",
"--statistics-only", "--no-statistics");
/* reject conflicting "no-" options */ /* --statistics and --no-statistics are incompatible */
if (with_statistics && no_statistics) check_mut_excl_opts(with_statistics, "--statistics",
pg_fatal("options %s and %s cannot be used together", no_statistics, "--no-statistics");
"--statistics", "--no-statistics");
/* reject conflicting "-only" options */ /* --statistics is incompatible with *-only (except --statistics-only) */
if (data_only && with_statistics) check_mut_excl_opts(with_statistics, "--statistics",
pg_fatal("options %s and %s cannot be used together", data_only, "-a/--data-only",
"-a/--data-only", "--statistics"); schema_only, "-s/--schema-only");
if (schema_only && with_statistics)
pg_fatal("options %s and %s cannot be used together",
"-s/--schema-only", "--statistics");
if (schema_only && foreign_servers_include_patterns.head != NULL) /* --include-foreign-data is incompatible with --schema-only */
pg_fatal("options %s and %s cannot be used together", check_mut_excl_opts(foreign_servers_include_patterns.head, "--include-foreign-data",
"-s/--schema-only", "--include-foreign-data"); schema_only, "-s/--schema-only");
if (numWorkers > 1 && foreign_servers_include_patterns.head != NULL) if (numWorkers > 1 && foreign_servers_include_patterns.head != NULL)
pg_fatal("option %s is not supported with parallel backup", pg_fatal("option %s is not supported with parallel backup",
"--include-foreign-data"); "--include-foreign-data");
if (data_only && dopt.outputClean) /* --clean is incompatible with --data-only */
pg_fatal("options %s and %s cannot be used together", check_mut_excl_opts(dopt.outputClean, "-c/--clean",
"-c/--clean", "-a/--data-only"); data_only, "-a/--data-only");
if (dopt.if_exists && !dopt.outputClean) if (dopt.if_exists && !dopt.outputClean)
pg_fatal("option %s requires option %s", pg_fatal("option %s requires option %s",

View file

@ -421,7 +421,7 @@ main(int argc, char *argv[])
exit_nicely(1); exit_nicely(1);
} }
/* --exclude_database is incompatible with global *-only options */ /* --exclude-database is incompatible with global *-only options */
check_mut_excl_opts(database_exclude_patterns.head, "--exclude-database", check_mut_excl_opts(database_exclude_patterns.head, "--exclude-database",
globals_only, "-g/--globals-only", globals_only, "-g/--globals-only",
roles_only, "-r/--roles-only", roles_only, "-r/--roles-only",

View file

@ -385,31 +385,20 @@ main(int argc, char **argv)
if (!opts->cparams.dbname && !opts->filename && !opts->tocSummary) if (!opts->cparams.dbname && !opts->filename && !opts->tocSummary)
pg_fatal("one of -d/--dbname and -f/--file must be specified"); pg_fatal("one of -d/--dbname and -f/--file must be specified");
if (db_exclude_patterns.head != NULL && globals_only) /* --exclude-database and --globals-only are incompatible */
{ check_mut_excl_opts(db_exclude_patterns.head, "--exclude-database",
pg_log_error("option %s cannot be used together with %s", globals_only, "-g/--globals-only");
"--exclude-database", "-g/--globals-only");
pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit_nicely(1);
}
/* Should get at most one of -d and -f, else user is confused */ /* Should get at most one of -d and -f, else user is confused */
check_mut_excl_opts(opts->cparams.dbname, "-d/--dbname",
opts->filename, "-f/--file");
/* --dbname and --restrict-key are incompatible */
check_mut_excl_opts(opts->cparams.dbname, "-d/--dbname",
opts->restrict_key, "--restrict-key");
if (opts->cparams.dbname) if (opts->cparams.dbname)
{
if (opts->filename)
{
pg_log_error("options %s and %s cannot be used together",
"-d/--dbname", "-f/--file");
pg_log_error_hint("Try \"%s --help\" for more information.", progname);
exit_nicely(1);
}
if (opts->restrict_key)
pg_fatal("options %s and %s cannot be used together",
"-d/--dbname", "--restrict-key");
opts->useDB = 1; opts->useDB = 1;
}
else else
{ {
/* /*
@ -423,85 +412,54 @@ main(int argc, char **argv)
pg_fatal("invalid restrict key"); pg_fatal("invalid restrict key");
} }
/* reject conflicting "-only" options */ /* *-only options are incompatible with each other */
if (data_only && schema_only) check_mut_excl_opts(data_only, "-a/--data-only",
pg_fatal("options %s and %s cannot be used together", globals_only, "-g/--globals-only",
"-s/--schema-only", "-a/--data-only"); schema_only, "-s/--schema-only",
if (schema_only && statistics_only) statistics_only, "--statistics-only");
pg_fatal("options %s and %s cannot be used together",
"-s/--schema-only", "--statistics-only");
if (data_only && statistics_only)
pg_fatal("options %s and %s cannot be used together",
"-a/--data-only", "--statistics-only");
/* reject conflicting "-only" and "no-" options */ /* --no-* and *-only for same thing are incompatible */
if (data_only && no_data) check_mut_excl_opts(data_only, "-a/--data-only",
pg_fatal("options %s and %s cannot be used together", no_data, "--no-data");
"-a/--data-only", "--no-data"); check_mut_excl_opts(globals_only, "-g/--globals-only",
if (schema_only && no_schema) no_globals, "--no-globals");
pg_fatal("options %s and %s cannot be used together", check_mut_excl_opts(schema_only, "-s/--schema-only",
"-s/--schema-only", "--no-schema"); no_schema, "--no-schema");
if (statistics_only && no_statistics) check_mut_excl_opts(statistics_only, "--statistics-only",
pg_fatal("options %s and %s cannot be used together", no_statistics, "--no-statistics");
"--statistics-only", "--no-statistics");
/* reject conflicting "no-" options */ /* --statistics and --no-statistics are incompatible */
if (with_statistics && no_statistics) check_mut_excl_opts(with_statistics, "--statistics",
pg_fatal("options %s and %s cannot be used together", no_statistics, "--no-statistics");
"--statistics", "--no-statistics");
/* reject conflicting "only-" options */ /* --statistics is incompatible with *-only (except --statistics-only) */
if (data_only && with_statistics) check_mut_excl_opts(with_statistics, "--statistics",
pg_fatal("options %s and %s cannot be used together", data_only, "-a/--data-only",
"-a/--data-only", "--statistics"); globals_only, "-g/--globals-only",
if (schema_only && with_statistics) schema_only, "-s/--schema-only");
pg_fatal("options %s and %s cannot be used together",
"-s/--schema-only", "--statistics");
if (data_only && opts->dropSchema) /* --clean and --data-only are incompatible */
pg_fatal("options %s and %s cannot be used together", check_mut_excl_opts(opts->dropSchema, "-c/--clean",
"-c/--clean", "-a/--data-only"); data_only, "-a/--data-only");
if (opts->single_txn && opts->txn_size > 0) /*
pg_fatal("options %s and %s cannot be used together", * --globals-only, --single-transaction, and --transaction-size are
"-1/--single-transaction", "--transaction-size"); * incompatible.
*/
check_mut_excl_opts(globals_only, "-g/--globals-only",
opts->single_txn, "-1/--single-transaction",
opts->txn_size, "--transaction-size");
if (opts->single_txn && globals_only) /* --exit-on-error and --globals-only are incompatible */
pg_fatal("options %s and %s cannot be used together when restoring an archive created by pg_dumpall", check_mut_excl_opts(opts->exit_on_error, "--exit-on-error",
"--single-transaction", "-g/--globals-only"); globals_only, "-g/--globals-only");
if (opts->txn_size && globals_only)
pg_fatal("options %s and %s cannot be used together when restoring an archive created by pg_dumpall",
"--transaction-size", "-g/--globals-only");
if (opts->exit_on_error && globals_only)
pg_fatal("options %s and %s cannot be used together when restoring an archive created by pg_dumpall",
"--exit-on-error", "-g/--globals-only");
if (data_only && globals_only)
pg_fatal("options %s and %s cannot be used together",
"-a/--data-only", "-g/--globals-only");
if (schema_only && globals_only)
pg_fatal("options %s and %s cannot be used together",
"-s/--schema-only", "-g/--globals-only");
if (statistics_only && globals_only)
pg_fatal("options %s and %s cannot be used together",
"--statistics-only", "-g/--globals-only");
if (with_statistics && globals_only)
pg_fatal("options %s and %s cannot be used together",
"--statistics", "-g/--globals-only");
if (no_globals && globals_only)
pg_fatal("options %s and %s cannot be used together",
"--no-globals", "-g/--globals-only");
/* /*
* -C is not compatible with -1, because we can't create a database inside * -C is not compatible with -1, because we can't create a database inside
* a transaction block. * a transaction block.
*/ */
if (opts->createDB && opts->single_txn) check_mut_excl_opts(opts->createDB, "-C/--create",
pg_fatal("options %s and %s cannot be used together", opts->single_txn, "-1/--single-transaction");
"-C/--create", "-1/--single-transaction");
/* Can't do single-txn mode with multiple connections */ /* Can't do single-txn mode with multiple connections */
if (opts->single_txn && numWorkers > 1) if (opts->single_txn && numWorkers > 1)

View file

@ -46,8 +46,8 @@ command_fails_like(
command_fails_like( command_fails_like(
[ 'pg_dump', '-s', '-a' ], [ 'pg_dump', '-s', '-a' ],
qr/\Qpg_dump: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/, qr/\Qpg_dump: error: options -a\/--data-only and -s\/--schema-only cannot be used together\E/,
'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together' 'pg_dump: options -a/--data-only and -s/--schema-only cannot be used together'
); );
command_fails_like( command_fails_like(
@ -64,8 +64,8 @@ command_fails_like(
command_fails_like( command_fails_like(
[ 'pg_dump', '-s', '--include-foreign-data=xxx' ], [ 'pg_dump', '-s', '--include-foreign-data=xxx' ],
qr/\Qpg_dump: error: options -s\/--schema-only and --include-foreign-data cannot be used together\E/, qr/\Qpg_dump: error: options --include-foreign-data and -s\/--schema-only cannot be used together\E/,
'pg_dump: options -s/--schema-only and --include-foreign-data cannot be used together' 'pg_dump: options --include-foreign-data and -s/--schema-only cannot be used together'
); );
command_fails_like( command_fails_like(
@ -87,8 +87,8 @@ command_fails_like(
command_fails_like( command_fails_like(
[ 'pg_restore', '-s', '-a', '-f -' ], [ 'pg_restore', '-s', '-a', '-f -' ],
qr/\Qpg_restore: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/, qr/\Qpg_restore: error: options -a\/--data-only and -s\/--schema-only cannot be used together\E/,
'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together' 'pg_restore: options -a/--data-only and -s/--schema-only cannot be used together'
); );
command_fails_like( command_fails_like(
@ -300,8 +300,8 @@ command_fails_like(
command_fails_like( command_fails_like(
[ 'pg_restore', '--exclude-database=foo', '--globals-only', '-d', 'xxx' ], [ 'pg_restore', '--exclude-database=foo', '--globals-only', '-d', 'xxx' ],
qr/\Qpg_restore: error: option --exclude-database cannot be used together with -g\/--globals-only\E/, qr/\Qpg_restore: error: options --exclude-database and -g\/--globals-only cannot be used together\E/,
'pg_restore: option --exclude-database cannot be used together with -g/--globals-only' 'pg_restore: options --exclude-database and -g/--globals-only cannot be used together'
); );
command_fails_like( command_fails_like(
@ -312,14 +312,14 @@ command_fails_like(
command_fails_like( command_fails_like(
[ 'pg_restore', '--schema-only', '--globals-only', '-d', 'xxx' ], [ 'pg_restore', '--schema-only', '--globals-only', '-d', 'xxx' ],
qr/\Qpg_restore: error: options -s\/--schema-only and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and -s\/--schema-only cannot be used together\E/,
'pg_restore: error: options -s/--schema-only and -g/--globals-only cannot be used together' 'pg_restore: error: options -g/--globals-only and -s/--schema-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_restore', '--statistics-only', '--globals-only', '-d', 'xxx' ], [ 'pg_restore', '--statistics-only', '--globals-only', '-d', 'xxx' ],
qr/\Qpg_restore: error: options --statistics-only and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and --statistics-only cannot be used together\E/,
'pg_restore: error: options --statistics-only and -g/--globals-only cannot be used together' 'pg_restore: error: options -g/--globals-only and --statistics-only cannot be used together'
); );
command_fails_like( command_fails_like(
@ -339,6 +339,6 @@ command_fails_like(
'pg_restore', '--globals-only', '--no-globals', '-d', 'xxx', 'pg_restore', '--globals-only', '--no-globals', '-d', 'xxx',
'dumpdir' 'dumpdir'
], ],
qr/\Qpg_restore: error: options --no-globals and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and --no-globals cannot be used together\E/,
'options --no-globals and --globals-only cannot be used together'); 'options --no-globals and --globals-only cannot be used together');
done_testing(); done_testing();

View file

@ -5077,8 +5077,8 @@ command_fails_like(
'--schema-only', '--schema-only',
'--statistics', '--statistics',
], ],
qr/\Qpg_dump: error: options -s\/--schema-only and --statistics cannot be used together\E/, qr/\Qpg_dump: error: options --statistics and -s\/--schema-only cannot be used together\E/,
'cannot use --schema-only and --statistics together'); 'cannot use --statistics and --schema-only together');
command_fails_like( command_fails_like(
[ [

View file

@ -520,7 +520,7 @@ $node->command_fails_like(
'--schema-only', '--schema-only',
'--file' => "$tempdir/error_test.sql", '--file' => "$tempdir/error_test.sql",
], ],
qr/\Qpg_restore: error: options -s\/--schema-only and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and -s\/--schema-only cannot be used together\E/,
'When --globals-only and --schema-only are used together'); 'When --globals-only and --schema-only are used together');
# report an error when --globals-only and --statistics-only are used together # report an error when --globals-only and --statistics-only are used together
@ -533,7 +533,7 @@ $node->command_fails_like(
'--statistics-only', '--statistics-only',
'--file' => "$tempdir/error_test.sql", '--file' => "$tempdir/error_test.sql",
], ],
qr/\Qpg_restore: error: options --statistics-only and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and --statistics-only cannot be used together\E/,
'When --globals-only and --statistics-only are used together'); 'When --globals-only and --statistics-only are used together');
# report an error when --globals-only and --statistics are used together # report an error when --globals-only and --statistics are used together
@ -572,7 +572,7 @@ $node->command_fails_like(
'--single-transaction', '--single-transaction',
'--file' => "$tempdir/error_test.sql", '--file' => "$tempdir/error_test.sql",
], ],
qr/\Qpg_restore: error: options --single-transaction and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and -1\/--single-transaction cannot be used together\E/,
'When --globals-only and --single-transaction are used together'); 'When --globals-only and --single-transaction are used together');
# report an error when --globals-only and --transaction-size are used together # report an error when --globals-only and --transaction-size are used together
@ -585,7 +585,7 @@ $node->command_fails_like(
'--transaction-size' => '100', '--transaction-size' => '100',
'--file' => "$tempdir/error_test.sql", '--file' => "$tempdir/error_test.sql",
], ],
qr/\Qpg_restore: error: options --transaction-size and -g\/--globals-only cannot be used together\E/, qr/\Qpg_restore: error: options -g\/--globals-only and --transaction-size cannot be used together\E/,
'When --globals-only and --transaction-size are used together'); 'When --globals-only and --transaction-size are used together');
# verify map.dat preamble exists # verify map.dat preamble exists