mirror of https://github.com/postgres/postgres
Finish pgindent run for 9.6: Perl files.
This commit is contained in:
parent
b098abf905
commit
3be0a62ffe
|
@ -16,7 +16,7 @@ sub test_index_replay
|
||||||
# Wait for standby to catch up
|
# Wait for standby to catch up
|
||||||
my $applname = $node_standby->name;
|
my $applname = $node_standby->name;
|
||||||
my $caughtup_query =
|
my $caughtup_query =
|
||||||
"SELECT pg_current_xlog_location() <= write_location FROM pg_stat_replication WHERE application_name = '$applname';";
|
"SELECT pg_current_xlog_location() <= write_location FROM pg_stat_replication WHERE application_name = '$applname';";
|
||||||
$node_master->poll_query_until('postgres', $caughtup_query)
|
$node_master->poll_query_until('postgres', $caughtup_query)
|
||||||
or die "Timed out while waiting for standby 1 to catch up";
|
or die "Timed out while waiting for standby 1 to catch up";
|
||||||
|
|
||||||
|
@ -56,20 +56,25 @@ $node_standby->start;
|
||||||
# Create some bloom index on master
|
# Create some bloom index on master
|
||||||
$node_master->psql("postgres", "CREATE EXTENSION bloom;");
|
$node_master->psql("postgres", "CREATE EXTENSION bloom;");
|
||||||
$node_master->psql("postgres", "CREATE TABLE tst (i int4, t text);");
|
$node_master->psql("postgres", "CREATE TABLE tst (i int4, t text);");
|
||||||
$node_master->psql("postgres", "INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,100000) i;");
|
$node_master->psql("postgres",
|
||||||
$node_master->psql("postgres", "CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);");
|
"INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,100000) i;"
|
||||||
|
);
|
||||||
|
$node_master->psql("postgres",
|
||||||
|
"CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);");
|
||||||
|
|
||||||
# Test that queries give same result
|
# Test that queries give same result
|
||||||
test_index_replay('initial');
|
test_index_replay('initial');
|
||||||
|
|
||||||
# Run 10 cycles of table modification. Run test queries after each modification.
|
# Run 10 cycles of table modification. Run test queries after each modification.
|
||||||
for my $i (1..10)
|
for my $i (1 .. 10)
|
||||||
{
|
{
|
||||||
$node_master->psql("postgres", "DELETE FROM tst WHERE i = $i;");
|
$node_master->psql("postgres", "DELETE FROM tst WHERE i = $i;");
|
||||||
test_index_replay("delete $i");
|
test_index_replay("delete $i");
|
||||||
$node_master->psql("postgres", "VACUUM tst;");
|
$node_master->psql("postgres", "VACUUM tst;");
|
||||||
test_index_replay("vacuum $i");
|
test_index_replay("vacuum $i");
|
||||||
my ($start, $end) = (100001 + ($i - 1) * 10000, 100000 + $i * 10000);
|
my ($start, $end) = (100001 + ($i - 1) * 10000, 100000 + $i * 10000);
|
||||||
$node_master->psql("postgres", "INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series($start,$end) i;");
|
$node_master->psql("postgres",
|
||||||
|
"INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series($start,$end) i;"
|
||||||
|
);
|
||||||
test_index_replay("insert $i");
|
test_index_replay("insert $i");
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ use warnings;
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
my $lastlockidx = -1;
|
my $lastlockidx = -1;
|
||||||
my $continue = "\n";
|
my $continue = "\n";
|
||||||
|
|
||||||
open my $lwlocknames, $ARGV[0] or die;
|
open my $lwlocknames, $ARGV[0] or die;
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ open H, '>', $htmp or die "Could not open $htmp: $!";
|
||||||
open C, '>', $ctmp or die "Could not open $ctmp: $!";
|
open C, '>', $ctmp or die "Could not open $ctmp: $!";
|
||||||
|
|
||||||
my $autogen =
|
my $autogen =
|
||||||
"/* autogenerated from src/backend/storage/lmgr/lwlocknames.txt, do not edit */\n";
|
"/* autogenerated from src/backend/storage/lmgr/lwlocknames.txt, do not edit */\n";
|
||||||
print H $autogen;
|
print H $autogen;
|
||||||
print H "/* there is deliberately not an #ifndef LWLOCKNAMES_H here */\n\n";
|
print H "/* there is deliberately not an #ifndef LWLOCKNAMES_H here */\n\n";
|
||||||
print C $autogen, "\n";
|
print C $autogen, "\n";
|
||||||
|
@ -38,7 +38,7 @@ while (<$lwlocknames>)
|
||||||
|
|
||||||
(my $lockname, my $lockidx) = ($1, $2);
|
(my $lockname, my $lockidx) = ($1, $2);
|
||||||
|
|
||||||
die "lwlocknames.txt not in order" if $lockidx < $lastlockidx;
|
die "lwlocknames.txt not in order" if $lockidx < $lastlockidx;
|
||||||
die "lwlocknames.txt has duplicates" if $lockidx == $lastlockidx;
|
die "lwlocknames.txt has duplicates" if $lockidx == $lastlockidx;
|
||||||
|
|
||||||
while ($lastlockidx < $lockidx - 1)
|
while ($lastlockidx < $lockidx - 1)
|
||||||
|
@ -49,7 +49,7 @@ while (<$lwlocknames>)
|
||||||
}
|
}
|
||||||
printf C "%s \"%s\"", $continue, $lockname;
|
printf C "%s \"%s\"", $continue, $lockname;
|
||||||
$lastlockidx = $lockidx;
|
$lastlockidx = $lockidx;
|
||||||
$continue = ",\n";
|
$continue = ",\n";
|
||||||
|
|
||||||
print H "#define $lockname (&MainLWLockArray[$lockidx].lock)\n";
|
print H "#define $lockname (&MainLWLockArray[$lockidx].lock)\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,6 +224,7 @@ sub printQ()
|
||||||
{
|
{
|
||||||
if (ref($q))
|
if (ref($q))
|
||||||
{
|
{
|
||||||
|
|
||||||
# flush open w files so that reading this file gets it all
|
# flush open w files so that reading this file gets it all
|
||||||
if (exists($wFiles{$$q}) && $wFiles{$$q} ne '')
|
if (exists($wFiles{$$q}) && $wFiles{$$q} ne '')
|
||||||
{
|
{
|
||||||
|
|
|
@ -54,8 +54,8 @@ while (<FILE>)
|
||||||
|| ( ($code >= 0x879a)
|
|| ( ($code >= 0x879a)
|
||||||
&& ($code <= 0x879c)))
|
&& ($code <= 0x879c)))
|
||||||
{
|
{
|
||||||
printf STDERR
|
printf STDERR "Warning: duplicate UTF8: UCS=0x%04x SJIS=0x%04x\n",
|
||||||
"Warning: duplicate UTF8: UCS=0x%04x SJIS=0x%04x\n", $ucs,
|
$ucs,
|
||||||
$code;
|
$code;
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,8 @@ SKIP:
|
||||||
mkdir "$tempdir/tblspc1";
|
mkdir "$tempdir/tblspc1";
|
||||||
$node->safe_psql('postgres',
|
$node->safe_psql('postgres',
|
||||||
"CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';");
|
"CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';");
|
||||||
$node->safe_psql('postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;");
|
$node->safe_psql('postgres',
|
||||||
|
"CREATE TABLE test1 (a int) TABLESPACE tblspc1;");
|
||||||
$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ],
|
$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ],
|
||||||
'tar format with tablespaces');
|
'tar format with tablespaces');
|
||||||
ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created');
|
ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created');
|
||||||
|
|
|
@ -23,14 +23,22 @@ program_options_handling_ok('pg_dump');
|
||||||
command_exit_is([ 'pg_dump', 'qqq', 'abc' ],
|
command_exit_is([ 'pg_dump', 'qqq', 'abc' ],
|
||||||
1, 'pg_dump: too many command-line arguments (first is "asd")');
|
1, 'pg_dump: too many command-line arguments (first is "asd")');
|
||||||
|
|
||||||
command_exit_is([ 'pg_dump', '-s', '-a' ],
|
command_exit_is(
|
||||||
1, 'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together');
|
[ 'pg_dump', '-s', '-a' ],
|
||||||
|
1,
|
||||||
|
'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together'
|
||||||
|
);
|
||||||
|
|
||||||
command_exit_is([ 'pg_dump', '-c', '-a' ],
|
command_exit_is(
|
||||||
1, 'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
|
[ 'pg_dump', '-c', '-a' ],
|
||||||
|
1,
|
||||||
|
'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
|
||||||
|
|
||||||
command_exit_is([ 'pg_dump', '--inserts', '-o' ],
|
command_exit_is(
|
||||||
1, 'pg_dump: options --inserts/--column-inserts and -o/--oids cannot be used together');
|
[ 'pg_dump', '--inserts', '-o' ],
|
||||||
|
1,
|
||||||
|
'pg_dump: options --inserts/--column-inserts and -o/--oids cannot be used together'
|
||||||
|
);
|
||||||
|
|
||||||
command_exit_is([ 'pg_dump', '--if-exists' ],
|
command_exit_is([ 'pg_dump', '--if-exists' ],
|
||||||
1, 'pg_dump: option --if-exists requires option -c/--clean');
|
1, 'pg_dump: option --if-exists requires option -c/--clean');
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -114,6 +114,7 @@ sub check_query
|
||||||
|
|
||||||
sub setup_cluster
|
sub setup_cluster
|
||||||
{
|
{
|
||||||
|
|
||||||
# Initialize master, data checksums are mandatory
|
# Initialize master, data checksums are mandatory
|
||||||
$node_master = get_new_node('master');
|
$node_master = get_new_node('master');
|
||||||
$node_master->init(allows_streaming => 1);
|
$node_master->init(allows_streaming => 1);
|
||||||
|
|
|
@ -632,8 +632,8 @@ sub preload_addons
|
||||||
my $filename = $path . "/ecpg.addons";
|
my $filename = $path . "/ecpg.addons";
|
||||||
open(my $fh, '<', $filename) or die;
|
open(my $fh, '<', $filename) or die;
|
||||||
|
|
||||||
# there may be multiple lines starting ECPG: and then multiple lines of code.
|
# there may be multiple lines starting ECPG: and then multiple lines of code.
|
||||||
# the code need to be add to all prior ECPG records.
|
# the code need to be add to all prior ECPG records.
|
||||||
my (@needsRules, @code, $record);
|
my (@needsRules, @code, $record);
|
||||||
|
|
||||||
# there may be comments before the first ECPG line, skip them
|
# there may be comments before the first ECPG line, skip them
|
||||||
|
|
|
@ -13,17 +13,21 @@ $node->append_conf('postgresql.conf', 'track_commit_timestamp = on');
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
# Create a table, compare "now()" to the commit TS of its xmin
|
# Create a table, compare "now()" to the commit TS of its xmin
|
||||||
$node->safe_psql('postgres', 'create table t as select now from (select now(), pg_sleep(1)) f');
|
$node->safe_psql('postgres',
|
||||||
|
'create table t as select now from (select now(), pg_sleep(1)) f');
|
||||||
my $true = $node->safe_psql('postgres',
|
my $true = $node->safe_psql('postgres',
|
||||||
'select t.now - ts.* < \'1s\' from t, pg_class c, pg_xact_commit_timestamp(c.xmin) ts where relname = \'t\'');
|
'select t.now - ts.* < \'1s\' from t, pg_class c, pg_xact_commit_timestamp(c.xmin) ts where relname = \'t\''
|
||||||
|
);
|
||||||
is($true, 't', 'commit TS is set');
|
is($true, 't', 'commit TS is set');
|
||||||
my $ts = $node->safe_psql('postgres',
|
my $ts = $node->safe_psql('postgres',
|
||||||
'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t\'');
|
'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t\''
|
||||||
|
);
|
||||||
|
|
||||||
# Verify that we read the same TS after crash recovery
|
# Verify that we read the same TS after crash recovery
|
||||||
$node->stop('immediate');
|
$node->stop('immediate');
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
my $recovered_ts = $node->safe_psql('postgres',
|
my $recovered_ts = $node->safe_psql('postgres',
|
||||||
'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t\'');
|
'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t\''
|
||||||
|
);
|
||||||
is($recovered_ts, $ts, 'commit TS remains after crash recovery');
|
is($recovered_ts, $ts, 'commit TS remains after crash recovery');
|
||||||
|
|
|
@ -8,10 +8,11 @@ use Test::More tests => 4;
|
||||||
use PostgresNode;
|
use PostgresNode;
|
||||||
|
|
||||||
my $bkplabel = 'backup';
|
my $bkplabel = 'backup';
|
||||||
my $master = get_new_node('master');
|
my $master = get_new_node('master');
|
||||||
$master->init(allows_streaming => 1);
|
$master->init(allows_streaming => 1);
|
||||||
|
|
||||||
$master->append_conf('postgresql.conf', qq{
|
$master->append_conf(
|
||||||
|
'postgresql.conf', qq{
|
||||||
track_commit_timestamp = on
|
track_commit_timestamp = on
|
||||||
max_wal_senders = 5
|
max_wal_senders = 5
|
||||||
wal_level = hot_standby
|
wal_level = hot_standby
|
||||||
|
@ -28,30 +29,37 @@ for my $i (1 .. 10)
|
||||||
$master->safe_psql('postgres', "create table t$i()");
|
$master->safe_psql('postgres', "create table t$i()");
|
||||||
}
|
}
|
||||||
my $master_ts = $master->safe_psql('postgres',
|
my $master_ts = $master->safe_psql('postgres',
|
||||||
qq{SELECT ts.* FROM pg_class, pg_xact_commit_timestamp(xmin) AS ts WHERE relname = 't10'});
|
qq{SELECT ts.* FROM pg_class, pg_xact_commit_timestamp(xmin) AS ts WHERE relname = 't10'}
|
||||||
my $master_lsn = $master->safe_psql('postgres',
|
);
|
||||||
'select pg_current_xlog_location()');
|
my $master_lsn =
|
||||||
|
$master->safe_psql('postgres', 'select pg_current_xlog_location()');
|
||||||
$standby->poll_query_until('postgres',
|
$standby->poll_query_until('postgres',
|
||||||
qq{SELECT '$master_lsn'::pg_lsn <= pg_last_xlog_replay_location()})
|
qq{SELECT '$master_lsn'::pg_lsn <= pg_last_xlog_replay_location()})
|
||||||
or die "slave never caught up";
|
or die "slave never caught up";
|
||||||
|
|
||||||
my $standby_ts = $standby->safe_psql('postgres',
|
my $standby_ts = $standby->safe_psql('postgres',
|
||||||
qq{select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = 't10'});
|
qq{select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = 't10'}
|
||||||
|
);
|
||||||
is($master_ts, $standby_ts, "standby gives same value as master");
|
is($master_ts, $standby_ts, "standby gives same value as master");
|
||||||
|
|
||||||
$master->append_conf('postgresql.conf', 'track_commit_timestamp = off');
|
$master->append_conf('postgresql.conf', 'track_commit_timestamp = off');
|
||||||
$master->restart;
|
$master->restart;
|
||||||
$master->safe_psql('postgres', 'checkpoint');
|
$master->safe_psql('postgres', 'checkpoint');
|
||||||
$master_lsn = $master->safe_psql('postgres',
|
$master_lsn =
|
||||||
'select pg_current_xlog_location()');
|
$master->safe_psql('postgres', 'select pg_current_xlog_location()');
|
||||||
$standby->poll_query_until('postgres',
|
$standby->poll_query_until('postgres',
|
||||||
qq{SELECT '$master_lsn'::pg_lsn <= pg_last_xlog_replay_location()})
|
qq{SELECT '$master_lsn'::pg_lsn <= pg_last_xlog_replay_location()})
|
||||||
or die "slave never caught up";
|
or die "slave never caught up";
|
||||||
$standby->safe_psql('postgres', 'checkpoint');
|
$standby->safe_psql('postgres', 'checkpoint');
|
||||||
|
|
||||||
# This one should raise an error now
|
# This one should raise an error now
|
||||||
my ($ret, $standby_ts_stdout, $standby_ts_stderr) = $standby->psql('postgres',
|
my ($ret, $standby_ts_stdout, $standby_ts_stderr) = $standby->psql('postgres',
|
||||||
'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t10\'');
|
'select ts.* from pg_class, pg_xact_commit_timestamp(xmin) ts where relname = \'t10\''
|
||||||
|
);
|
||||||
is($ret, 3, 'standby errors when master turned feature off');
|
is($ret, 3, 'standby errors when master turned feature off');
|
||||||
is($standby_ts_stdout, '', "standby gives no value when master turned feature off");
|
is($standby_ts_stdout, '',
|
||||||
like($standby_ts_stderr, qr/could not get commit timestamp data/, 'expected error when master turned feature off');
|
"standby gives no value when master turned feature off");
|
||||||
|
like(
|
||||||
|
$standby_ts_stderr,
|
||||||
|
qr/could not get commit timestamp data/,
|
||||||
|
'expected error when master turned feature off');
|
||||||
|
|
|
@ -8,9 +8,10 @@ use Test::More tests => 4;
|
||||||
use PostgresNode;
|
use PostgresNode;
|
||||||
|
|
||||||
my $bkplabel = 'backup';
|
my $bkplabel = 'backup';
|
||||||
my $master = get_new_node('master');
|
my $master = get_new_node('master');
|
||||||
$master->init(allows_streaming => 1);
|
$master->init(allows_streaming => 1);
|
||||||
$master->append_conf('postgresql.conf', qq{
|
$master->append_conf(
|
||||||
|
'postgresql.conf', qq{
|
||||||
track_commit_timestamp = on
|
track_commit_timestamp = on
|
||||||
max_wal_senders = 5
|
max_wal_senders = 5
|
||||||
wal_level = hot_standby
|
wal_level = hot_standby
|
||||||
|
@ -29,20 +30,25 @@ for my $i (1 .. 10)
|
||||||
$master->append_conf('postgresql.conf', 'track_commit_timestamp = off');
|
$master->append_conf('postgresql.conf', 'track_commit_timestamp = off');
|
||||||
$master->restart;
|
$master->restart;
|
||||||
$master->safe_psql('postgres', 'checkpoint');
|
$master->safe_psql('postgres', 'checkpoint');
|
||||||
my $master_lsn = $master->safe_psql('postgres',
|
my $master_lsn =
|
||||||
'select pg_current_xlog_location()');
|
$master->safe_psql('postgres', 'select pg_current_xlog_location()');
|
||||||
$standby->poll_query_until('postgres',
|
$standby->poll_query_until('postgres',
|
||||||
qq{SELECT '$master_lsn'::pg_lsn <= pg_last_xlog_replay_location()})
|
qq{SELECT '$master_lsn'::pg_lsn <= pg_last_xlog_replay_location()})
|
||||||
or die "slave never caught up";
|
or die "slave never caught up";
|
||||||
|
|
||||||
$standby->safe_psql('postgres', 'checkpoint');
|
$standby->safe_psql('postgres', 'checkpoint');
|
||||||
$standby->restart;
|
$standby->restart;
|
||||||
|
|
||||||
my ($psql_ret, $standby_ts_stdout, $standby_ts_stderr) = $standby->psql('postgres',
|
my ($psql_ret, $standby_ts_stdout, $standby_ts_stderr) = $standby->psql(
|
||||||
qq{SELECT ts.* FROM pg_class, pg_xact_commit_timestamp(xmin) AS ts WHERE relname = 't10'});
|
'postgres',
|
||||||
|
qq{SELECT ts.* FROM pg_class, pg_xact_commit_timestamp(xmin) AS ts WHERE relname = 't10'}
|
||||||
|
);
|
||||||
is($psql_ret, 3, 'expect error when getting commit timestamp after restart');
|
is($psql_ret, 3, 'expect error when getting commit timestamp after restart');
|
||||||
is($standby_ts_stdout, '', "standby does not return a value after restart");
|
is($standby_ts_stdout, '', "standby does not return a value after restart");
|
||||||
like($standby_ts_stderr, qr/could not get commit timestamp data/, 'expected err msg after restart');
|
like(
|
||||||
|
$standby_ts_stderr,
|
||||||
|
qr/could not get commit timestamp data/,
|
||||||
|
'expected err msg after restart');
|
||||||
|
|
||||||
$master->append_conf('postgresql.conf', 'track_commit_timestamp = on');
|
$master->append_conf('postgresql.conf', 'track_commit_timestamp = on');
|
||||||
$master->restart;
|
$master->restart;
|
||||||
|
@ -54,5 +60,7 @@ $standby->poll_query_until('postgres', "SELECT pg_is_in_recovery() <> true");
|
||||||
|
|
||||||
$standby->safe_psql('postgres', "create table t11()");
|
$standby->safe_psql('postgres', "create table t11()");
|
||||||
my $standby_ts = $standby->safe_psql('postgres',
|
my $standby_ts = $standby->safe_psql('postgres',
|
||||||
qq{SELECT ts.* FROM pg_class, pg_xact_commit_timestamp(xmin) AS ts WHERE relname = 't11'});
|
qq{SELECT ts.* FROM pg_class, pg_xact_commit_timestamp(xmin) AS ts WHERE relname = 't11'}
|
||||||
isnt($standby_ts, '', "standby gives valid value ($standby_ts) after promotion");
|
);
|
||||||
|
isnt($standby_ts, '',
|
||||||
|
"standby gives valid value ($standby_ts) after promotion");
|
||||||
|
|
|
@ -45,175 +45,110 @@ my %pgdump_runs = (
|
||||||
'-f', "$tempdir/binary_upgrade.sql",
|
'-f', "$tempdir/binary_upgrade.sql",
|
||||||
'--schema-only',
|
'--schema-only',
|
||||||
'--binary-upgrade',
|
'--binary-upgrade',
|
||||||
'-d', 'postgres', # alternative way to specify database
|
'-d', 'postgres', # alternative way to specify database
|
||||||
],
|
], },
|
||||||
},
|
|
||||||
clean => {
|
clean => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump',
|
||||||
'-f', "$tempdir/clean.sql",
|
'-f', "$tempdir/clean.sql",
|
||||||
'-c',
|
'-c',
|
||||||
'-d', 'postgres', # alternative way to specify database
|
'-d', 'postgres', # alternative way to specify database
|
||||||
],
|
], },
|
||||||
},
|
|
||||||
clean_if_exists => {
|
clean_if_exists => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump',
|
||||||
'-f', "$tempdir/clean_if_exists.sql",
|
'-f', "$tempdir/clean_if_exists.sql",
|
||||||
'-c',
|
'-c',
|
||||||
'--if-exists',
|
'--if-exists',
|
||||||
'-E', 'UTF8', # no-op, just tests that option is accepted
|
'-E', 'UTF8', # no-op, just tests that option is accepted
|
||||||
'postgres',
|
'postgres', ], },
|
||||||
],
|
|
||||||
},
|
|
||||||
column_inserts => {
|
column_inserts => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-f',
|
||||||
'-f', "$tempdir/column_inserts.sql",
|
"$tempdir/column_inserts.sql", '-a',
|
||||||
'-a',
|
'--column-inserts', 'postgres', ], },
|
||||||
'--column-inserts',
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
createdb => {
|
createdb => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump',
|
||||||
'-f', "$tempdir/createdb.sql",
|
'-f', "$tempdir/createdb.sql",
|
||||||
'-C',
|
'-C',
|
||||||
'-R', # no-op, just for testing
|
'-R', # no-op, just for testing
|
||||||
'postgres',
|
'postgres', ], },
|
||||||
],
|
|
||||||
},
|
|
||||||
data_only => {
|
data_only => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump',
|
||||||
'-f', "$tempdir/data_only.sql",
|
'-f', "$tempdir/data_only.sql",
|
||||||
'-a',
|
'-a',
|
||||||
'-v', # no-op, just make sure it works
|
'-v', # no-op, just make sure it works
|
||||||
'postgres',
|
'postgres', ], },
|
||||||
],
|
|
||||||
},
|
|
||||||
defaults => {
|
defaults => {
|
||||||
dump_cmd => [
|
dump_cmd => [ 'pg_dump', '-f', "$tempdir/defaults.sql", 'postgres', ],
|
||||||
'pg_dump',
|
|
||||||
'-f', "$tempdir/defaults.sql",
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
defaults_custom_format => {
|
defaults_custom_format => {
|
||||||
test_key => 'defaults',
|
test_key => 'defaults',
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-Fc', '-Z6', '-f',
|
||||||
'-Fc',
|
"$tempdir/defaults_custom_format.dump", 'postgres', ],
|
||||||
'-Z6',
|
|
||||||
'-f', "$tempdir/defaults_custom_format.dump",
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
restore_cmd => [
|
restore_cmd => [
|
||||||
'pg_restore',
|
'pg_restore',
|
||||||
'-f', "$tempdir/defaults_custom_format.sql",
|
'-f',
|
||||||
"$tempdir/defaults_custom_format.dump",
|
"$tempdir/defaults_custom_format.sql",
|
||||||
],
|
"$tempdir/defaults_custom_format.dump", ], },
|
||||||
},
|
|
||||||
defaults_dir_format => {
|
defaults_dir_format => {
|
||||||
test_key => 'defaults',
|
test_key => 'defaults',
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-Fd', '-f', "$tempdir/defaults_dir_format",
|
||||||
'-Fd',
|
'postgres', ],
|
||||||
'-f', "$tempdir/defaults_dir_format",
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
restore_cmd => [
|
restore_cmd => [
|
||||||
'pg_restore',
|
'pg_restore',
|
||||||
'-f', "$tempdir/defaults_dir_format.sql",
|
'-f',
|
||||||
"$tempdir/defaults_dir_format",
|
"$tempdir/defaults_dir_format.sql",
|
||||||
],
|
"$tempdir/defaults_dir_format", ], },
|
||||||
},
|
|
||||||
defaults_parallel => {
|
defaults_parallel => {
|
||||||
test_key => 'defaults',
|
test_key => 'defaults',
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-Fd', '-j2', '-f', "$tempdir/defaults_parallel",
|
||||||
'-Fd',
|
'postgres', ],
|
||||||
'-j2',
|
|
||||||
'-f', "$tempdir/defaults_parallel",
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
restore_cmd => [
|
restore_cmd => [
|
||||||
'pg_restore',
|
'pg_restore', '-f',
|
||||||
'-f', "$tempdir/defaults_parallel.sql",
|
"$tempdir/defaults_parallel.sql", "$tempdir/defaults_parallel", ],
|
||||||
"$tempdir/defaults_parallel",
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
defaults_tar_format => {
|
defaults_tar_format => {
|
||||||
test_key => 'defaults',
|
test_key => 'defaults',
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-Ft', '-f', "$tempdir/defaults_tar_format.tar",
|
||||||
'-Ft',
|
'postgres', ],
|
||||||
'-f', "$tempdir/defaults_tar_format.tar",
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
restore_cmd => [
|
restore_cmd => [
|
||||||
'pg_restore',
|
'pg_restore',
|
||||||
'-f', "$tempdir/defaults_tar_format.sql",
|
'-f',
|
||||||
"$tempdir/defaults_tar_format.tar",
|
"$tempdir/defaults_tar_format.sql",
|
||||||
],
|
"$tempdir/defaults_tar_format.tar", ], },
|
||||||
},
|
|
||||||
pg_dumpall_globals => {
|
pg_dumpall_globals => {
|
||||||
dump_cmd => [
|
dump_cmd =>
|
||||||
'pg_dumpall',
|
[ 'pg_dumpall', '-f', "$tempdir/pg_dumpall_globals.sql", '-g', ], },
|
||||||
'-f', "$tempdir/pg_dumpall_globals.sql",
|
|
||||||
'-g',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
no_privs => {
|
no_privs => {
|
||||||
dump_cmd => [
|
dump_cmd =>
|
||||||
'pg_dump',
|
[ 'pg_dump', '-f', "$tempdir/no_privs.sql", '-x', 'postgres', ], },
|
||||||
'-f', "$tempdir/no_privs.sql",
|
|
||||||
'-x',
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
no_owner => {
|
no_owner => {
|
||||||
dump_cmd => [
|
dump_cmd =>
|
||||||
'pg_dump',
|
[ 'pg_dump', '-f', "$tempdir/no_owner.sql", '-O', 'postgres', ], },
|
||||||
'-f', "$tempdir/no_owner.sql",
|
|
||||||
'-O',
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
schema_only => {
|
schema_only => {
|
||||||
dump_cmd => [
|
dump_cmd =>
|
||||||
'pg_dump',
|
[ 'pg_dump', '-f', "$tempdir/schema_only.sql", '-s', 'postgres', ],
|
||||||
'-f', "$tempdir/schema_only.sql",
|
|
||||||
'-s',
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
section_pre_data => {
|
section_pre_data => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-f', "$tempdir/section_pre_data.sql",
|
||||||
'-f', "$tempdir/section_pre_data.sql",
|
'--section=pre-data', 'postgres', ], },
|
||||||
'--section=pre-data',
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
section_data => {
|
section_data => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-f',
|
||||||
'-f', "$tempdir/section_data.sql",
|
"$tempdir/section_data.sql", '--section=data',
|
||||||
'--section=data',
|
'postgres', ], },
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
section_post_data => {
|
section_post_data => {
|
||||||
dump_cmd => [
|
dump_cmd => [
|
||||||
'pg_dump',
|
'pg_dump', '-f', "$tempdir/section_post_data.sql",
|
||||||
'-f', "$tempdir/section_post_data.sql",
|
'--section=post-data', 'postgres', ], },);
|
||||||
'--section=post-data',
|
|
||||||
'postgres',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
###############################################################
|
###############################################################
|
||||||
# Definition of the tests to run.
|
# Definition of the tests to run.
|
||||||
|
@ -255,200 +190,167 @@ my %pgdump_runs = (
|
||||||
my %tests = (
|
my %tests = (
|
||||||
'CREATE EXTENSION test_pg_dump' => {
|
'CREATE EXTENSION test_pg_dump' => {
|
||||||
create_order => 2,
|
create_order => 2,
|
||||||
create_sql => 'CREATE EXTENSION test_pg_dump;',
|
create_sql => 'CREATE EXTENSION test_pg_dump;',
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QCREATE EXTENSION IF NOT EXISTS test_pg_dump WITH SCHEMA public;\E
|
\QCREATE EXTENSION IF NOT EXISTS test_pg_dump WITH SCHEMA public;\E
|
||||||
$/xm,
|
$/xm,
|
||||||
like => {
|
like => {
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1, },
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
binary_upgrade => 1,
|
binary_upgrade => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'CREATE ROLE dump_test' => {
|
'CREATE ROLE dump_test' => {
|
||||||
create_order => 1,
|
create_order => 1,
|
||||||
create_sql => 'CREATE ROLE dump_test;',
|
create_sql => 'CREATE ROLE dump_test;',
|
||||||
regexp => qr/^CREATE ROLE dump_test;$/m,
|
regexp => qr/^CREATE ROLE dump_test;$/m,
|
||||||
like => {
|
like => { pg_dumpall_globals => 1, },
|
||||||
pg_dumpall_globals => 1,
|
unlike => {
|
||||||
},
|
binary_upgrade => 1,
|
||||||
unlike => {
|
clean => 1,
|
||||||
binary_upgrade => 1,
|
clean_if_exists => 1,
|
||||||
clean => 1,
|
createdb => 1,
|
||||||
clean_if_exists => 1,
|
defaults => 1,
|
||||||
createdb => 1,
|
no_privs => 1,
|
||||||
defaults => 1,
|
no_owner => 1,
|
||||||
no_privs => 1,
|
schema_only => 1,
|
||||||
no_owner => 1,
|
section_pre_data => 1,
|
||||||
schema_only => 1,
|
section_post_data => 1, }, },
|
||||||
section_pre_data => 1,
|
|
||||||
section_post_data => 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'CREATE TABLE regress_pg_dump_table' => {
|
'CREATE TABLE regress_pg_dump_table' => {
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QCREATE TABLE regress_pg_dump_table (\E
|
\QCREATE TABLE regress_pg_dump_table (\E
|
||||||
\n\s+\Qcol1 integer,\E
|
\n\s+\Qcol1 integer,\E
|
||||||
\n\s+\Qcol2 integer\E
|
\n\s+\Qcol2 integer\E
|
||||||
\n\);$/xm,
|
\n\);$/xm,
|
||||||
like => {
|
like => { binary_upgrade => 1, },
|
||||||
binary_upgrade => 1,
|
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'CREATE ACCESS METHOD regress_test_am' => {
|
'CREATE ACCESS METHOD regress_test_am' => {
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QCREATE ACCESS METHOD regress_test_am TYPE INDEX HANDLER bthandler;\E
|
\QCREATE ACCESS METHOD regress_test_am TYPE INDEX HANDLER bthandler;\E
|
||||||
$/xm,
|
$/xm,
|
||||||
like => {
|
like => { binary_upgrade => 1, },
|
||||||
binary_upgrade => 1,
|
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'COMMENT ON EXTENSION test_pg_dump' => {
|
'COMMENT ON EXTENSION test_pg_dump' => {
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QCOMMENT ON EXTENSION test_pg_dump \E
|
\QCOMMENT ON EXTENSION test_pg_dump \E
|
||||||
\QIS 'Test pg_dump with an extension';\E
|
\QIS 'Test pg_dump with an extension';\E
|
||||||
$/xm,
|
$/xm,
|
||||||
like => {
|
like => {
|
||||||
binary_upgrade => 1,
|
binary_upgrade => 1,
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1, },
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'GRANT SELECT ON TABLE regress_pg_dump_table' => {
|
'GRANT SELECT ON TABLE regress_pg_dump_table' => {
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\E\n
|
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\E\n
|
||||||
\QGRANT SELECT ON TABLE regress_pg_dump_table TO dump_test;\E\n
|
\QGRANT SELECT ON TABLE regress_pg_dump_table TO dump_test;\E\n
|
||||||
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\E
|
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\E
|
||||||
$/xms,
|
$/xms,
|
||||||
like => {
|
like => { binary_upgrade => 1, },
|
||||||
binary_upgrade => 1,
|
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1,
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'GRANT SELECT(col1) ON regress_pg_dump_table' => {
|
'GRANT SELECT(col1) ON regress_pg_dump_table' => {
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\E\n
|
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\E\n
|
||||||
\QGRANT SELECT(col1) ON TABLE regress_pg_dump_table TO PUBLIC;\E\n
|
\QGRANT SELECT(col1) ON TABLE regress_pg_dump_table TO PUBLIC;\E\n
|
||||||
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\E
|
\QSELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\E
|
||||||
$/xms,
|
$/xms,
|
||||||
like => {
|
like => { binary_upgrade => 1, },
|
||||||
binary_upgrade => 1,
|
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1,
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'GRANT SELECT(col2) ON regress_pg_dump_table TO dump_test' => {
|
'GRANT SELECT(col2) ON regress_pg_dump_table TO dump_test' => {
|
||||||
create_order => 4,
|
create_order => 4,
|
||||||
create_sql => 'GRANT SELECT(col2) ON regress_pg_dump_table
|
create_sql => 'GRANT SELECT(col2) ON regress_pg_dump_table
|
||||||
TO dump_test;',
|
TO dump_test;',
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QGRANT SELECT(col2) ON TABLE regress_pg_dump_table TO dump_test;\E
|
\QGRANT SELECT(col2) ON TABLE regress_pg_dump_table TO dump_test;\E
|
||||||
$/xm,
|
$/xm,
|
||||||
like => {
|
like => {
|
||||||
binary_upgrade => 1,
|
binary_upgrade => 1,
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1, },
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },
|
||||||
},
|
|
||||||
},
|
|
||||||
'REVOKE SELECT(col1) ON regress_pg_dump_table' => {
|
'REVOKE SELECT(col1) ON regress_pg_dump_table' => {
|
||||||
create_order => 3,
|
create_order => 3,
|
||||||
create_sql => 'REVOKE SELECT(col1) ON regress_pg_dump_table
|
create_sql => 'REVOKE SELECT(col1) ON regress_pg_dump_table
|
||||||
FROM PUBLIC;',
|
FROM PUBLIC;',
|
||||||
regexp => qr/^
|
regexp => qr/^
|
||||||
\QREVOKE SELECT(col1) ON TABLE regress_pg_dump_table FROM PUBLIC;\E
|
\QREVOKE SELECT(col1) ON TABLE regress_pg_dump_table FROM PUBLIC;\E
|
||||||
$/xm,
|
$/xm,
|
||||||
like => {
|
like => {
|
||||||
binary_upgrade => 1,
|
binary_upgrade => 1,
|
||||||
clean => 1,
|
clean => 1,
|
||||||
clean_if_exists => 1,
|
clean_if_exists => 1,
|
||||||
createdb => 1,
|
createdb => 1,
|
||||||
defaults => 1,
|
defaults => 1,
|
||||||
no_owner => 1,
|
no_owner => 1,
|
||||||
schema_only => 1,
|
schema_only => 1,
|
||||||
section_pre_data => 1,
|
section_pre_data => 1, },
|
||||||
},
|
|
||||||
unlike => {
|
unlike => {
|
||||||
no_privs => 1,
|
no_privs => 1,
|
||||||
pg_dumpall_globals => 1,
|
pg_dumpall_globals => 1,
|
||||||
section_post_data => 1,
|
section_post_data => 1, }, },);
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
#########################################
|
#########################################
|
||||||
# Create a PG instance to test actually dumping from
|
# Create a PG instance to test actually dumping from
|
||||||
|
@ -461,28 +363,34 @@ my $port = $node->port;
|
||||||
|
|
||||||
my $num_tests = 0;
|
my $num_tests = 0;
|
||||||
|
|
||||||
foreach my $run (sort keys %pgdump_runs) {
|
foreach my $run (sort keys %pgdump_runs)
|
||||||
|
{
|
||||||
my $test_key = $run;
|
my $test_key = $run;
|
||||||
|
|
||||||
# Each run of pg_dump is a test itself
|
# Each run of pg_dump is a test itself
|
||||||
$num_tests++;
|
$num_tests++;
|
||||||
|
|
||||||
# If there is a restore cmd, that's another test
|
# If there is a restore cmd, that's another test
|
||||||
if ($pgdump_runs{$run}->{restore_cmd}) {
|
if ($pgdump_runs{$run}->{restore_cmd})
|
||||||
|
{
|
||||||
$num_tests++;
|
$num_tests++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($pgdump_runs{$run}->{test_key}) {
|
if ($pgdump_runs{$run}->{test_key})
|
||||||
|
{
|
||||||
$test_key = $pgdump_runs{$run}->{test_key};
|
$test_key = $pgdump_runs{$run}->{test_key};
|
||||||
}
|
}
|
||||||
|
|
||||||
# Then count all the tests run against each run
|
# Then count all the tests run against each run
|
||||||
foreach my $test (sort keys %tests) {
|
foreach my $test (sort keys %tests)
|
||||||
if ($tests{$test}->{like}->{$test_key}) {
|
{
|
||||||
|
if ($tests{$test}->{like}->{$test_key})
|
||||||
|
{
|
||||||
$num_tests++;
|
$num_tests++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($tests{$test}->{unlike}->{$test_key}) {
|
if ($tests{$test}->{unlike}->{$test_key})
|
||||||
|
{
|
||||||
$num_tests++;
|
$num_tests++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -497,17 +405,26 @@ my $create_sql = '';
|
||||||
|
|
||||||
foreach my $test (
|
foreach my $test (
|
||||||
sort {
|
sort {
|
||||||
if ($tests{$a}->{create_order} and $tests{$b}->{create_order}) {
|
if ($tests{$a}->{create_order} and $tests{$b}->{create_order})
|
||||||
|
{
|
||||||
$tests{$a}->{create_order} <=> $tests{$b}->{create_order};
|
$tests{$a}->{create_order} <=> $tests{$b}->{create_order};
|
||||||
} elsif ($tests{$a}->{create_order}) {
|
}
|
||||||
|
elsif ($tests{$a}->{create_order})
|
||||||
|
{
|
||||||
-1;
|
-1;
|
||||||
} elsif ($tests{$b}->{create_order}) {
|
}
|
||||||
|
elsif ($tests{$b}->{create_order})
|
||||||
|
{
|
||||||
1;
|
1;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
0;
|
0;
|
||||||
}
|
}
|
||||||
} keys %tests) {
|
} keys %tests)
|
||||||
if ($tests{$test}->{create_sql}) {
|
{
|
||||||
|
if ($tests{$test}->{create_sql})
|
||||||
|
{
|
||||||
$create_sql .= $tests{$test}->{create_sql};
|
$create_sql .= $tests{$test}->{create_sql};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -518,17 +435,22 @@ $node->safe_psql('postgres', $create_sql);
|
||||||
#########################################
|
#########################################
|
||||||
# Run all runs
|
# Run all runs
|
||||||
|
|
||||||
foreach my $run (sort keys %pgdump_runs) {
|
foreach my $run (sort keys %pgdump_runs)
|
||||||
|
{
|
||||||
|
|
||||||
my $test_key = $run;
|
my $test_key = $run;
|
||||||
|
|
||||||
$node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} }, "$run: pg_dump runs");
|
$node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} },
|
||||||
|
"$run: pg_dump runs");
|
||||||
|
|
||||||
if ($pgdump_runs{$run}->{restore_cmd}) {
|
if ($pgdump_runs{$run}->{restore_cmd})
|
||||||
$node->command_ok(\@{ $pgdump_runs{$run}->{restore_cmd} }, "$run: pg_restore runs");
|
{
|
||||||
|
$node->command_ok(\@{ $pgdump_runs{$run}->{restore_cmd} },
|
||||||
|
"$run: pg_restore runs");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($pgdump_runs{$run}->{test_key}) {
|
if ($pgdump_runs{$run}->{test_key})
|
||||||
|
{
|
||||||
$test_key = $pgdump_runs{$run}->{test_key};
|
$test_key = $pgdump_runs{$run}->{test_key};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -538,13 +460,19 @@ foreach my $run (sort keys %pgdump_runs) {
|
||||||
# Run all tests where this run is included
|
# Run all tests where this run is included
|
||||||
# as either a 'like' or 'unlike' test.
|
# as either a 'like' or 'unlike' test.
|
||||||
|
|
||||||
foreach my $test (sort keys %tests) {
|
foreach my $test (sort keys %tests)
|
||||||
if ($tests{$test}->{like}->{$test_key}) {
|
{
|
||||||
|
if ($tests{$test}->{like}->{$test_key})
|
||||||
|
{
|
||||||
like($output_file, $tests{$test}->{regexp}, "$run: dumps $test");
|
like($output_file, $tests{$test}->{regexp}, "$run: dumps $test");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($tests{$test}->{unlike}->{$test_key}) {
|
if ($tests{$test}->{unlike}->{$test_key})
|
||||||
unlike($output_file, $tests{$test}->{regexp}, "$run: does not dump $test");
|
{
|
||||||
|
unlike(
|
||||||
|
$output_file,
|
||||||
|
$tests{$test}->{regexp},
|
||||||
|
"$run: does not dump $test");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,7 @@ our ($test_localhost, $test_pghost, $last_port_assigned, @all_nodes);
|
||||||
|
|
||||||
INIT
|
INIT
|
||||||
{
|
{
|
||||||
|
|
||||||
# PGHOST is set once and for all through a single series of tests when
|
# PGHOST is set once and for all through a single series of tests when
|
||||||
# this module is loaded.
|
# this module is loaded.
|
||||||
$test_localhost = "127.0.0.1";
|
$test_localhost = "127.0.0.1";
|
||||||
|
@ -540,11 +541,12 @@ sub _backup_fs
|
||||||
|
|
||||||
if ($hot)
|
if ($hot)
|
||||||
{
|
{
|
||||||
|
|
||||||
# We ignore pg_stop_backup's return value. We also assume archiving
|
# We ignore pg_stop_backup's return value. We also assume archiving
|
||||||
# is enabled; otherwise the caller will have to copy the remaining
|
# is enabled; otherwise the caller will have to copy the remaining
|
||||||
# segments.
|
# segments.
|
||||||
my $stdout = $self->safe_psql('postgres',
|
my $stdout =
|
||||||
'SELECT * FROM pg_stop_backup();');
|
$self->safe_psql('postgres', 'SELECT * FROM pg_stop_backup();');
|
||||||
print "# pg_stop_backup: $stdout\n";
|
print "# pg_stop_backup: $stdout\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -842,6 +844,7 @@ sub get_new_node
|
||||||
|
|
||||||
while ($found == 0)
|
while ($found == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
# advance $port, wrapping correctly around range end
|
# advance $port, wrapping correctly around range end
|
||||||
$port = 49152 if ++$port >= 65536;
|
$port = 49152 if ++$port >= 65536;
|
||||||
print "# Checking port $port\n";
|
print "# Checking port $port\n";
|
||||||
|
@ -896,6 +899,7 @@ sub get_new_node
|
||||||
# order, later when the File::Temp objects are destroyed.
|
# order, later when the File::Temp objects are destroyed.
|
||||||
END
|
END
|
||||||
{
|
{
|
||||||
|
|
||||||
# take care not to change the script's exit value
|
# take care not to change the script's exit value
|
||||||
my $exit_code = $?;
|
my $exit_code = $?;
|
||||||
|
|
||||||
|
@ -1078,7 +1082,7 @@ sub psql
|
||||||
IPC::Run::timeout($params{timeout}, exception => $timeout_exception)
|
IPC::Run::timeout($params{timeout}, exception => $timeout_exception)
|
||||||
if (defined($params{timeout}));
|
if (defined($params{timeout}));
|
||||||
|
|
||||||
${$params{timed_out}} = 0 if defined $params{timed_out};
|
${ $params{timed_out} } = 0 if defined $params{timed_out};
|
||||||
|
|
||||||
# IPC::Run would otherwise append to existing contents:
|
# IPC::Run would otherwise append to existing contents:
|
||||||
$$stdout = "" if ref($stdout);
|
$$stdout = "" if ref($stdout);
|
||||||
|
@ -1107,6 +1111,7 @@ sub psql
|
||||||
my $exc_save = $@;
|
my $exc_save = $@;
|
||||||
if ($exc_save)
|
if ($exc_save)
|
||||||
{
|
{
|
||||||
|
|
||||||
# IPC::Run::run threw an exception. re-throw unless it's a
|
# IPC::Run::run threw an exception. re-throw unless it's a
|
||||||
# timeout, which we'll handle by testing is_expired
|
# timeout, which we'll handle by testing is_expired
|
||||||
die $exc_save
|
die $exc_save
|
||||||
|
|
|
@ -65,7 +65,7 @@ sub copypath
|
||||||
{
|
{
|
||||||
die "if specified, filterfn must be a subroutine reference"
|
die "if specified, filterfn must be a subroutine reference"
|
||||||
unless defined(ref $params{filterfn})
|
unless defined(ref $params{filterfn})
|
||||||
and (ref $params{filterfn} eq 'CODE');
|
and (ref $params{filterfn} eq 'CODE');
|
||||||
|
|
||||||
$filterfn = $params{filterfn};
|
$filterfn = $params{filterfn};
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,8 @@ sub _copypath_recurse
|
||||||
|
|
||||||
# Can't handle symlinks or other weird things
|
# Can't handle symlinks or other weird things
|
||||||
die "Source path \"$srcpath\" is not a regular file or directory"
|
die "Source path \"$srcpath\" is not a regular file or directory"
|
||||||
unless -f $srcpath or -d $srcpath;
|
unless -f $srcpath
|
||||||
|
or -d $srcpath;
|
||||||
|
|
||||||
# Abort if destination path already exists. Should we allow directories
|
# Abort if destination path already exists. Should we allow directories
|
||||||
# to exist already?
|
# to exist already?
|
||||||
|
|
|
@ -109,6 +109,7 @@ INIT
|
||||||
|
|
||||||
END
|
END
|
||||||
{
|
{
|
||||||
|
|
||||||
# Preserve temporary directory for this test on failure
|
# Preserve temporary directory for this test on failure
|
||||||
$File::Temp::KEEP_ALL = 1 unless all_tests_passing();
|
$File::Temp::KEEP_ALL = 1 unless all_tests_passing();
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,10 +51,13 @@ my $result =
|
||||||
print "standby 1: $result\n";
|
print "standby 1: $result\n";
|
||||||
is($result, qq(1002), 'check streamed content on standby 1');
|
is($result, qq(1002), 'check streamed content on standby 1');
|
||||||
|
|
||||||
$result = $node_standby_2->safe_psql('postgres', "SELECT count(*) FROM tab_int");
|
$result =
|
||||||
|
$node_standby_2->safe_psql('postgres', "SELECT count(*) FROM tab_int");
|
||||||
print "standby 2: $result\n";
|
print "standby 2: $result\n";
|
||||||
is($result, qq(1002), 'check streamed content on standby 2');
|
is($result, qq(1002), 'check streamed content on standby 2');
|
||||||
|
|
||||||
# Check that only READ-only queries can run on standbys
|
# Check that only READ-only queries can run on standbys
|
||||||
is($node_standby_1->psql('postgres', 'INSERT INTO tab_int VALUES (1)'), 3, 'Read-only queries on standby 1');
|
is($node_standby_1->psql('postgres', 'INSERT INTO tab_int VALUES (1)'),
|
||||||
is($node_standby_2->psql('postgres', 'INSERT INTO tab_int VALUES (1)'), 3, 'Read-only queries on standby 2');
|
3, 'Read-only queries on standby 1');
|
||||||
|
is($node_standby_2->psql('postgres', 'INSERT INTO tab_int VALUES (1)'),
|
||||||
|
3, 'Read-only queries on standby 2');
|
||||||
|
|
|
@ -48,5 +48,6 @@ my $caughtup_query =
|
||||||
$node_standby->poll_query_until('postgres', $caughtup_query)
|
$node_standby->poll_query_until('postgres', $caughtup_query)
|
||||||
or die "Timed out while waiting for standby to catch up";
|
or die "Timed out while waiting for standby to catch up";
|
||||||
|
|
||||||
my $result = $node_standby->safe_psql('postgres', "SELECT count(*) FROM tab_int");
|
my $result =
|
||||||
|
$node_standby->safe_psql('postgres', "SELECT count(*) FROM tab_int");
|
||||||
is($result, qq(1000), 'check content from archives');
|
is($result, qq(1000), 'check content from archives');
|
||||||
|
|
|
@ -66,7 +66,8 @@ $node_master->backup('my_backup');
|
||||||
# target TXID.
|
# target TXID.
|
||||||
$node_master->safe_psql('postgres',
|
$node_master->safe_psql('postgres',
|
||||||
"INSERT INTO tab_int VALUES (generate_series(1001,2000))");
|
"INSERT INTO tab_int VALUES (generate_series(1001,2000))");
|
||||||
my $recovery_txid = $node_master->safe_psql('postgres', "SELECT txid_current()");
|
my $recovery_txid =
|
||||||
|
$node_master->safe_psql('postgres', "SELECT txid_current()");
|
||||||
my $lsn2 =
|
my $lsn2 =
|
||||||
$node_master->safe_psql('postgres', "SELECT pg_current_xlog_location();");
|
$node_master->safe_psql('postgres', "SELECT pg_current_xlog_location();");
|
||||||
|
|
||||||
|
|
|
@ -63,8 +63,8 @@ $node_standby_1->poll_query_until('postgres',
|
||||||
"SELECT pg_is_in_recovery() <> true");
|
"SELECT pg_is_in_recovery() <> true");
|
||||||
$node_standby_1->safe_psql('postgres',
|
$node_standby_1->safe_psql('postgres',
|
||||||
"INSERT INTO tab_int VALUES (generate_series(1001,2000))");
|
"INSERT INTO tab_int VALUES (generate_series(1001,2000))");
|
||||||
$until_lsn =
|
$until_lsn = $node_standby_1->safe_psql('postgres',
|
||||||
$node_standby_1->safe_psql('postgres', "SELECT pg_current_xlog_location();");
|
"SELECT pg_current_xlog_location();");
|
||||||
$caughtup_query =
|
$caughtup_query =
|
||||||
"SELECT '$until_lsn'::pg_lsn <= pg_last_xlog_replay_location()";
|
"SELECT '$until_lsn'::pg_lsn <= pg_last_xlog_replay_location()";
|
||||||
$node_standby_2->poll_query_until('postgres', $caughtup_query)
|
$node_standby_2->poll_query_until('postgres', $caughtup_query)
|
||||||
|
|
|
@ -21,7 +21,7 @@ $node_master->backup($backup_name);
|
||||||
|
|
||||||
# Create streaming standby from backup
|
# Create streaming standby from backup
|
||||||
my $node_standby = get_new_node('standby');
|
my $node_standby = get_new_node('standby');
|
||||||
my $delay = 3;
|
my $delay = 3;
|
||||||
$node_standby->init_from_backup($node_master, $backup_name,
|
$node_standby->init_from_backup($node_master, $backup_name,
|
||||||
has_streaming => 1);
|
has_streaming => 1);
|
||||||
$node_standby->append_conf(
|
$node_standby->append_conf(
|
||||||
|
@ -47,10 +47,11 @@ my $until_lsn =
|
||||||
my $remaining = 90;
|
my $remaining = 90;
|
||||||
while ($remaining-- > 0)
|
while ($remaining-- > 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
# Done waiting?
|
# Done waiting?
|
||||||
my $replay_status =
|
my $replay_status = $node_standby->safe_psql('postgres',
|
||||||
$node_standby->safe_psql('postgres',
|
"SELECT (pg_last_xlog_replay_location() - '$until_lsn'::pg_lsn) >= 0"
|
||||||
"SELECT (pg_last_xlog_replay_location() - '$until_lsn'::pg_lsn) >= 0");
|
);
|
||||||
last if $replay_status eq 't';
|
last if $replay_status eq 't';
|
||||||
|
|
||||||
# No, sleep some more.
|
# No, sleep some more.
|
||||||
|
@ -59,9 +60,10 @@ while ($remaining-- > 0)
|
||||||
sleep $sleep;
|
sleep $sleep;
|
||||||
}
|
}
|
||||||
|
|
||||||
die "Maximum number of attempts reached ($remaining remain)" if $remaining < 0;
|
die "Maximum number of attempts reached ($remaining remain)"
|
||||||
|
if $remaining < 0;
|
||||||
|
|
||||||
# This test is successful if and only if the LSN has been applied with at least
|
# This test is successful if and only if the LSN has been applied with at least
|
||||||
# the configured apply delay.
|
# the configured apply delay.
|
||||||
ok(time() - $master_insert_time >= $delay,
|
ok(time() - $master_insert_time >= $delay,
|
||||||
"Check that standby applies WAL only after replication delay");
|
"Check that standby applies WAL only after replication delay");
|
||||||
|
|
|
@ -6,7 +6,8 @@ use TestLib;
|
||||||
use Test::More tests => 8;
|
use Test::More tests => 8;
|
||||||
|
|
||||||
# Query checking sync_priority and sync_state of each standby
|
# Query checking sync_priority and sync_state of each standby
|
||||||
my $check_sql = "SELECT application_name, sync_priority, sync_state FROM pg_stat_replication ORDER BY application_name;";
|
my $check_sql =
|
||||||
|
"SELECT application_name, sync_priority, sync_state FROM pg_stat_replication ORDER BY application_name;";
|
||||||
|
|
||||||
# Check that sync_state of each standby is expected.
|
# Check that sync_state of each standby is expected.
|
||||||
# If $setting is given, synchronous_standby_names is set to it and
|
# If $setting is given, synchronous_standby_names is set to it and
|
||||||
|
@ -18,12 +19,12 @@ sub test_sync_state
|
||||||
if (defined($setting))
|
if (defined($setting))
|
||||||
{
|
{
|
||||||
$self->psql('postgres',
|
$self->psql('postgres',
|
||||||
"ALTER SYSTEM SET synchronous_standby_names = '$setting';");
|
"ALTER SYSTEM SET synchronous_standby_names = '$setting';");
|
||||||
$self->reload;
|
$self->reload;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $timeout_max = 30;
|
my $timeout_max = 30;
|
||||||
my $timeout = 0;
|
my $timeout = 0;
|
||||||
my $result;
|
my $result;
|
||||||
|
|
||||||
# A reload may take some time to take effect on busy machines,
|
# A reload may take some time to take effect on busy machines,
|
||||||
|
@ -71,7 +72,8 @@ $node_standby_3->start;
|
||||||
|
|
||||||
# Check that sync_state is determined correctly when
|
# Check that sync_state is determined correctly when
|
||||||
# synchronous_standby_names is specified in old syntax.
|
# synchronous_standby_names is specified in old syntax.
|
||||||
test_sync_state($node_master, qq(standby1|1|sync
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|1|sync
|
||||||
standby2|2|potential
|
standby2|2|potential
|
||||||
standby3|0|async),
|
standby3|0|async),
|
||||||
'old syntax of synchronous_standby_names',
|
'old syntax of synchronous_standby_names',
|
||||||
|
@ -82,7 +84,8 @@ standby3|0|async),
|
||||||
# Note that standby1 is chosen as sync standby because
|
# Note that standby1 is chosen as sync standby because
|
||||||
# it's stored in the head of WalSnd array which manages
|
# it's stored in the head of WalSnd array which manages
|
||||||
# all the standbys though they have the same priority.
|
# all the standbys though they have the same priority.
|
||||||
test_sync_state($node_master, qq(standby1|1|sync
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|1|sync
|
||||||
standby2|1|potential
|
standby2|1|potential
|
||||||
standby3|1|potential),
|
standby3|1|potential),
|
||||||
'asterisk in synchronous_standby_names',
|
'asterisk in synchronous_standby_names',
|
||||||
|
@ -100,7 +103,8 @@ $node_standby_3->start;
|
||||||
|
|
||||||
# Specify 2 as the number of sync standbys.
|
# Specify 2 as the number of sync standbys.
|
||||||
# Check that two standbys are in 'sync' state.
|
# Check that two standbys are in 'sync' state.
|
||||||
test_sync_state($node_master, qq(standby2|2|sync
|
test_sync_state(
|
||||||
|
$node_master, qq(standby2|2|sync
|
||||||
standby3|3|sync),
|
standby3|3|sync),
|
||||||
'2 synchronous standbys',
|
'2 synchronous standbys',
|
||||||
'2(standby1,standby2,standby3)');
|
'2(standby1,standby2,standby3)');
|
||||||
|
@ -111,14 +115,15 @@ $node_standby_1->start;
|
||||||
# Create standby4 linking to master
|
# Create standby4 linking to master
|
||||||
my $node_standby_4 = get_new_node('standby4');
|
my $node_standby_4 = get_new_node('standby4');
|
||||||
$node_standby_4->init_from_backup($node_master, $backup_name,
|
$node_standby_4->init_from_backup($node_master, $backup_name,
|
||||||
has_streaming => 1);
|
has_streaming => 1);
|
||||||
$node_standby_4->start;
|
$node_standby_4->start;
|
||||||
|
|
||||||
# Check that standby1 and standby2 whose names appear earlier in
|
# Check that standby1 and standby2 whose names appear earlier in
|
||||||
# synchronous_standby_names are considered as sync. Also check that
|
# synchronous_standby_names are considered as sync. Also check that
|
||||||
# standby3 appearing later represents potential, and standby4 is
|
# standby3 appearing later represents potential, and standby4 is
|
||||||
# in 'async' state because it's not in the list.
|
# in 'async' state because it's not in the list.
|
||||||
test_sync_state($node_master, qq(standby1|1|sync
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|1|sync
|
||||||
standby2|2|sync
|
standby2|2|sync
|
||||||
standby3|3|potential
|
standby3|3|potential
|
||||||
standby4|0|async),
|
standby4|0|async),
|
||||||
|
@ -127,7 +132,8 @@ standby4|0|async),
|
||||||
# Check that sync_state of each standby is determined correctly
|
# Check that sync_state of each standby is determined correctly
|
||||||
# when num_sync exceeds the number of names of potential sync standbys
|
# when num_sync exceeds the number of names of potential sync standbys
|
||||||
# specified in synchronous_standby_names.
|
# specified in synchronous_standby_names.
|
||||||
test_sync_state($node_master, qq(standby1|0|async
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|0|async
|
||||||
standby2|4|sync
|
standby2|4|sync
|
||||||
standby3|3|sync
|
standby3|3|sync
|
||||||
standby4|1|sync),
|
standby4|1|sync),
|
||||||
|
@ -138,7 +144,8 @@ standby4|1|sync),
|
||||||
# but does not make sense in most cases. Check that sync_state is
|
# but does not make sense in most cases. Check that sync_state is
|
||||||
# chosen properly even in case of that setting.
|
# chosen properly even in case of that setting.
|
||||||
# The priority of standby2 should be 2 because it matches * first.
|
# The priority of standby2 should be 2 because it matches * first.
|
||||||
test_sync_state($node_master, qq(standby1|1|sync
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|1|sync
|
||||||
standby2|2|sync
|
standby2|2|sync
|
||||||
standby3|2|potential
|
standby3|2|potential
|
||||||
standby4|2|potential),
|
standby4|2|potential),
|
||||||
|
@ -147,7 +154,8 @@ standby4|2|potential),
|
||||||
|
|
||||||
# Check that the setting of '2(*)' chooses standby2 and standby3 that are stored
|
# Check that the setting of '2(*)' chooses standby2 and standby3 that are stored
|
||||||
# earlier in WalSnd array as sync standbys.
|
# earlier in WalSnd array as sync standbys.
|
||||||
test_sync_state($node_master, qq(standby1|1|potential
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|1|potential
|
||||||
standby2|1|sync
|
standby2|1|sync
|
||||||
standby3|1|sync
|
standby3|1|sync
|
||||||
standby4|1|potential),
|
standby4|1|potential),
|
||||||
|
@ -159,7 +167,8 @@ $node_standby_3->stop;
|
||||||
|
|
||||||
# Check that the state of standby1 stored earlier in WalSnd array than
|
# Check that the state of standby1 stored earlier in WalSnd array than
|
||||||
# standby4 is transited from potential to sync.
|
# standby4 is transited from potential to sync.
|
||||||
test_sync_state($node_master, qq(standby1|1|sync
|
test_sync_state(
|
||||||
|
$node_master, qq(standby1|1|sync
|
||||||
standby2|1|sync
|
standby2|1|sync
|
||||||
standby4|1|potential),
|
standby4|1|potential),
|
||||||
'potential standby found earlier in array is promoted to sync');
|
'potential standby found earlier in array is promoted to sync');
|
||||||
|
|
|
@ -16,8 +16,8 @@ use File::Find;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
use Tie::File;
|
use Tie::File;
|
||||||
|
|
||||||
my $pgdg = 'PostgreSQL Global Development Group';
|
my $pgdg = 'PostgreSQL Global Development Group';
|
||||||
my $cc = 'Copyright \(c\)';
|
my $cc = 'Copyright \(c\)';
|
||||||
my $ccliteral = 'Copyright (c)';
|
my $ccliteral = 'Copyright (c)';
|
||||||
|
|
||||||
# year-1900 is what localtime(time) puts in element 5
|
# year-1900 is what localtime(time) puts in element 5
|
||||||
|
|
|
@ -66,24 +66,24 @@ my @BRANCHES = qw(master
|
||||||
# Might want to make this parameter user-settable.
|
# Might want to make this parameter user-settable.
|
||||||
my $timestamp_slop = 24 * 60 * 60;
|
my $timestamp_slop = 24 * 60 * 60;
|
||||||
|
|
||||||
my $brief = 0;
|
my $brief = 0;
|
||||||
my $details_after = 0;
|
my $details_after = 0;
|
||||||
my $post_date = 0;
|
my $post_date = 0;
|
||||||
my $master_only = 0;
|
my $master_only = 0;
|
||||||
my $non_master_only = 0;
|
my $non_master_only = 0;
|
||||||
my $oldest_first = 0;
|
my $oldest_first = 0;
|
||||||
my $since;
|
my $since;
|
||||||
my @output_buffer;
|
my @output_buffer;
|
||||||
my $output_line = '';
|
my $output_line = '';
|
||||||
|
|
||||||
Getopt::Long::GetOptions(
|
Getopt::Long::GetOptions(
|
||||||
'brief' => \$brief,
|
'brief' => \$brief,
|
||||||
'details-after' => \$details_after,
|
'details-after' => \$details_after,
|
||||||
'master-only' => \$master_only,
|
'master-only' => \$master_only,
|
||||||
'non-master-only' => \$non_master_only,
|
'non-master-only' => \$non_master_only,
|
||||||
'post-date' => \$post_date,
|
'post-date' => \$post_date,
|
||||||
'oldest-first' => \$oldest_first,
|
'oldest-first' => \$oldest_first,
|
||||||
'since=s' => \$since) || usage();
|
'since=s' => \$since) || usage();
|
||||||
usage() if @ARGV;
|
usage() if @ARGV;
|
||||||
|
|
||||||
my @git = qw(git log --format=fuller --date=iso);
|
my @git = qw(git log --format=fuller --date=iso);
|
||||||
|
@ -250,7 +250,7 @@ while (1)
|
||||||
if ($master_only)
|
if ($master_only)
|
||||||
{
|
{
|
||||||
$print_it = (@{ $winner->{'commits'} } == 1)
|
$print_it = (@{ $winner->{'commits'} } == 1)
|
||||||
&& ($winner->{'commits'}[0]->{'branch'} eq 'master');
|
&& ($winner->{'commits'}[0]->{'branch'} eq 'master');
|
||||||
}
|
}
|
||||||
elsif ($non_master_only)
|
elsif ($non_master_only)
|
||||||
{
|
{
|
||||||
|
@ -374,20 +374,20 @@ sub output_details
|
||||||
{
|
{
|
||||||
$item->{'message'} =~ m/^\s*(.*)/;
|
$item->{'message'} =~ m/^\s*(.*)/;
|
||||||
|
|
||||||
output_str("%s [%s] %s\n",
|
output_str(
|
||||||
substr($c->{'date'}, 0, 10),
|
"%s [%s] %s\n",
|
||||||
substr($c->{'commit'}, 0, 9),
|
substr($c->{'date'}, 0, 10),
|
||||||
substr($1, 0, 56));
|
substr($c->{'commit'}, 0, 9),
|
||||||
|
substr($1, 0, 56));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
output_str("Branch: %s ", $c->{'branch'})
|
output_str("Branch: %s ", $c->{'branch'})
|
||||||
if (!$master_only);
|
if (!$master_only);
|
||||||
output_str("Release: %s ", $c->{'last_tag'})
|
output_str("Release: %s ", $c->{'last_tag'})
|
||||||
if (defined $c->{'last_tag'});
|
if (defined $c->{'last_tag'});
|
||||||
output_str("[%s] %s\n",
|
output_str("[%s] %s\n", substr($c->{'commit'}, 0, 9),
|
||||||
substr($c->{'commit'}, 0, 9),
|
$c->{'date'});
|
||||||
$c->{'date'});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
output_str("\n");
|
output_str("\n");
|
||||||
|
|
|
@ -582,7 +582,8 @@ sub CopyIncludeFiles
|
||||||
'Public headers', $target . '/include/',
|
'Public headers', $target . '/include/',
|
||||||
'src/include/', 'postgres_ext.h',
|
'src/include/', 'postgres_ext.h',
|
||||||
'pg_config.h', 'pg_config_ext.h',
|
'pg_config.h', 'pg_config_ext.h',
|
||||||
'pg_config_os.h', 'dynloader.h', 'pg_config_manual.h');
|
'pg_config_os.h', 'dynloader.h',
|
||||||
|
'pg_config_manual.h');
|
||||||
lcopy('src/include/libpq/libpq-fs.h', $target . '/include/libpq/')
|
lcopy('src/include/libpq/libpq-fs.h', $target . '/include/libpq/')
|
||||||
|| croak 'Could not copy libpq-fs.h';
|
|| croak 'Could not copy libpq-fs.h';
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,12 @@ my $contrib_extrasource = {
|
||||||
'cube' => [ 'contrib/cube/cubescan.l', 'contrib/cube/cubeparse.y' ],
|
'cube' => [ 'contrib/cube/cubescan.l', 'contrib/cube/cubeparse.y' ],
|
||||||
'seg' => [ 'contrib/seg/segscan.l', 'contrib/seg/segparse.y' ], };
|
'seg' => [ 'contrib/seg/segscan.l', 'contrib/seg/segparse.y' ], };
|
||||||
my @contrib_excludes = (
|
my @contrib_excludes = (
|
||||||
'commit_ts', 'hstore_plperl', 'hstore_plpython', 'intagg',
|
'commit_ts', 'hstore_plperl',
|
||||||
'ltree_plpython', 'pgcrypto', 'sepgsql', 'brin',
|
'hstore_plpython', 'intagg',
|
||||||
'test_extensions', 'test_pg_dump', 'snapshot_too_old');
|
'ltree_plpython', 'pgcrypto',
|
||||||
|
'sepgsql', 'brin',
|
||||||
|
'test_extensions', 'test_pg_dump',
|
||||||
|
'snapshot_too_old');
|
||||||
|
|
||||||
# Set of variables for frontend modules
|
# Set of variables for frontend modules
|
||||||
my $frontend_defines = { 'initdb' => 'FRONTEND' };
|
my $frontend_defines = { 'initdb' => 'FRONTEND' };
|
||||||
|
@ -63,9 +66,9 @@ my $frontend_extralibs = {
|
||||||
'psql' => ['ws2_32.lib'] };
|
'psql' => ['ws2_32.lib'] };
|
||||||
my $frontend_extraincludes = {
|
my $frontend_extraincludes = {
|
||||||
'initdb' => ['src/timezone'],
|
'initdb' => ['src/timezone'],
|
||||||
'psql' => [ 'src/backend' ] };
|
'psql' => ['src/backend'] };
|
||||||
my $frontend_extrasource = {
|
my $frontend_extrasource = {
|
||||||
'psql' => [ 'src/bin/psql/psqlscanslash.l' ],
|
'psql' => ['src/bin/psql/psqlscanslash.l'],
|
||||||
'pgbench' =>
|
'pgbench' =>
|
||||||
[ 'src/bin/pgbench/exprscan.l', 'src/bin/pgbench/exprparse.y' ] };
|
[ 'src/bin/pgbench/exprscan.l', 'src/bin/pgbench/exprparse.y' ] };
|
||||||
my @frontend_excludes = (
|
my @frontend_excludes = (
|
||||||
|
@ -155,8 +158,10 @@ sub mkvcbuild
|
||||||
$postgres->AddFiles('src/backend/bootstrap', 'bootscanner.l',
|
$postgres->AddFiles('src/backend/bootstrap', 'bootscanner.l',
|
||||||
'bootparse.y');
|
'bootparse.y');
|
||||||
$postgres->AddFiles('src/backend/utils/misc', 'guc-file.l');
|
$postgres->AddFiles('src/backend/utils/misc', 'guc-file.l');
|
||||||
$postgres->AddFiles('src/backend/replication', 'repl_scanner.l',
|
$postgres->AddFiles(
|
||||||
'repl_gram.y', 'syncrep_scanner.l', 'syncrep_gram.y');
|
'src/backend/replication', 'repl_scanner.l',
|
||||||
|
'repl_gram.y', 'syncrep_scanner.l',
|
||||||
|
'syncrep_gram.y');
|
||||||
$postgres->AddDefine('BUILDING_DLL');
|
$postgres->AddDefine('BUILDING_DLL');
|
||||||
$postgres->AddLibrary('secur32.lib');
|
$postgres->AddLibrary('secur32.lib');
|
||||||
$postgres->AddLibrary('ws2_32.lib');
|
$postgres->AddLibrary('ws2_32.lib');
|
||||||
|
@ -625,8 +630,7 @@ sub mkvcbuild
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$proj->AddIncludeDir('src/interfaces/libpq');
|
$proj->AddIncludeDir('src/interfaces/libpq');
|
||||||
$proj->AddReference($libpq, $libpgfeutils, $libpgcommon,
|
$proj->AddReference($libpq, $libpgfeutils, $libpgcommon, $libpgport);
|
||||||
$libpgport);
|
|
||||||
$proj->AddDirResourceFile('src/bin/scripts');
|
$proj->AddDirResourceFile('src/bin/scripts');
|
||||||
$proj->AddLibrary('ws2_32.lib');
|
$proj->AddLibrary('ws2_32.lib');
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,7 +286,8 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsNewer(
|
if (IsNewer(
|
||||||
'src/include/storage/lwlocknames.h', 'src/backend/storage/lmgr/lwlocknames.txt'))
|
'src/include/storage/lwlocknames.h',
|
||||||
|
'src/backend/storage/lmgr/lwlocknames.txt'))
|
||||||
{
|
{
|
||||||
print "Generating lwlocknames.c and lwlocknames.h...\n";
|
print "Generating lwlocknames.c and lwlocknames.h...\n";
|
||||||
chdir('src/backend/storage/lmgr');
|
chdir('src/backend/storage/lmgr');
|
||||||
|
@ -297,13 +298,13 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
|
||||||
'src/include/storage/lwlocknames.h',
|
'src/include/storage/lwlocknames.h',
|
||||||
'src/backend/storage/lmgr/lwlocknames.h'))
|
'src/backend/storage/lmgr/lwlocknames.h'))
|
||||||
{
|
{
|
||||||
copyFile('src/backend/storage/lmgr/lwlocknames.h',
|
copyFile(
|
||||||
|
'src/backend/storage/lmgr/lwlocknames.h',
|
||||||
'src/include/storage/lwlocknames.h');
|
'src/include/storage/lwlocknames.h');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsNewer(
|
if (IsNewer(
|
||||||
'src/include/dynloader.h',
|
'src/include/dynloader.h', 'src/backend/port/dynloader/win32.h'))
|
||||||
'src/backend/port/dynloader/win32.h'))
|
|
||||||
{
|
{
|
||||||
copyFile('src/backend/port/dynloader/win32.h',
|
copyFile('src/backend/port/dynloader/win32.h',
|
||||||
'src/include/dynloader.h');
|
'src/include/dynloader.h');
|
||||||
|
@ -352,8 +353,7 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
|
||||||
|
|
||||||
if ($self->{options}->{tcl}
|
if ($self->{options}->{tcl}
|
||||||
&& IsNewer(
|
&& IsNewer(
|
||||||
'src/pl/tcl/pltclerrcodes.h',
|
'src/pl/tcl/pltclerrcodes.h', 'src/backend/utils/errcodes.txt'))
|
||||||
'src/backend/utils/errcodes.txt'))
|
|
||||||
{
|
{
|
||||||
print "Generating pltclerrcodes.h...\n";
|
print "Generating pltclerrcodes.h...\n";
|
||||||
system(
|
system(
|
||||||
|
@ -653,9 +653,9 @@ sub GetFakeConfigure
|
||||||
$cfg .= ' --enable-cassert' if ($self->{options}->{asserts});
|
$cfg .= ' --enable-cassert' if ($self->{options}->{asserts});
|
||||||
$cfg .= ' --enable-integer-datetimes'
|
$cfg .= ' --enable-integer-datetimes'
|
||||||
if ($self->{options}->{integer_datetimes});
|
if ($self->{options}->{integer_datetimes});
|
||||||
$cfg .= ' --enable-nls' if ($self->{options}->{nls});
|
$cfg .= ' --enable-nls' if ($self->{options}->{nls});
|
||||||
$cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests});
|
$cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests});
|
||||||
$cfg .= ' --with-ldap' if ($self->{options}->{ldap});
|
$cfg .= ' --with-ldap' if ($self->{options}->{ldap});
|
||||||
$cfg .= ' --without-zlib' unless ($self->{options}->{zlib});
|
$cfg .= ' --without-zlib' unless ($self->{options}->{zlib});
|
||||||
$cfg .= ' --with-extra-version' if ($self->{options}->{extraver});
|
$cfg .= ' --with-extra-version' if ($self->{options}->{extraver});
|
||||||
$cfg .= ' --with-openssl' if ($self->{options}->{openssl});
|
$cfg .= ' --with-openssl' if ($self->{options}->{openssl});
|
||||||
|
|
|
@ -53,7 +53,8 @@ elsif (uc($ARGV[0]) ne "RELEASE")
|
||||||
if ($buildwhat and $vcver >= 10.00)
|
if ($buildwhat and $vcver >= 10.00)
|
||||||
{
|
{
|
||||||
system(
|
system(
|
||||||
"msbuild $buildwhat.vcxproj /verbosity:normal /p:Configuration=$bconf");
|
"msbuild $buildwhat.vcxproj /verbosity:normal /p:Configuration=$bconf"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
elsif ($buildwhat)
|
elsif ($buildwhat)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@ use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
our $config = {
|
our $config = {
|
||||||
asserts => 0, # --enable-cassert
|
asserts => 0, # --enable-cassert
|
||||||
# integer_datetimes=>1, # --enable-integer-datetimes - on is now default
|
# integer_datetimes=>1, # --enable-integer-datetimes - on is now default
|
||||||
# float4byval=>1, # --disable-float4-byval, on by default
|
# float4byval=>1, # --disable-float4-byval, on by default
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ my ($flexver) = `flex -V`; # grab first line
|
||||||
$flexver = (split(/\s+/, $flexver))[1];
|
$flexver = (split(/\s+/, $flexver))[1];
|
||||||
$flexver =~ s/[^0-9.]//g;
|
$flexver =~ s/[^0-9.]//g;
|
||||||
my @verparts = split(/\./, $flexver);
|
my @verparts = split(/\./, $flexver);
|
||||||
unless ($verparts[0] == 2 &&
|
unless ($verparts[0] == 2
|
||||||
($verparts[1] > 5 || ($verparts[1] == 5 && $verparts[2] >= 31)))
|
&& ($verparts[1] > 5 || ($verparts[1] == 5 && $verparts[2] >= 31)))
|
||||||
{
|
{
|
||||||
print "WARNING! Flex install not found, or unsupported Flex version.\n";
|
print "WARNING! Flex install not found, or unsupported Flex version.\n";
|
||||||
print "echo Attempting to build without.\n";
|
print "echo Attempting to build without.\n";
|
||||||
|
|
|
@ -184,11 +184,11 @@ sub tap_check
|
||||||
my $dir = shift;
|
my $dir = shift;
|
||||||
chdir $dir;
|
chdir $dir;
|
||||||
|
|
||||||
my @args = ( "prove", "--verbose", "t/*.pl");
|
my @args = ("prove", "--verbose", "t/*.pl");
|
||||||
|
|
||||||
# adjust the environment for just this test
|
# adjust the environment for just this test
|
||||||
local %ENV = %ENV;
|
local %ENV = %ENV;
|
||||||
$ENV{PERL5LIB} = "$topdir/src/test/perl;$ENV{PERL5LIB}";
|
$ENV{PERL5LIB} = "$topdir/src/test/perl;$ENV{PERL5LIB}";
|
||||||
$ENV{PG_REGRESS} = "$topdir/$Config/pg_regress/pg_regress";
|
$ENV{PG_REGRESS} = "$topdir/$Config/pg_regress/pg_regress";
|
||||||
|
|
||||||
$ENV{TESTDIR} = "$dir";
|
$ENV{TESTDIR} = "$dir";
|
||||||
|
@ -332,6 +332,7 @@ sub contribcheck
|
||||||
my $mstat = 0;
|
my $mstat = 0;
|
||||||
foreach my $module (glob("*"))
|
foreach my $module (glob("*"))
|
||||||
{
|
{
|
||||||
|
|
||||||
# these configuration-based exclusions must match Install.pm
|
# these configuration-based exclusions must match Install.pm
|
||||||
next if ($module eq "uuid-ossp" && !defined($config->{uuid}));
|
next if ($module eq "uuid-ossp" && !defined($config->{uuid}));
|
||||||
next if ($module eq "sslinfo" && !defined($config->{openssl}));
|
next if ($module eq "sslinfo" && !defined($config->{openssl}));
|
||||||
|
@ -365,8 +366,8 @@ sub recoverycheck
|
||||||
{
|
{
|
||||||
InstallTemp();
|
InstallTemp();
|
||||||
|
|
||||||
my $mstat = 0;
|
my $mstat = 0;
|
||||||
my $dir = "$topdir/src/test/recovery";
|
my $dir = "$topdir/src/test/recovery";
|
||||||
my $status = tap_check($dir);
|
my $status = tap_check($dir);
|
||||||
exit $status if $status;
|
exit $status if $status;
|
||||||
}
|
}
|
||||||
|
@ -547,20 +548,20 @@ sub InstallTemp
|
||||||
sub usage
|
sub usage
|
||||||
{
|
{
|
||||||
print STDERR
|
print STDERR
|
||||||
"Usage: vcregress.pl <mode> [ <schedule> ]\n\n",
|
"Usage: vcregress.pl <mode> [ <schedule> ]\n\n",
|
||||||
"Options for <mode>:\n",
|
"Options for <mode>:\n",
|
||||||
" bincheck run tests of utilities in src/bin/\n",
|
" bincheck run tests of utilities in src/bin/\n",
|
||||||
" check deploy instance and run regression tests on it\n",
|
" check deploy instance and run regression tests on it\n",
|
||||||
" contribcheck run tests of modules in contrib/\n",
|
" contribcheck run tests of modules in contrib/\n",
|
||||||
" ecpgcheck run regression tests of ECPG\n",
|
" ecpgcheck run regression tests of ECPG\n",
|
||||||
" installcheck run regression tests on existing instance\n",
|
" installcheck run regression tests on existing instance\n",
|
||||||
" isolationcheck run isolation tests\n",
|
" isolationcheck run isolation tests\n",
|
||||||
" modulescheck run tests of modules in src/test/modules/\n",
|
" modulescheck run tests of modules in src/test/modules/\n",
|
||||||
" plcheck run tests of PL languages\n",
|
" plcheck run tests of PL languages\n",
|
||||||
" recoverycheck run recovery test suite\n",
|
" recoverycheck run recovery test suite\n",
|
||||||
" upgradecheck run tests of pg_upgrade\n",
|
" upgradecheck run tests of pg_upgrade\n",
|
||||||
"\nOptions for <schedule>:\n",
|
"\nOptions for <schedule>:\n",
|
||||||
" serial serial mode\n",
|
" serial serial mode\n",
|
||||||
" parallel parallel mode\n";
|
" parallel parallel mode\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue