On 2021-Mar-19, Robert Haas wrote:

> On Fri, Mar 19, 2021 at 10:11 AM Dilip Kumar <dilipbal...@gmail.com> wrote:
> > Also added a test case for vacuum full to recompress the data.
> 
> I committed the core patch (0003) with a bit more editing.  Let's see
> what the buildfarm thinks.

I updated the coverage script to use --with-lz4; results are updated.
While eyeballing the results I noticed this bit in
lz4_decompress_datum_slice():

+   /* slice decompression not supported prior to 1.8.3 */
+   if (LZ4_versionNumber() < 10803)
+       return lz4_decompress_datum(value);

which I read as returning the complete decompressed datum if slice
decompression is not supported.  I thought that was a bug, but looking
at the caller I realize that this isn't really a problem, since it's
detoast_attr_slice's responsibility to slice the result further -- no
bug, it's just wasteful.  I suggest to add comments to this effect,
perhaps as the attached (feel free to reword, I think mine is awkward.)

-- 
Álvaro Herrera                            39°49'30"S 73°17'W
Si no sabes adonde vas, es muy probable que acabes en otra parte.
diff --git a/src/backend/access/common/detoast.c b/src/backend/access/common/detoast.c
index 2fef40c2e9..6c79bd2a40 100644
--- a/src/backend/access/common/detoast.c
+++ b/src/backend/access/common/detoast.c
@@ -497,6 +497,9 @@ toast_decompress_datum(struct varlena *attr)
  * Decompress the front of a compressed version of a varlena datum.
  * offset handling happens in detoast_attr_slice.
  * Here we just decompress a slice from the front.
+ *
+ * If slice decompression is not supported, the return datum is the
+ * decompression of the full datum.
  */
 static struct varlena *
 toast_decompress_datum_slice(struct varlena *attr, int32 slicelength)
diff --git a/src/backend/access/common/toast_compression.c b/src/backend/access/common/toast_compression.c
index a6f8b79a9e..080ddcf93c 100644
--- a/src/backend/access/common/toast_compression.c
+++ b/src/backend/access/common/toast_compression.c
@@ -203,6 +203,9 @@ lz4_decompress_datum(const struct varlena *value)
 
 /*
  * Decompress part of a varlena that was compressed using LZ4.
+ *
+ * If slice decompression is not supported, the return datum is the
+ * decompression of the full datum.
  */
 struct varlena *
 lz4_decompress_datum_slice(const struct varlena *value, int32 slicelength)

Reply via email to