aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_upgrade/t/002_pg_upgrade.pl103
1 files changed, 70 insertions, 33 deletions
diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
index 2f9b13bf0ae..add6ea9c343 100644
--- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl
+++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
@@ -30,6 +30,27 @@ sub generate_db
"created database with ASCII characters from $from_char to $to_char");
}
+# Filter the contents of a dump before its use in a content comparison.
+# This returns the path to the filtered dump.
+sub filter_dump
+{
+ my ($node, $dump_file) = @_;
+ my $dump_contents = slurp_file($dump_file);
+
+ # Remove the comments.
+ $dump_contents =~ s/^\-\-.*//mgx;
+ # Remove empty lines.
+ $dump_contents =~ s/^\n//mgx;
+
+ my $dump_file_filtered = "${dump_file}_filtered";
+ open(my $dh, '>', $dump_file_filtered)
+ || die "opening $dump_file_filtered";
+ print $dh $dump_contents;
+ close($dh);
+
+ return $dump_file_filtered;
+}
+
# The test of pg_upgrade requires two clusters, an old one and a new one
# that gets upgraded. Before running the upgrade, a logical dump of the
# old cluster is taken, and a second logical dump of the new one is taken
@@ -49,8 +70,10 @@ if ( (defined($ENV{olddump}) && !defined($ENV{oldinstall}))
die "olddump or oldinstall is undefined";
}
-# Temporary location for the dumps taken
-my $tempdir = PostgreSQL::Test::Utils::tempdir;
+# Paths to the dumps taken during the tests.
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $dump1_file = "$tempdir/dump1.sql";
+my $dump2_file = "$tempdir/dump2.sql";
# Initialize node to upgrade
my $oldnode =
@@ -60,7 +83,10 @@ my $oldnode =
# To increase coverage of non-standard segment size and group access without
# increasing test runtime, run these tests with a custom setting.
# --allow-group-access and --wal-segsize have been added in v11.
-$oldnode->init(extra => [ '--wal-segsize', '1', '--allow-group-access' ]);
+my %node_params = ();
+$node_params{extra} = [ '--wal-segsize', '1', '--allow-group-access' ]
+ if $oldnode->pg_version >= 11;
+$oldnode->init(%node_params);
$oldnode->start;
# The default location of the source code is the root of this directory.
@@ -129,37 +155,38 @@ else
is($rc, 0, 'regression tests pass');
}
+# Initialize a new node for the upgrade.
+my $newnode = PostgreSQL::Test::Cluster->new('new_node');
+$newnode->init(%node_params);
+
+my $newbindir = $newnode->config_data('--bindir');
+my $oldbindir = $oldnode->config_data('--bindir');
+
# Before dumping, get rid of objects not existing or not supported in later
# versions. This depends on the version of the old server used, and matters
# only if different major versions are used for the dump.
if (defined($ENV{oldinstall}))
{
- # Note that upgrade_adapt.sql from the new version is used, to
- # cope with an upgrade to this version.
- $oldnode->command_ok(
+ # Note that upgrade_adapt.sql and psql from the new version are used,
+ # to cope with an upgrade to this version.
+ $newnode->command_ok(
[
'psql', '-X',
- '-f', "$srcdir/src/bin/pg_upgrade/upgrade_adapt.sql",
- 'regression'
+ '-f', "$srcdir/src/bin/pg_upgrade/upgrade_adapt.sql",
+ '-d', $oldnode->connstr('regression'),
],
'ran adapt script');
}
-# Initialize a new node for the upgrade.
-my $newnode = PostgreSQL::Test::Cluster->new('new_node');
-$newnode->init(extra => [ '--wal-segsize', '1', '--allow-group-access' ]);
-my $newbindir = $newnode->config_data('--bindir');
-my $oldbindir = $oldnode->config_data('--bindir');
-
# Take a dump before performing the upgrade as a base comparison. Note
# that we need to use pg_dumpall from the new node here.
-$newnode->command_ok(
- [
- 'pg_dumpall', '--no-sync',
- '-d', $oldnode->connstr('postgres'),
- '-f', "$tempdir/dump1.sql"
- ],
- 'dump before running pg_upgrade');
+my @dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $oldnode->connstr('postgres'),
+ '-f', $dump1_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump before running pg_upgrade');
# After dumping, update references to the old source tree's regress.so
# to point to the new tree.
@@ -173,7 +200,7 @@ if (defined($ENV{oldinstall}))
chomp($output);
my @libpaths = split("\n", $output);
- my $dump_data = slurp_file("$tempdir/dump1.sql");
+ my $dump_data = slurp_file($dump1_file);
my $newregresssrc = "$srcdir/src/test/regress";
foreach (@libpaths)
@@ -183,7 +210,7 @@ if (defined($ENV{oldinstall}))
$dump_data =~ s/$libpath/$newregresssrc/g;
}
- open my $fh, ">", "$tempdir/dump1.sql" or die "could not open dump file";
+ open my $fh, ">", $dump1_file or die "could not open dump file";
print $fh $dump_data;
close $fh;
@@ -284,24 +311,34 @@ if (-d $log_path)
}
# Second dump from the upgraded instance.
-$newnode->command_ok(
- [
- 'pg_dumpall', '--no-sync',
- '-d', $newnode->connstr('postgres'),
- '-f', "$tempdir/dump2.sql"
- ],
- 'dump after running pg_upgrade');
+@dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'),
+ '-f', $dump2_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump after running pg_upgrade');
+
+# No need to apply filters on the dumps if working on the same version
+# for the old and new nodes.
+my $dump1_filtered = $dump1_file;
+my $dump2_filtered = $dump2_file;
+if ($oldnode->pg_version != $newnode->pg_version)
+{
+ $dump1_filtered = filter_dump($oldnode, $dump1_file);
+ $dump2_filtered = filter_dump($newnode, $dump2_file);
+}
# Compare the two dumps, there should be no differences.
-my $compare_res = compare("$tempdir/dump1.sql", "$tempdir/dump2.sql");
+my $compare_res = compare($dump1_filtered, $dump2_filtered);
is($compare_res, 0, 'old and new dumps match after pg_upgrade');
# Provide more context if the dumps do not match.
if ($compare_res != 0)
{
my ($stdout, $stderr) =
- run_command([ 'diff', "$tempdir/dump1.sql", "$tempdir/dump2.sql" ]);
- print "=== diff of $tempdir/dump1.sql and $tempdir/dump2.sql\n";
+ run_command([ 'diff', $dump1_filtered, $dump2_filtered ]);
+ print "=== diff of $dump1_filtered and $dump2_filtered\n";
print "=== stdout ===\n";
print $stdout;
print "=== stderr ===\n";