From: Jan Wieck Date: Wed, 17 Nov 1999 22:18:46 +0000 (+0000) Subject: Some minor corrections to the LZ compression. In fact I wanted to X-Git-Tag: REL7_0~1166 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=211ed36635e3135c1b2435d1ff87f07507ebbf0b;p=postgresql Some minor corrections to the LZ compression. In fact I wanted to HAVE the required OID's first. Jan --- diff --git a/src/backend/utils/adt/lztext.c b/src/backend/utils/adt/lztext.c index 49c37def91..a07ddebcf1 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 88721d30a2..b3eb5e2a01 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 dba52fa588..481fd24fab 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 -