230 lines
8.5 KiB
Perl
230 lines
8.5 KiB
Perl
|
|
# Copyright (c) 2021-2023, PostgreSQL Global Development Group
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use PostgreSQL::Test::Cluster;
|
|
use PostgreSQL::Test::Utils;
|
|
use Test::More;
|
|
|
|
my $tempdir = PostgreSQL::Test::Utils::tempdir;
|
|
|
|
#########################################
|
|
# Basic checks
|
|
|
|
program_help_ok('pg_dump');
|
|
program_version_ok('pg_dump');
|
|
program_options_handling_ok('pg_dump');
|
|
|
|
program_help_ok('pg_restore');
|
|
program_version_ok('pg_restore');
|
|
program_options_handling_ok('pg_restore');
|
|
|
|
program_help_ok('pg_dumpall');
|
|
program_version_ok('pg_dumpall');
|
|
program_options_handling_ok('pg_dumpall');
|
|
|
|
#########################################
|
|
# Test various invalid options and disallowed combinations
|
|
# Doesn't require a PG instance to be set up, so do this first.
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', 'qqq', 'abc' ],
|
|
qr/\Qpg_dump: error: too many command-line arguments (first is "abc")\E/,
|
|
'pg_dump: too many command-line arguments');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', 'qqq', 'abc' ],
|
|
qr/\Qpg_restore: error: too many command-line arguments (first is "abc")\E/,
|
|
'pg_restore: too many command-line arguments');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dumpall', 'qqq', 'abc' ],
|
|
qr/\Qpg_dumpall: error: too many command-line arguments (first is "qqq")\E/,
|
|
'pg_dumpall: too many command-line arguments');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-s', '-a' ],
|
|
qr/\Qpg_dump: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
|
|
'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-s', '--include-foreign-data=xxx' ],
|
|
qr/\Qpg_dump: error: options -s\/--schema-only and --include-foreign-data cannot be used together\E/,
|
|
'pg_dump: options -s/--schema-only and --include-foreign-data cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-j2', '--include-foreign-data=xxx' ],
|
|
qr/\Qpg_dump: error: option --include-foreign-data is not supported with parallel backup\E/,
|
|
'pg_dump: option --include-foreign-data is not supported with parallel backup'
|
|
);
|
|
|
|
command_fails_like(
|
|
['pg_restore'],
|
|
qr{\Qpg_restore: error: one of -d/--dbname and -f/--file must be specified\E},
|
|
'pg_restore: error: one of -d/--dbname and -f/--file must be specified');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '-s', '-a', '-f -' ],
|
|
qr/\Qpg_restore: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
|
|
'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '-d', 'xxx', '-f', 'xxx' ],
|
|
qr/\Qpg_restore: error: options -d\/--dbname and -f\/--file cannot be used together\E/,
|
|
'pg_restore: options -d/--dbname and -f/--file cannot be used together');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-c', '-a' ],
|
|
qr/\Qpg_dump: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
|
|
'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '-c', '-a', '-f -' ],
|
|
qr/\Qpg_restore: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
|
|
'pg_restore: options -c/--clean and -a/--data-only cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--if-exists' ],
|
|
qr/\Qpg_dump: error: option --if-exists requires option -c\/--clean\E/,
|
|
'pg_dump: option --if-exists requires option -c/--clean');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-j3' ],
|
|
qr/\Qpg_dump: error: parallel backup only supported by the directory format\E/,
|
|
'pg_dump: parallel backup only supported by the directory format');
|
|
|
|
# Note the trailing whitespace for the value of --jobs, that is valid.
|
|
command_fails_like(
|
|
[ 'pg_dump', '-j', '-1 ' ],
|
|
qr/\Qpg_dump: error: -j\/--jobs must be in range\E/,
|
|
'pg_dump: -j/--jobs must be in range');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-F', 'garbage' ],
|
|
qr/\Qpg_dump: error: invalid output format\E/,
|
|
'pg_dump: invalid output format');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '-j', '-1', '-f -' ],
|
|
qr/\Qpg_restore: error: -j\/--jobs must be in range\E/,
|
|
'pg_restore: -j/--jobs must be in range');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '--single-transaction', '-j3', '-f -' ],
|
|
qr/\Qpg_restore: error: cannot specify both --single-transaction and multiple jobs\E/,
|
|
'pg_restore: cannot specify both --single-transaction and multiple jobs');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--compress', 'garbage' ],
|
|
qr/\Qpg_dump: error: unrecognized compression algorithm/,
|
|
'pg_dump: invalid --compress');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--compress', 'none:1' ],
|
|
qr/\Qpg_dump: error: invalid compression specification: compression algorithm "none" does not accept a compression level\E/,
|
|
'pg_dump: invalid compression specification: compression algorithm "none" does not accept a compression level'
|
|
);
|
|
|
|
|
|
if (check_pg_config("#define HAVE_LIBZ 1"))
|
|
{
|
|
command_fails_like(
|
|
[ 'pg_dump', '-Z', '15' ],
|
|
qr/\Qpg_dump: error: invalid compression specification: compression algorithm "gzip" expects a compression level between 1 and 9 (default at -1)\E/,
|
|
'pg_dump: invalid compression specification: must be in range');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--compress', '1', '--format', 'tar' ],
|
|
qr/\Qpg_dump: error: compression is not supported by tar archive format\E/,
|
|
'pg_dump: compression is not supported by tar archive format');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-Z', 'gzip:nonInt' ],
|
|
qr/\Qpg_dump: error: invalid compression specification: unrecognized compression option: "nonInt"\E/,
|
|
'pg_dump: invalid compression specification: must be an integer');
|
|
}
|
|
else
|
|
{
|
|
# --jobs > 1 forces an error with tar format.
|
|
command_fails_like(
|
|
[ 'pg_dump', '--format', 'tar', '-j3' ],
|
|
qr/\Qpg_dump: error: parallel backup only supported by the directory format\E/,
|
|
'pg_dump: warning: parallel backup not supported by tar format');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '-Z', 'gzip:nonInt', '--format', 'tar', '-j2' ],
|
|
qr/\Qpg_dump: error: invalid compression specification: unrecognized compression option\E/,
|
|
'pg_dump: invalid compression specification: must be an integer');
|
|
}
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--extra-float-digits', '-16' ],
|
|
qr/\Qpg_dump: error: --extra-float-digits must be in range\E/,
|
|
'pg_dump: --extra-float-digits must be in range');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--rows-per-insert', '0' ],
|
|
qr/\Qpg_dump: error: --rows-per-insert must be in range\E/,
|
|
'pg_dump: --rows-per-insert must be in range');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '--if-exists', '-f -' ],
|
|
qr/\Qpg_restore: error: option --if-exists requires option -c\/--clean\E/,
|
|
'pg_restore: option --if-exists requires option -c/--clean');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '-f -', '-F', 'garbage' ],
|
|
qr/\Qpg_restore: error: unrecognized archive format "garbage";\E/,
|
|
'pg_dump: unrecognized archive format');
|
|
|
|
command_fails_like(
|
|
[ 'pg_dump', '--on-conflict-do-nothing' ],
|
|
qr/pg_dump: error: option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts/,
|
|
'pg_dump: --on-conflict-do-nothing requires --inserts, --rows-per-insert, --column-inserts'
|
|
);
|
|
|
|
# pg_dumpall command-line argument checks
|
|
command_fails_like(
|
|
[ 'pg_dumpall', '-g', '-r' ],
|
|
qr/\Qpg_dumpall: error: options -g\/--globals-only and -r\/--roles-only cannot be used together\E/,
|
|
'pg_dumpall: options -g/--globals-only and -r/--roles-only cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_dumpall', '-g', '-t' ],
|
|
qr/\Qpg_dumpall: error: options -g\/--globals-only and -t\/--tablespaces-only cannot be used together\E/,
|
|
'pg_dumpall: options -g/--globals-only and -t/--tablespaces-only cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_dumpall', '-r', '-t' ],
|
|
qr/\Qpg_dumpall: error: options -r\/--roles-only and -t\/--tablespaces-only cannot be used together\E/,
|
|
'pg_dumpall: options -r/--roles-only and -t/--tablespaces-only cannot be used together'
|
|
);
|
|
|
|
command_fails_like(
|
|
[ 'pg_dumpall', '--if-exists' ],
|
|
qr/\Qpg_dumpall: error: option --if-exists requires option -c\/--clean\E/,
|
|
'pg_dumpall: option --if-exists requires option -c/--clean');
|
|
|
|
command_fails_like(
|
|
[ 'pg_restore', '-C', '-1', '-f -' ],
|
|
qr/\Qpg_restore: error: options -C\/--create and -1\/--single-transaction cannot be used together\E/,
|
|
'pg_restore: options -C\/--create and -1\/--single-transaction cannot be used together'
|
|
);
|
|
|
|
# also fails for -r and -t, but it seems pointless to add more tests for those.
|
|
command_fails_like(
|
|
[ 'pg_dumpall', '--exclude-database=foo', '--globals-only' ],
|
|
qr/\Qpg_dumpall: error: option --exclude-database cannot be used together with -g\/--globals-only\E/,
|
|
'pg_dumpall: option --exclude-database cannot be used together with -g/--globals-only'
|
|
);
|
|
|
|
done_testing();
|