diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 5edaf106550f372d918a5303c7c2464b83d12cad..d344993b9992747cf56e074049d223ba70c34053 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -396,7 +396,7 @@ static relopt_int intRelOpts[] = "compress type (none, pglz or zstd. pgzstd isn't available now).", RELOPT_KIND_HEAP | RELOPT_KIND_BTREE }, - 0, 0, 2 + 0, 0, 4 }, { { diff --git a/src/backend/storage/page/page_compression.c b/src/backend/storage/page/page_compression.c index 7cd45892e29f3a085ff964dcb5fa983a407201df..8e7bbf2fe446761963e7d9ec901f0c86aabb16cd 100644 --- a/src/backend/storage/page/page_compression.c +++ b/src/backend/storage/page/page_compression.c @@ -6,6 +6,7 @@ #include "utils/rel.h" #include "utils/wait_event.h" #include "common/pg_lzcompress.h" +#include #ifdef USE_ZSTD #include #endif @@ -76,6 +77,8 @@ inline int CompressPageBufferBound(const char* page, uint8 algorithm) #endif case COMPRESS_ALGORITHM_PGZSTD: return BLCKSZ + 4; + case COMPRESS_ALGORITHM_ZLIB: + return compressBound(BLCKSZ - CompressReservedLen(page)); default: return -1; } @@ -218,6 +221,7 @@ int KPHCCompressPage(const char* src, char* dst, int dst_size, const KPHCRelFile size_t sizeOfHeaderData = SizeOfPageHeaderData; bool real_ByteConvert = false; bool success; + int ret; KPHCPageCompressData* pcdptr; char* data = ((KPHCPageCompressData*)dst)->data; PageHeaderData *page = (PageHeaderData *)src; @@ -253,6 +257,19 @@ int KPHCCompressPage(const char* src, char* dst, int dst_size, const KPHCRelFile return -1; #endif } + case COMPRESS_ALGORITHM_ZLIB: { + int level = option.compressLevel; + if (level == 0 || level < MIN_ZLIB_COMPRESSION_LEVEL || level > MAX_ZLIB_COMPRESSION_LEVEL) { + level = DEFAULT_ZLIB_COMPRESSION_LEVEL; + } + ret = compress2((Bytef *)data, (uLongf *)&dst_size, (const Bytef *)(src + sizeOfHeaderData), + BLCKSZ - sizeOfHeaderData, level); + if (ret != Z_OK) { + return -1; + } + compressed_size = dst_size; + break; + } default: return KPHC_COMPRESS_UNSUPPORTED_ERROR; } @@ -312,6 +329,8 @@ int KPHCDecompressPage(const char* src, char* dst) { int decompressed_size; char* data; + int ret; + int desLength; #ifdef USE_ZSTD uint32 size; #endif @@ -341,6 +360,14 @@ int KPHCDecompressPage(const char* src, char* dst) return -1; #endif break; + case KPHC_COMPRESS_ALGORITHM_ZLIB: + desLength = BLCKSZ - headerSize; + ret = uncompress((Bytef *)(dst + headerSize), (uLongf *)&desLength, data, ((KPHCPageCompressData*)src)->size); + if (ret != Z_OK) { + return -1; + } + decompressed_size = desLength; + break; default: return KPHC_COMPRESS_UNSUPPORTED_ERROR; break; diff --git a/src/include/storage/page_compression.h b/src/include/storage/page_compression.h index 16d53b067e3e4e3a4d8587f35bade17f502e35e3..88f24060e02c63a7831974bfb67ba98123dbe678 100644 --- a/src/include/storage/page_compression.h +++ b/src/include/storage/page_compression.h @@ -26,13 +26,18 @@ #define COMPRESS_ALGORITHM_PGLZ 1 #define COMPRESS_ALGORITHM_ZSTD 2 #define COMPRESS_ALGORITHM_PGZSTD 3 +#define COMPRESS_ALGORITHM_ZLIB 4 #define KPHC_COMPRESS_ALGORITHM_PGLZ 1 #define KPHC_COMPRESS_ALGORITHM_ZSTD 2 +#define KPHC_COMPRESS_ALGORITHM_ZLIB 4 #define KPHC_COMPRESS_UNSUPPORTED_ERROR (-2) #define KPHC_IS_COMPRESSED_MAINFORK(reln, forkNum) ((reln)->smgr_rnode.node.opt != 0 && (forkNum) == MAIN_FORKNUM) #define DEFAULT_ZSTD_COMPRESSION_LEVEL (1) +#define MIN_ZLIB_COMPRESSION_LEVEL (1) +#define MAX_ZLIB_COMPRESSION_LEVEL (9) +#define DEFAULT_ZLIB_COMPRESSION_LEVEL (1) #ifdef USE_ZSTD #define MIN_ZSTD_COMPRESSION_LEVEL ZSTD_minCLevel() #define MAX_ZSTD_COMPRESSION_LEVEL ZSTD_maxCLevel()