From c0633fa03e7eefdf4bc5ab6f6608fe51368272a6 Mon Sep 17 00:00:00 2001
From: tomas <tomas>
Date: Wed, 18 Sep 2024 19:39:52 +0200
Subject: [PATCH] compression fixup

---
 .../logical/reorderbuffer_compression.c       | 40 +++++++++++++------
 1 file changed, 27 insertions(+), 13 deletions(-)

diff --git a/src/backend/replication/logical/reorderbuffer_compression.c b/src/backend/replication/logical/reorderbuffer_compression.c
index 6d19c60b60..6301ccc932 100644
--- a/src/backend/replication/logical/reorderbuffer_compression.c
+++ b/src/backend/replication/logical/reorderbuffer_compression.c
@@ -781,24 +781,38 @@ ReorderBufferCompress(ReorderBuffer *rb, ReorderBufferDiskHeader **header,
 				dst = (char *) palloc0(max_size);
 				dst_size = pglz_compress(src, src_size, dst, PGLZ_strategy_always);
 
-				if (dst_size < 0)
-					ereport(ERROR,
-							(errcode(ERRCODE_DATA_CORRUPTED),
-							 errmsg_internal("PGLZ compression failed")));
+				/*
+				 * If compression succeeded, build the proper compression header. If
+				 * compression fails, it means the data is not compressible. In that
+				 * case just build a no-compress item.
+				 */
+				if (dst_size > 0)		/* compressible */
+				{
+					ReorderBufferReserve(rb, (Size) (dst_size + sizeof(ReorderBufferDiskHeader)));
 
-				ReorderBufferReserve(rb, (Size) (dst_size + sizeof(ReorderBufferDiskHeader)));
+					hdr = (ReorderBufferDiskHeader *) rb->outbuf;
+					hdr->comp_strat = REORDER_BUFFER_STRAT_PGLZ;
+					hdr->size = (Size) dst_size + sizeof(ReorderBufferDiskHeader);
+					hdr->raw_size = (Size) src_size;
 
-				hdr = (ReorderBufferDiskHeader *) rb->outbuf;
-				hdr->comp_strat = REORDER_BUFFER_STRAT_PGLZ;
-				hdr->size = (Size) dst_size + sizeof(ReorderBufferDiskHeader);
-				hdr->raw_size = (Size) src_size;
+					/* Copy back compressed data into the ReorderBuffer */
+					memcpy((char *) rb->outbuf + sizeof(ReorderBufferDiskHeader), dst,
+						   dst_size);
+				}
+				else					/* not compressible */
+				{
+					hdr = (ReorderBufferDiskHeader *) rb->outbuf;
+					hdr->comp_strat = REORDER_BUFFER_STRAT_UNCOMPRESSED;
+					hdr->size = (Size) src_size + sizeof(ReorderBufferDiskHeader);
+					hdr->raw_size = (Size) src_size;
+
+					/* Copy back compressed data into the ReorderBuffer */
+					memcpy((char *) rb->outbuf + sizeof(ReorderBufferDiskHeader), src,
+						   src_size);
+				}
 
 				*header = hdr;
 
-				/* Copy back compressed data into the ReorderBuffer */
-				memcpy((char *) rb->outbuf + sizeof(ReorderBufferDiskHeader), dst,
-					   dst_size);
-
 				pfree(dst);
 
 				break;
-- 
2.39.2

