From f53d1d832ff8a3f694d10d36f6af32744f31b729 Mon Sep 17 00:00:00 2001 From: Anthonin Bonnefoy Date: Tue, 28 Jul 2026 09:47:12 +0200 Subject: Add regress tests for compression --- .../regress/expected/protocol_compression.out | 325 ++++++++++++++++++ .../expected/protocol_compression_1.out | 9 + .../expected/protocol_compression_2.out | 9 + src/test/regress/parallel_schedule | 2 +- src/test/regress/sql/protocol_compression.sql | 185 ++++++++++ 5 files changed, 529 insertions(+), 1 deletion(-) create mode 100644 src/test/regress/expected/protocol_compression.out create mode 100644 src/test/regress/expected/protocol_compression_1.out create mode 100644 src/test/regress/expected/protocol_compression_2.out create mode 100644 src/test/regress/sql/protocol_compression.sql diff --git a/src/test/regress/expected/protocol_compression.out b/src/test/regress/expected/protocol_compression.out new file mode 100644 index 00000000000..62630d7b3f9 --- /dev/null +++ b/src/test/regress/expected/protocol_compression.out @@ -0,0 +1,325 @@ +-- Allow all available compression algorithms +SET protocol_backend_compression_allowed_algorithms = 'zstd,lz4'; +SELECT current_setting('protocol_backend_compression_allowed_algorithms')!='zstd,lz4' AS skip_test \gset +\if :skip_test + \echo '*** skipping protocol compression tests with lz4 and zstd (not supported) ***' + \quit +\endif +SHOW protocol_backend_compression_allowed_algorithms; + protocol_backend_compression_allowed_algorithms +------------------------------------------------- + zstd,lz4 +(1 row) + +-- Directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR +----------- +-- Test protocol_backend_compression GUC +----------- +-- Force threshold to 0 to compress every message +SET protocol_backend_compression_threshold=0; +-- Disable compression without active compression +SET protocol_backend_compression = 'none'; +-- Test lz4 -> none -> lz4 +SET protocol_backend_compression = 'lz4'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'lz4'; +-- Test lz4 -> none -> lz4 + using compressor +SET protocol_backend_compression = 'lz4'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'lz4'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- Test zstd -> none -> zstd +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'zstd'; +-- Test zstd -> none -> zstd + using compressor +SET protocol_backend_compression = 'zstd'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- Test none -> zstd -> none +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'none'; +-- Test none -> zstd -> none + using compressor +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- Test none -> lz4 -> none +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'lz4'; +SET protocol_backend_compression = 'none'; +-- Test none -> lz4 -> none + using compressor +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'lz4'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- Disabling compression +SET protocol_backend_compression = 'none'; +-- Test unsupported algorithm +SET protocol_backend_compression = 'gzip'; +ERROR: gzip compression is not permitted by "protocol_backend_compression_allowed_algorithms" +-- Test unrecognized algorithm +SET protocol_backend_compression = 'bogus'; +ERROR: invalid value for parameter "protocol_backend_compression": "bogus" +-- Test none -> unsupported -> bogus +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'gzip'; +ERROR: gzip compression is not permitted by "protocol_backend_compression_allowed_algorithms" +SET protocol_backend_compression = 'bogus'; +ERROR: invalid value for parameter "protocol_backend_compression": "bogus" +-- Test supported specifications +SET protocol_backend_compression = 'zstd'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd:5'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd:-10'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd:level=-10'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd:level=-10,workers=0'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd:level=-10,workers=0,long=1'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'lz4'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'lz4:5'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'none'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'none:0'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- Test incorrect specifications +SET protocol_backend_compression = 'zstd:999'; +ERROR: invalid compression specification: compression algorithm "zstd" expects a compression level between -131072 and 22 (default at 3) +SET protocol_backend_compression = 'lz4:999'; +ERROR: invalid compression specification: compression algorithm "lz4" expects a compression level between 1 and 12 (default at 0) +SET protocol_backend_compression = 'zstd:lvel=1'; +ERROR: invalid compression specification: unrecognized compression option: "lvel" +SET protocol_backend_compression = 'zstd:workers=4'; +ERROR: protocol compression does not support compression workers +SET protocol_backend_compression = 'zstd:long=3'; +ERROR: invalid compression specification: value for compression option "long" must be a Boolean value +SET protocol_backend_compression = 'lz4:long=1'; +ERROR: invalid compression specification: compression algorithm "lz4" does not support long-distance mode +SET protocol_backend_compression = 'lz4:workers=1'; +ERROR: invalid compression specification: compression algorithm "lz4" does not accept a worker count +SET protocol_backend_compression = 'none:long=1'; +ERROR: invalid compression specification: compression algorithm "none" does not support long-distance mode +SET protocol_backend_compression = 'none:workers=1'; +ERROR: invalid compression specification: compression algorithm "none" does not accept a worker count +SET protocol_backend_compression = 'none:2'; +ERROR: invalid compression specification: compression algorithm "none" does not accept a compression level +-- Test compressor context teardown/setup +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'lz4'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'lz4'; +-- Test enabling/disabling long distance +SET protocol_backend_compression = 'zstd:level=19,long=1'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'zstd:level=19,long=0'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +-- Test changing lz4 compression level +SET protocol_backend_compression = 'lz4:level=12'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +SET protocol_backend_compression = 'lz4:level=2'; +SELECT 1; + ?column? +---------- + 1 +(1 row) + +----------- +-- Test protocol_backend_compression_allowed_algorithms GUC +----------- +-- With only lz4 allowed, switching to zstd should fail +SET protocol_backend_compression_allowed_algorithms = 'lz4'; +SHOW protocol_backend_compression_allowed_algorithms; + protocol_backend_compression_allowed_algorithms +------------------------------------------------- + lz4 +(1 row) + +SET protocol_backend_compression = 'zstd'; +ERROR: zstd compression is not permitted by "protocol_backend_compression_allowed_algorithms" +-- Unsupported and unrecognized algorithms are rejected, without changing +-- the previous valid setting. +SET protocol_backend_compression_allowed_algorithms = 'gzip'; +ERROR: invalid value for parameter "protocol_backend_compression_allowed_algorithms": "gzip" +DETAIL: gzip compression is not supported +SET protocol_backend_compression_allowed_algorithms = 'bogus'; +ERROR: invalid value for parameter "protocol_backend_compression_allowed_algorithms": "bogus" +DETAIL: Invalid compression algorithm "bogus". +SHOW protocol_backend_compression_allowed_algorithms; + protocol_backend_compression_allowed_algorithms +------------------------------------------------- + lz4 +(1 row) + +-- Disabling compression is always allowed +SET protocol_backend_compression_allowed_algorithms = 'none'; +SET protocol_backend_compression_allowed_algorithms = ''; +SHOW protocol_backend_compression_allowed_algorithms; + protocol_backend_compression_allowed_algorithms +------------------------------------------------- + +(1 row) + +SET protocol_backend_compression = 'none'; +-- With every algorithm forbidden, enabling compression should fail +SET protocol_backend_compression = 'zstd'; +ERROR: zstd compression is not permitted by "protocol_backend_compression_allowed_algorithms" +SET protocol_backend_compression = 'lz4'; +ERROR: lz4 compression is not permitted by "protocol_backend_compression_allowed_algorithms" +----------- +-- Test large object with compression +----------- +SET protocol_backend_compression_allowed_algorithms = 'zstd,lz4'; +SET protocol_backend_compression_threshold=0; +SET protocol_backend_compression='zstd'; +\set filename :abs_srcdir '/data/tenk.data' +\lo_import :filename +\set newloid :LASTOID +-- just make sure \lo_export does not barf +\set filename :abs_builddir '/results/lotest_compression.txt' +\lo_export :newloid :filename +\lo_unlink :newloid diff --git a/src/test/regress/expected/protocol_compression_1.out b/src/test/regress/expected/protocol_compression_1.out new file mode 100644 index 00000000000..ce789b2005f --- /dev/null +++ b/src/test/regress/expected/protocol_compression_1.out @@ -0,0 +1,9 @@ +-- Allow all available compression algorithms +SET protocol_backend_compression_allowed_algorithms = 'zstd,lz4'; +ERROR: invalid value for parameter "protocol_backend_compression_allowed_algorithms": "zstd,lz4" +DETAIL: lz4 compression is not supported by this build +SELECT current_setting('protocol_backend_compression_allowed_algorithms')!='zstd,lz4' AS skip_test \gset +\if :skip_test + \echo '*** skipping protocol compression tests with lz4 and zstd (not supported) ***' +*** skipping protocol compression tests with lz4 and zstd (not supported) *** + \quit diff --git a/src/test/regress/expected/protocol_compression_2.out b/src/test/regress/expected/protocol_compression_2.out new file mode 100644 index 00000000000..0ccefbff328 --- /dev/null +++ b/src/test/regress/expected/protocol_compression_2.out @@ -0,0 +1,9 @@ +-- Allow all available compression algorithms +SET protocol_backend_compression_allowed_algorithms = 'zstd,lz4'; +ERROR: invalid value for parameter "protocol_backend_compression_allowed_algorithms": "zstd,lz4" +DETAIL: zstd compression is not supported by this build +SELECT current_setting('protocol_backend_compression_allowed_algorithms')!='zstd,lz4' AS skip_test \gset +\if :skip_test + \echo '*** skipping protocol compression tests with lz4 and zstd (not supported) ***' +*** skipping protocol compression tests with lz4 and zstd (not supported) *** + \quit diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 75063f87a4a..8503eafb78b 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -128,7 +128,7 @@ test: partition_join partition_prune reloptions hash_part indexing partition_agg # ---------- # Another group of parallel tests (compression) # ---------- -test: compression compression_lz4 compression_pglz cluster +test: compression compression_lz4 compression_pglz cluster protocol_compression # event_trigger depends on create_am and cannot run concurrently with # any test that runs DDL diff --git a/src/test/regress/sql/protocol_compression.sql b/src/test/regress/sql/protocol_compression.sql new file mode 100644 index 00000000000..5af2adba3a8 --- /dev/null +++ b/src/test/regress/sql/protocol_compression.sql @@ -0,0 +1,185 @@ +-- Allow all available compression algorithms +SET protocol_backend_compression_allowed_algorithms = 'zstd,lz4'; +SELECT current_setting('protocol_backend_compression_allowed_algorithms')!='zstd,lz4' AS skip_test \gset +\if :skip_test + \echo '*** skipping protocol compression tests with lz4 and zstd (not supported) ***' + \quit +\endif +SHOW protocol_backend_compression_allowed_algorithms; + +-- Directory paths are passed to us in environment variables +\getenv abs_srcdir PG_ABS_SRCDIR +\getenv abs_builddir PG_ABS_BUILDDIR + +----------- +-- Test protocol_backend_compression GUC +----------- + +-- Force threshold to 0 to compress every message +SET protocol_backend_compression_threshold=0; + +-- Disable compression without active compression +SET protocol_backend_compression = 'none'; + +-- Test lz4 -> none -> lz4 +SET protocol_backend_compression = 'lz4'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'lz4'; + +-- Test lz4 -> none -> lz4 + using compressor +SET protocol_backend_compression = 'lz4'; +SELECT 1; +SET protocol_backend_compression = 'none'; +SELECT 1; +SET protocol_backend_compression = 'lz4'; +SELECT 1; + +-- Test zstd -> none -> zstd +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'zstd'; + +-- Test zstd -> none -> zstd + using compressor +SET protocol_backend_compression = 'zstd'; +SELECT 1; +SET protocol_backend_compression = 'none'; +SELECT 1; +SET protocol_backend_compression = 'zstd'; +SELECT 1; + +-- Test none -> zstd -> none +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'none'; + +-- Test none -> zstd -> none + using compressor +SET protocol_backend_compression = 'none'; +SELECT 1; +SET protocol_backend_compression = 'zstd'; +SELECT 1; +SET protocol_backend_compression = 'none'; +SELECT 1; + +-- Test none -> lz4 -> none +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'lz4'; +SET protocol_backend_compression = 'none'; + +-- Test none -> lz4 -> none + using compressor +SET protocol_backend_compression = 'none'; +SELECT 1; +SET protocol_backend_compression = 'lz4'; +SELECT 1; +SET protocol_backend_compression = 'none'; +SELECT 1; + +-- Disabling compression +SET protocol_backend_compression = 'none'; + +-- Test unsupported algorithm +SET protocol_backend_compression = 'gzip'; + +-- Test unrecognized algorithm +SET protocol_backend_compression = 'bogus'; + +-- Test none -> unsupported -> bogus +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'gzip'; +SET protocol_backend_compression = 'bogus'; + +-- Test supported specifications +SET protocol_backend_compression = 'zstd'; +SELECT 1; +SET protocol_backend_compression = 'zstd:5'; +SELECT 1; +SET protocol_backend_compression = 'zstd:-10'; +SELECT 1; +SET protocol_backend_compression = 'zstd:level=-10'; +SELECT 1; +SET protocol_backend_compression = 'zstd:level=-10,workers=0'; +SELECT 1; +SET protocol_backend_compression = 'zstd:level=-10,workers=0,long=1'; +SELECT 1; +SET protocol_backend_compression = 'lz4'; +SELECT 1; +SET protocol_backend_compression = 'lz4:5'; +SELECT 1; +SET protocol_backend_compression = 'none'; +SELECT 1; +SET protocol_backend_compression = 'none:0'; +SELECT 1; + +-- Test incorrect specifications +SET protocol_backend_compression = 'zstd:999'; +SET protocol_backend_compression = 'lz4:999'; +SET protocol_backend_compression = 'zstd:lvel=1'; +SET protocol_backend_compression = 'zstd:workers=4'; +SET protocol_backend_compression = 'zstd:long=3'; +SET protocol_backend_compression = 'lz4:long=1'; +SET protocol_backend_compression = 'lz4:workers=1'; +SET protocol_backend_compression = 'none:long=1'; +SET protocol_backend_compression = 'none:workers=1'; +SET protocol_backend_compression = 'none:2'; + +-- Test compressor context teardown/setup +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'lz4'; +SET protocol_backend_compression = 'none'; +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'lz4'; + +-- Test enabling/disabling long distance +SET protocol_backend_compression = 'zstd:level=19,long=1'; +SELECT 1; +SET protocol_backend_compression = 'zstd:level=19,long=0'; +SELECT 1; + +-- Test changing lz4 compression level +SET protocol_backend_compression = 'lz4:level=12'; +SELECT 1; +SET protocol_backend_compression = 'lz4:level=2'; +SELECT 1; + +----------- +-- Test protocol_backend_compression_allowed_algorithms GUC +----------- + +-- With only lz4 allowed, switching to zstd should fail +SET protocol_backend_compression_allowed_algorithms = 'lz4'; +SHOW protocol_backend_compression_allowed_algorithms; +SET protocol_backend_compression = 'zstd'; + +-- Unsupported and unrecognized algorithms are rejected, without changing +-- the previous valid setting. +SET protocol_backend_compression_allowed_algorithms = 'gzip'; +SET protocol_backend_compression_allowed_algorithms = 'bogus'; +SHOW protocol_backend_compression_allowed_algorithms; + +-- Disabling compression is always allowed +SET protocol_backend_compression_allowed_algorithms = 'none'; +SET protocol_backend_compression_allowed_algorithms = ''; +SHOW protocol_backend_compression_allowed_algorithms; +SET protocol_backend_compression = 'none'; + +-- With every algorithm forbidden, enabling compression should fail +SET protocol_backend_compression = 'zstd'; +SET protocol_backend_compression = 'lz4'; + +----------- +-- Test large object with compression +----------- +SET protocol_backend_compression_allowed_algorithms = 'zstd,lz4'; +SET protocol_backend_compression_threshold=0; +SET protocol_backend_compression='zstd'; + +\set filename :abs_srcdir '/data/tenk.data' + +\lo_import :filename + +\set newloid :LASTOID + +-- just make sure \lo_export does not barf +\set filename :abs_builddir '/results/lotest_compression.txt' +\lo_export :newloid :filename +\lo_unlink :newloid -- 2.50.1 (Apple Git-155)