From 65232a1ed8fdfb57775bef856a907965dfcda14d Mon Sep 17 00:00:00 2001 From: Georgios Kokolatos Date: Tue, 29 Mar 2022 08:29:15 +0000 Subject: [PATCH v3 1/4] Extend compression coverage for pg_dump, pg_restore --- src/bin/pg_dump/Makefile | 2 + src/bin/pg_dump/t/001_basic.pl | 15 ++++++ src/bin/pg_dump/t/002_pg_dump.pl | 92 ++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index 302f7e02d6..2f524b09bf 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -16,6 +16,8 @@ subdir = src/bin/pg_dump top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +export GZIP_PROGRAM=$(GZIP) + override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl index e0bf3eb032..9c1238181a 100644 --- a/src/bin/pg_dump/t/001_basic.pl +++ b/src/bin/pg_dump/t/001_basic.pl @@ -125,6 +125,21 @@ command_fails_like( qr/\Qpg_dump: error: -Z\/--compress must be in range 0..9\E/, 'pg_dump: -Z/--compress must be in range'); +if (check_pg_config("#define HAVE_LIBZ 1")) +{ + 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'); +} +else +{ + command_fails_like( + [ 'pg_dump', '--compress', '1', '--format', 'tar' ], + qr/\Qpg_dump: warning: requested compression not available in this installation -- archive will be uncompressed\E/, + 'pg_dump: warning: requested compression not available in this installation -- archive will be uncompressed'); +} + command_fails_like( [ 'pg_dump', '--extra-float-digits', '-16' ], qr/\Qpg_dump: error: --extra-float-digits must be in range\E/, diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index af5d6fa5a3..b9f6dccec4 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -54,6 +54,81 @@ my %pgdump_runs = ( "$tempdir/binary_upgrade.dump", ], }, + + # Do not use --no-sync to give test coverage for data sync. + compression_gzip_custom_format => { + test_key => 'compression', + dump_cmd => [ + 'pg_dump', + '--format=custom', '--compress=1', + "--file=$tempdir/compression_gzip_custom_format.dump", + 'postgres', + ], + restore_cmd => [ + 'pg_restore', + "--file=$tempdir/compression_gzip_custom_format.sql", + "$tempdir/compression_gzip_custom_format.dump", + ], + }, + + # Do not use --no-sync to give test coverage for data sync. + compression_gzip_directory_format => { + test_key => 'compression', + dump_cmd => [ + 'pg_dump', + '--format=directory', '--compress=1', + "--file=$tempdir/compression_gzip_directory_format", + 'postgres', + ], + # Give coverage for manually compressed blob.toc files during restore. + compress_cmd => [ + $ENV{'GZIP_PROGRAM'}, + '-f', + "$tempdir/compression_gzip_directory_format/blobs.toc", + ], + restore_cmd => [ + 'pg_restore', + "--file=$tempdir/compression_gzip_directory_format.sql", + "$tempdir/compression_gzip_directory_format", + ], + }, + + compression_gzip_directory_format_parallel => { + test_key => 'compression', + dump_cmd => [ + 'pg_dump', '--jobs=2', + '--format=directory', '--compress=6', + "--file=$tempdir/compression_gzip_directory_format_parallel", + 'postgres', + ], + # Give coverage for manually compressed blob.toc files during restore. + compress_cmd => [ + $ENV{'GZIP_PROGRAM'}, + '-f', + "$tempdir/compression_gzip_directory_format_parallel/blobs.toc", + ], + restore_cmd => [ + 'pg_restore', + '--jobs=3', + "--file=$tempdir/compression_gzip_directory_format_parallel.sql", + "$tempdir/compression_gzip_directory_format_parallel", + ], + }, + + # Check that the output is valid gzip + compression_gzip_plain_format => { + test_key => 'compression', + dump_cmd => [ + 'pg_dump', '--format=plain', '-Z1', + "--file=$tempdir/compression_gzip_plain_format.sql.gz", + 'postgres', + ], + compress_cmd => [ + $ENV{'GZIP_PROGRAM'}, + '-d', + "$tempdir/compression_gzip_plain_format.sql.gz", + ], + }, clean => { dump_cmd => [ 'pg_dump', @@ -424,6 +499,7 @@ my %full_runs = ( binary_upgrade => 1, clean => 1, clean_if_exists => 1, + compression => 1, createdb => 1, defaults => 1, exclude_dump_test_schema => 1, @@ -3098,6 +3174,7 @@ my %tests = ( binary_upgrade => 1, clean => 1, clean_if_exists => 1, + compression => 1, createdb => 1, defaults => 1, exclude_test_table => 1, @@ -3171,6 +3248,7 @@ my %tests = ( binary_upgrade => 1, clean => 1, clean_if_exists => 1, + compression => 1, createdb => 1, defaults => 1, exclude_dump_test_schema => 1, @@ -3947,9 +4025,23 @@ foreach my $run (sort keys %pgdump_runs) my $test_key = $run; my $run_db = 'postgres'; + my $supports_compression = check_pg_config("#define HAVE_LIBZ 1"); + my $compress_program = $ENV{GZIP_PROGRAM}; + $node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} }, "$run: pg_dump runs"); + if (defined($pgdump_runs{$run}->{compress_cmd})) + { + # Skip compression_cmd tests when compression is not supported, + # as the result is uncompressed or the utility program does not + # exist + next if !$supports_compression || !defined($compress_program) + || $compress_program eq ''; + command_ok( \@{ $pgdump_runs{$run}->{compress_cmd} }, + "$run: compression commands"); + } + if ($pgdump_runs{$run}->{restore_cmd}) { $node->command_ok(\@{ $pgdump_runs{$run}->{restore_cmd} }, -- 2.32.0