diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING index 127dc30bbb..98286231d7 100644 --- a/src/bin/pg_upgrade/TESTING +++ b/src/bin/pg_upgrade/TESTING @@ -17,6 +17,21 @@ the creation of the dump): export olddump=...somewhere/dump.sql (old version's dump) export oldinstall=...otherversion/ (old version's install base path) +"filter_rules" is a variable that can be used to specify a file with custom +filtering rules applied before comparing the dumps of the PostgreSQL +instances near the end of the tests, in the shape of regular expressions +valid for perl. This is useful to enforce certain validation cases where +pg_dump could create inconsistent outputs across major versions. +For example: + + # Remove all CREATE POLICY statements + s/^CREATE\sPOLICY.*//mgx + # Replace REFRESH with DROP for materialized views + s/^REFRESH\s(MATERIALIZED\sVIEW)/DROP $1/mgx + +Lines beginning with '#' and empty lines are ignored. One rule can be +defined per line. + Finally, the tests can be done by running make check diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 4cc1469306..c066fd7d93 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -45,6 +45,31 @@ sub filter_dump # Remove empty lines. $dump_contents =~ s/^\n//mgx; + # Apply custom filtering rules, if any. + if (defined($ENV{filter_rules})) + { + my $filter_file = $ENV{filter_rules}; + die "no file with custom filter rules found!" unless -e $filter_file; + + open my $filter_handle, '<', $filter_file + or die "could not open $filter_file"; + while (<$filter_handle>) + { + my $filter_line = $_; + + # Skip comments and empty lines + next if ($filter_line =~ /^#/); + next if ($filter_line =~ /^\s*$/); + + # Apply lines with filters. + note "Applying custom rule $filter_line to $dump_file"; + my $filter = "\$dump_contents =~ $filter_line"; + ## no critic (ProhibitStringyEval) + eval $filter; + } + close $filter_handle; + } + my $dump_file_filtered = "${dump_file}_filtered"; open(my $dh, '>', $dump_file_filtered) || die "opening $dump_file_filtered";