From be2c58b8dade4f85d0d7cd073af0b8d92fc50619 Mon Sep 17 00:00:00 2001 From: chenlinfeng <723609220@qq.com> Date: Mon, 10 Mar 2025 10:36:14 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0zlib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/access/common/reloptions.c | 2 +- src/backend/storage/page/page_compression.c | 10 ++++++++++ src/include/storage/page_compression.h | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 5edaf10..d344993 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 7cd4589..8b8624f 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,12 @@ int KPHCCompressPage(const char* src, char* dst, int dst_size, const KPHCRelFile return -1; #endif } + case COMPRESS_ALGORITHM_ZLIB: { + int level = option.compressLevelSymbol ? option.compressLevel : -option.compressLevel; + if (level == 0 || level < MIN_ZLIB_COMPRESSION_LEVEL || level > MAX_ZLIB_COMPRESSION_LEVEL) { + level = DEFAULT_ZLIB_COMPRESSION_LEVEL; + } + } default: return KPHC_COMPRESS_UNSUPPORTED_ERROR; } diff --git a/src/include/storage/page_compression.h b/src/include/storage/page_compression.h index 16d53b0..88f2406 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() -- Gitee From 29677741420b7236359105fe3dcc598761991c8f Mon Sep 17 00:00:00 2001 From: chenlinfeng <723609220@qq.com> Date: Mon, 10 Mar 2025 10:51:45 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0zlib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/storage/page/page_compression.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/page/page_compression.c b/src/backend/storage/page/page_compression.c index 8b8624f..932458b 100644 --- a/src/backend/storage/page/page_compression.c +++ b/src/backend/storage/page/page_compression.c @@ -258,10 +258,17 @@ int KPHCCompressPage(const char* src, char* dst, int dst_size, const KPHCRelFile #endif } case COMPRESS_ALGORITHM_ZLIB: { - int level = option.compressLevelSymbol ? option.compressLevel : -option.compressLevel; + 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; @@ -322,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 @@ -351,6 +360,13 @@ 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; default: return KPHC_COMPRESS_UNSUPPORTED_ERROR; break; -- Gitee From d9da651189a4087bbad7af265f2bcc30ef660b63 Mon Sep 17 00:00:00 2001 From: chenlinfeng <723609220@qq.com> Date: Mon, 10 Mar 2025 11:17:21 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0zlib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/storage/page/page_compression.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/page/page_compression.c b/src/backend/storage/page/page_compression.c index 932458b..8e7bbf2 100644 --- a/src/backend/storage/page/page_compression.c +++ b/src/backend/storage/page/page_compression.c @@ -262,7 +262,7 @@ int KPHCCompressPage(const char* src, char* dst, int dst_size, const KPHCRelFile 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)), + ret = compress2((Bytef *)data, (uLongf *)&dst_size, (const Bytef *)(src + sizeOfHeaderData), BLCKSZ - sizeOfHeaderData, level); if (ret != Z_OK) { return -1; @@ -362,11 +362,12 @@ int KPHCDecompressPage(const char* src, char* dst) break; case KPHC_COMPRESS_ALGORITHM_ZLIB: desLength = BLCKSZ - headerSize; - ret = uncompress((Bytef *)dst + headerSize), (uLongf *)&desLength, data, ((KPHCPageCompressData*)src)->size); + 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; -- Gitee