diff options
author | Jan Wieck <JanWieck@Yahoo.com> | 1999-11-25 01:28:07 +0000 |
---|---|---|
committer | Jan Wieck <JanWieck@Yahoo.com> | 1999-11-25 01:28:07 +0000 |
commit | 4069d48aa763bae9fad9b642276959e4749370fd (patch) | |
tree | 8e910bbd759d358e2074818390b5d641a5bcc644 /src/backend/utils/adt/lztext.c | |
parent | 4ae43c84c39c2659d80c9d02d103ba84d49045a4 (diff) | |
download | postgresql-4069d48aa763bae9fad9b642276959e4749370fd.tar.gz postgresql-4069d48aa763bae9fad9b642276959e4749370fd.zip |
Added another single byte oriented decompressor, useful for
comparision functions.
Added all lztext comparision functions, operators and a default
operator class for nbtree on lztext.
Jan
Diffstat (limited to 'src/backend/utils/adt/lztext.c')
-rw-r--r-- | src/backend/utils/adt/lztext.c | 145 |
1 files changed, 144 insertions, 1 deletions
diff --git a/src/backend/utils/adt/lztext.c b/src/backend/utils/adt/lztext.c index 6ff128515b6..ef31094fb51 100644 --- a/src/backend/utils/adt/lztext.c +++ b/src/backend/utils/adt/lztext.c @@ -1,7 +1,7 @@ /* ---------- * lztext.c - * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.3 1999/11/24 03:45:12 ishii Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.4 1999/11/25 01:28:04 wieck Exp $ * * Text type with internal LZ compressed representation. Uses the * standard PostgreSQL compression method. @@ -290,3 +290,146 @@ lztext_text(lztext *lz) } +/* ---------- + * lztext_cmp - + * + * Comparision function for two lztext datum's. + * + * Returns -1, 0 or 1. + * ---------- + */ +int32 +lztext_cmp(lztext *lz1, lztext *lz2) +{ +#ifdef USE_LOCALE + + char *cp1; + char *cp2; + int result; + + if (lz1 == NULL || lz2 == NULL) + return (int32)0; + + cp1 = lztextout(lz1); + cp2 = lztextout(lz2); + + result = strcoll(cp1, cp2); + + pfree(cp1); + pfree(cp2); + + return result; + +#else /* !USE_LOCALE */ + + PGLZ_DecompState ds1; + PGLZ_DecompState ds2; + int c1; + int c2; + int32 result = (int32)0; + + if (lz1 == NULL || lz2 == NULL) + return (int32)0; + + pglz_decomp_init(&ds1, lz1); + pglz_decomp_init(&ds2, lz2); + + for(;;) + { + c1 = pglz_decomp_getchar(&ds1); + c2 = pglz_decomp_getchar(&ds2); + + if (c1 == EOF) + { + if (c2 != EOF) + result = (int32)-1; + break; + } else { + if (c2 == EOF) + { + result = (int32)1; + } + } + if (c1 != c2) + { + result = (int32)(c1 - c2); + break; + } + } + + pglz_decomp_end(&ds1); + pglz_decomp_end(&ds2); + + return result; + +#endif /* USE_LOCALE */ +} + + +/* ---------- + * lztext_eq ... - + * + * =, !=, >, >=, < and <= operator functions for two + * lztext datums. + * ---------- + */ +bool +lztext_eq(lztext *lz1, lztext *lz2) +{ + if (lz1 == NULL || lz2 == NULL) + return false; + + return (bool)(lztext_cmp(lz1, lz2) == 0); +} + + +bool +lztext_ne(lztext *lz1, lztext *lz2) +{ + if (lz1 == NULL || lz2 == NULL) + return false; + + return (bool)(lztext_cmp(lz1, lz2) != 0); +} + + +bool +lztext_gt(lztext *lz1, lztext *lz2) +{ + if (lz1 == NULL || lz2 == NULL) + return false; + + return (bool)(lztext_cmp(lz1, lz2) > 0); +} + + +bool +lztext_ge(lztext *lz1, lztext *lz2) +{ + if (lz1 == NULL || lz2 == NULL) + return false; + + return (bool)(lztext_cmp(lz1, lz2) >= 0); +} + + +bool +lztext_lt(lztext *lz1, lztext *lz2) +{ + if (lz1 == NULL || lz2 == NULL) + return false; + + return (bool)(lztext_cmp(lz1, lz2) < 0); +} + + +bool +lztext_le(lztext *lz1, lztext *lz2) +{ + if (lz1 == NULL || lz2 == NULL) + return false; + + return (bool)(lztext_cmp(lz1, lz2) <= 0); +} + + |