diff --git a/src/backend/access/common/reloptions_gp.c b/src/backend/access/common/reloptions_gp.c index cbfe5d7e28a..591dbb3e38c 100644 --- a/src/backend/access/common/reloptions_gp.c +++ b/src/backend/access/common/reloptions_gp.c @@ -33,6 +33,7 @@ #include "utils/memutils.h" #include "miscadmin.h" #include "nodes/makefuncs.h" +#include "storage/gp_compress.h" /* * Helper macro used for validation @@ -960,13 +961,13 @@ validate_and_adjust_options(StdRdOptions *result, if (result->compresstype[0] && (pg_strcasecmp(result->compresstype, "rle_type") == 0) && - (result->compresslevel > 4)) + (result->compresslevel > RLE_MAX_LEVEL)) { if (validate) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("compresslevel=%d is out of range for rle_type (should be in the range 1 to 4)", - result->compresslevel))); + errmsg("compresslevel=%d is out of range for rle_type (should be in the range 1 to %d)", + result->compresslevel, RLE_MAX_LEVEL))); result->compresslevel = setDefaultCompressionLevel(result->compresstype); } diff --git a/src/backend/utils/datumstream/datumstream.c b/src/backend/utils/datumstream/datumstream.c index 53addc99a95..f46facd6fbc 100644 --- a/src/backend/utils/datumstream/datumstream.c +++ b/src/backend/utils/datumstream/datumstream.c @@ -434,7 +434,19 @@ init_datumstream_info( ao_attr->compressType = "zlib"; ao_attr->compressLevel = 9; break; +#ifdef USE_ZSTD + case 5: + ao_attr->compress = true; + ao_attr->compressType = "zstd"; + ao_attr->compressLevel = 1; + break; + case 6: + ao_attr->compress = true; + ao_attr->compressType = "zstd"; + ao_attr->compressLevel = 3; /* zstd recommended default */ + break; +#endif default: ereport(ERROR, (errmsg("Unexpected compresslevel %d", diff --git a/src/include/storage/gp_compress.h b/src/include/storage/gp_compress.h index 24f7f3c8501..2f523c0d9e6 100644 --- a/src/include/storage/gp_compress.h +++ b/src/include/storage/gp_compress.h @@ -80,6 +80,12 @@ typedef struct extern void zstd_free_context(zstd_context *context); extern zstd_context *zstd_alloc_context(void); +#define RLE_MAX_LEVEL (6) + +#else + +#define RLE_MAX_LEVEL (4) + #endif /* USE_ZSTD */ diff --git a/src/test/regress/expected/dsp.out b/src/test/regress/expected/dsp.out index dbf39acdee8..d7f88cd9645 100644 --- a/src/test/regress/expected/dsp.out +++ b/src/test/regress/expected/dsp.out @@ -555,22 +555,22 @@ show gp_default_storage_options; blocksize=32768,compresstype=zlib,compresslevel=5,checksum=true (1 row) --- negative tests - should fail due to invalid combinations of --- compresslevel and compresstype. +-- RLE can inherit compresslevel=5 from the default storage options. create table co6( a int encoding (compresstype=rle_type), b float encoding (blocksize=8192)) distributed by (a); -ERROR: compresslevel=5 is out of range for rle_type (should be in the range 1 to 4) +-- negative tests - should fail due to invalid combinations of +-- compresslevel and compresstype. create table co7(a int, b float, default column encoding (compresstype=RLE_TYPE, compresslevel=7)) distributed by (a); -ERROR: compresslevel=7 is out of range for rle_type (should be in the range 1 to 4) +ERROR: compresslevel=7 is out of range for rle_type (should be in the range 1 to 6) -- negative tests - session level set set gp_default_storage_options = "compresstype=zlib,compresslevel=11"; ERROR: compresslevel=11 is out of range for zlib (should be in the range 1 to 9) -set gp_default_storage_options = "compresslevel=5,compresstype=RLE_TYPE"; -ERROR: compresslevel=5 is out of range for rle_type (should be in the range 1 to 4) +set gp_default_storage_options = "compresslevel=7,compresstype=RLE_TYPE"; +ERROR: compresslevel=7 is out of range for rle_type (should be in the range 1 to 6) set gp_default_storage_options = "compresslevel=1,compresstype=rle"; ERROR: unknown compresstype "rle" set gp_default_storage_options = "checksum=1234"; diff --git a/src/test/regress/expected/rle.out b/src/test/regress/expected/rle.out index 29543f9dd53..765d746db02 100644 --- a/src/test/regress/expected/rle.out +++ b/src/test/regress/expected/rle.out @@ -11329,3 +11329,36 @@ insert into sml_rle_hdr values (-1,-1.1); set client_min_messages=warning; update sml_rle_hdr set b = b + 10 where a = -1; commit; +-- Some smoke tests against rle's levels using zstd +create table co_rle_zstd1(i int encoding(compresstype=rle_type, compresslevel=5)) with (appendonly=true, orientation=column); +create table co_rle_zstd3(i int encoding(compresstype=rle_type, compresslevel=6)) with (appendonly=true, orientation=column); +\d+ co_rle_zstd1 + Table "public.co_rle_zstd1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+---------+-----------+----------+---------+---------+--------------+------------------+-------------------+------------+------------- + i | integer | | | | plain | | rle_type | 5 | 32768 | +Checksum: t +Distributed by: (i) + +\d+ co_rle_zstd3 + Table "public.co_rle_zstd3" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Compression Type | Compression Level | Block Size | Description +--------+---------+-----------+----------+---------+---------+--------------+------------------+-------------------+------------+------------- + i | integer | | | | plain | | rle_type | 6 | 32768 | +Checksum: t +Distributed by: (i) + +insert into co_rle_zstd1 select generate_series(1, 100000); +insert into co_rle_zstd3 select generate_series(1, 100000); +select count(distinct i) from co_rle_zstd1; + count +-------- + 100000 +(1 row) + +select count(distinct i) from co_rle_zstd3; + count +-------- + 100000 +(1 row) + diff --git a/src/test/regress/sql/dsp.sql b/src/test/regress/sql/dsp.sql index da32900afdc..a4146ed4f48 100644 --- a/src/test/regress/sql/dsp.sql +++ b/src/test/regress/sql/dsp.sql @@ -245,18 +245,19 @@ show gp_default_storage_options; set default_table_access_method = ao_column; set gp_default_storage_options = "compresslevel=5"; show gp_default_storage_options; --- negative tests - should fail due to invalid combinations of --- compresslevel and compresstype. +-- RLE can inherit compresslevel=5 from the default storage options. create table co6( a int encoding (compresstype=rle_type), b float encoding (blocksize=8192)) distributed by (a); +-- negative tests - should fail due to invalid combinations of +-- compresslevel and compresstype. create table co7(a int, b float, default column encoding (compresstype=RLE_TYPE, compresslevel=7)) distributed by (a); -- negative tests - session level set set gp_default_storage_options = "compresstype=zlib,compresslevel=11"; -set gp_default_storage_options = "compresslevel=5,compresstype=RLE_TYPE"; +set gp_default_storage_options = "compresslevel=7,compresstype=RLE_TYPE"; set gp_default_storage_options = "compresslevel=1,compresstype=rle"; set gp_default_storage_options = "checksum=1234"; set gp_default_storage_options = "blocksize=true"; diff --git a/src/test/regress/sql/rle.sql b/src/test/regress/sql/rle.sql index d14f6182236..63600a0f898 100644 --- a/src/test/regress/sql/rle.sql +++ b/src/test/regress/sql/rle.sql @@ -4851,3 +4851,13 @@ insert into sml_rle_hdr values (-1,-1.1); set client_min_messages=warning; update sml_rle_hdr set b = b + 10 where a = -1; commit; + +-- Some smoke tests against rle's levels using zstd +create table co_rle_zstd1(i int encoding(compresstype=rle_type, compresslevel=5)) with (appendonly=true, orientation=column); +create table co_rle_zstd3(i int encoding(compresstype=rle_type, compresslevel=6)) with (appendonly=true, orientation=column); +\d+ co_rle_zstd1 +\d+ co_rle_zstd3 +insert into co_rle_zstd1 select generate_series(1, 100000); +insert into co_rle_zstd3 select generate_series(1, 100000); +select count(distinct i) from co_rle_zstd1; +select count(distinct i) from co_rle_zstd3;