Some minor corrections to the LZ compression. In fact I wanted to
authorJan Wieck <JanWieck@Yahoo.com>
Wed, 17 Nov 1999 22:18:46 +0000 (22:18 +0000)
committerJan Wieck <JanWieck@Yahoo.com>
Wed, 17 Nov 1999 22:18:46 +0000 (22:18 +0000)
HAVE the required OID's first.

Jan

src/backend/utils/adt/lztext.c
src/backend/utils/adt/pg_lzcompress.c
src/include/utils/pg_lzcompress.h

index 49c37def91ded5622c4bc9cb273718cdf9dd15a4..a07ddebcf19876754a906b337f80e75b6fa423ff 100644 (file)
@@ -1,10 +1,13 @@
 /* ----------
  * lztext.c -
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.1 1999/11/17 21:21:50 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.2 1999/11/17 22:18:45 wieck Exp $
  *
  * Text type with internal LZ compressed representation. Uses the
  * standard PostgreSQL compression method.
+ *
+ * This code requires that the LZ compressor found in pg_lzcompress
+ * codes a usable VARSIZE word at the beginning of the output buffer.
  * ----------
  */
 
@@ -42,7 +45,7 @@ lztextin(char *str)
        return NULL;
 
    /* ----------
-    * Determine input size and eventually tuple size
+    * Determine input size and maximum output Datum size
     * ----------
     */
    rawsize = strlen(str);
@@ -56,8 +59,9 @@ lztextin(char *str)
    pglz_compress(str, rawsize, tmp, NULL);
 
    /* ----------
-    * If we miss less than x% bytes at the end of the temp value,
-    * so be it. Therefore we save a memcpy().
+    * If we miss less than 25% bytes at the end of the temp value,
+    * so be it. Therefore we save a palloc()/memcpy()/pfree()
+    * sequence.
     * ----------
     */
    if (tmp_size - tmp->varsize < 256 || 
@@ -141,7 +145,7 @@ lztextlen(lztext *lz)
     * without multibyte support, it's the remembered rawsize
     * ----------
     */
-   return lz->rawsize;
+   return PGLZ_RAW_SIZE(lz);
 }
 
 
@@ -166,7 +170,7 @@ lztextoctetlen(lztext *lz)
     * Return the varsize minus the VARSIZE field itself.
     * ----------
     */
-   return lz->varsize - sizeof(int32);
+   return VARSIZE(lz) - VARHDRSZ;
 }
 
 
@@ -208,8 +212,9 @@ text_lztext(text *txt)
    pglz_compress(str, rawsize, tmp, NULL);
 
    /* ----------
-    * If we miss less than x% bytes at the end of the temp value,
-    * so be it. Therefore we save a memcpy().
+    * If we miss less than 25% bytes at the end of the temp value,
+    * so be it. Therefore we save a palloc()/memcpy()/pfree()
+    * sequence.
     * ----------
     */
    if (tmp_size - tmp->varsize < 256 || 
@@ -250,15 +255,15 @@ lztext_text(lztext *lz)
     * Allocate and initialize the text result
     * ----------
     */
-   result = (text *) palloc(lz->rawsize + VARHDRSZ + 1);
+   result = (text *) palloc(PGLZ_RAW_SIZE(lz) + VARHDRSZ + 1);
    VARSIZE(result) = lz->rawsize + VARHDRSZ;
 
    /* ----------
     * Decompress directly into the text data area.
     * ----------
     */
-   pglz_decompress(lz, VARDATA(result));
    VARDATA(result)[lz->rawsize] = 0;
+   pglz_decompress(lz, VARDATA(result));
 
    return result;
 }
index 88721d30a2dca02ae8b68842728728d8c4a174cd..b3eb5e2a013d2f0d0a5efa3ac5081d2103ff181d 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * pg_lzcompress.c -
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_lzcompress.c,v 1.1 1999/11/17 21:21:50 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_lzcompress.c,v 1.2 1999/11/17 22:18:45 wieck Exp $
  *
  *     This is an implementation of LZ compression for PostgreSQL.
  *     It uses a simple history table and generates 2-3 byte tags
@@ -385,6 +385,8 @@ pglz_find_match (PGLZ_HistEntry **hstart, char *input, char *end,
 
 /* ----------
  * pglz_compress -
+ *
+ *     Compresses source into dest using strategy.
  * ----------
  */
 int
@@ -580,6 +582,8 @@ pglz_compress (char *source, int slen, PGLZ_Header *dest, PGLZ_Strategy *strateg
 
 /* ----------
  * pglz_decompress -
+ *
+ *     Decompresses source into dest.
  * ----------
  */
 int
index dba52fa5888c438679a19b5c60768b7dfc661c31..481fd24fab810b707c14803ce9d0e162694b302c 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * pg_lzcompress.h -
  *
- * $Header: /cvsroot/pgsql/src/include/utils/pg_lzcompress.h,v 1.1 1999/11/17 21:21:51 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/include/utils/pg_lzcompress.h,v 1.2 1999/11/17 22:18:46 wieck Exp $
  *
  * Definitions for the builtin LZ compressor
  * ----------
@@ -37,9 +37,36 @@ typedef struct PGLZ_Header {
  */
 #define PGLZ_MAX_OUTPUT(_dlen)         ((_dlen) + (((_dlen) | 0x07) >> 3)  \
                                                     + sizeof(PGLZ_Header))
+
+/* ----------
+ * PGLZ_RAW_SIZE -
+ *
+ *     Macro to determine the uncompressed data size contained
+ *     in the entry.
+ * ----------
+ */
 #define PGLZ_RAW_SIZE(_lzdata)         (_lzdata->rawsize)
+
+/* ----------
+ * PGLZ_IS_COMPRESSED -
+ *
+ *     Macro to determine if the data itself is stored as raw
+ *     uncompressed data.
+ * ----------
+ */
 #define PGLZ_IS_COMPRESSED(_lzdata)        (_lzdata->varsize !=                \
-                                        _lzdata->rawsize + sizeof(PGLZ_Header))
+                                        _lzdata->rawsize +                 \
+                                                       sizeof(PGLZ_Header))
+
+/* ----------
+ * PGLZ_RAW_DATA -
+ *
+ *     Macro to get access to the plain compressed or uncompressed
+ *     data. Useful if PGLZ_IS_COMPRESSED returns false.
+ * ----------
+ */
+#define PGLZ_RAW_DATA(_lzdata)         (((char *)(_lzdata)) +              \
+                                                       sizeof(PGLZ_Header))
 
 /* ----------
  * PGLZ_Strategy -