aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>1999-11-17 22:18:46 +0000
committerJan Wieck <JanWieck@Yahoo.com>1999-11-17 22:18:46 +0000
commit211ed36635e3135c1b2435d1ff87f07507ebbf0b (patch)
tree3707f47372078226cf839c65584daa07ff4c3024
parent79c3b71c1be3a79ec2d1f4d64bdef13f0e0a086a (diff)
downloadpostgresql-211ed36635e3135c1b2435d1ff87f07507ebbf0b.tar.gz
postgresql-211ed36635e3135c1b2435d1ff87f07507ebbf0b.zip
Some minor corrections to the LZ compression. In fact I wanted to
HAVE the required OID's first. Jan
-rw-r--r--src/backend/utils/adt/lztext.c25
-rw-r--r--src/backend/utils/adt/pg_lzcompress.c6
-rw-r--r--src/include/utils/pg_lzcompress.h31
3 files changed, 49 insertions, 13 deletions
diff --git a/src/backend/utils/adt/lztext.c b/src/backend/utils/adt/lztext.c
index 49c37def91d..a07ddebcf19 100644
--- a/src/backend/utils/adt/lztext.c
+++ b/src/backend/utils/adt/lztext.c
@@ -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;
}
diff --git a/src/backend/utils/adt/pg_lzcompress.c b/src/backend/utils/adt/pg_lzcompress.c
index 88721d30a2d..b3eb5e2a013 100644
--- a/src/backend/utils/adt/pg_lzcompress.c
+++ b/src/backend/utils/adt/pg_lzcompress.c
@@ -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
diff --git a/src/include/utils/pg_lzcompress.h b/src/include/utils/pg_lzcompress.h
index dba52fa5888..481fd24fab8 100644
--- a/src/include/utils/pg_lzcompress.h
+++ b/src/include/utils/pg_lzcompress.h
@@ -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 -