diff options
| author | Bruce Momjian | 1998-06-16 06:42:02 +0000 |
|---|---|---|
| committer | Bruce Momjian | 1998-06-16 06:42:02 +0000 |
| commit | 8d8bcda2531bbae665c2cbe57dade4271b0eb087 (patch) | |
| tree | 1cb88a3b8fc135e89d6a070dff2244656696c90a /src/backend | |
| parent | 67a636918a85fb29333d6b3c8d576ffe62f7df9a (diff) | |
Hello!
Attached to the mail is locale-patch.tar.gz. In the archive
there are:
file README.locale
short description
directory src/test/locale
test suite; currently only koi8-r tests, but the suite can be
easily extended
file locale.patch
the very patch; to apply: patch < locale.patch; should be applied
to postgres-6.3.2 (at least I created it with 6.3.2 without any
additional
patches)
Files touched by the patch: src/include/utils/builtins.h
src/backend/utils/adt/char.c src/backend/utils/adt/varchar.c
src/backend/utils/adt/varlena.c
Oleg
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/utils/adt/varchar.c | 22 | ||||
| -rw-r--r-- | src/backend/utils/adt/varlena.c | 127 |
2 files changed, 60 insertions, 89 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 863e21e2cce..be7130896ef 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.33 1998/06/15 19:29:38 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.34 1998/06/16 06:41:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -475,7 +475,7 @@ bpcharlt(char *arg1, char *arg2) len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (cmp == 0) return (len1 < len2); else @@ -494,7 +494,7 @@ bpcharle(char *arg1, char *arg2) len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (0 == cmp) return (bool) (len1 <= len2 ? 1 : 0); else @@ -513,7 +513,7 @@ bpchargt(char *arg1, char *arg2) len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (cmp == 0) return (len1 > len2); else @@ -532,7 +532,7 @@ bpcharge(char *arg1, char *arg2) len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (0 == cmp) return (bool) (len1 >= len2 ? 1 : 0); else @@ -549,7 +549,7 @@ bpcharcmp(char *arg1, char *arg2) len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if ((0 == cmp) && (len1 != len2)) return (int32) (len1 < len2 ? -1 : 1); else @@ -641,7 +641,7 @@ varcharlt(char *arg1, char *arg2) len1 = VARSIZE(arg1) - VARHDRSZ; len2 = VARSIZE(arg2) - VARHDRSZ; - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (cmp == 0) return (len1 < len2); else @@ -660,7 +660,7 @@ varcharle(char *arg1, char *arg2) len1 = VARSIZE(arg1) - VARHDRSZ; len2 = VARSIZE(arg2) - VARHDRSZ; - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (0 == cmp) return (bool) (len1 <= len2 ? 1 : 0); else @@ -679,7 +679,7 @@ varchargt(char *arg1, char *arg2) len1 = VARSIZE(arg1) - VARHDRSZ; len2 = VARSIZE(arg2) - VARHDRSZ; - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (cmp == 0) return (len1 > len2); else @@ -698,7 +698,7 @@ varcharge(char *arg1, char *arg2) len1 = VARSIZE(arg1) - VARHDRSZ; len2 = VARSIZE(arg2) - VARHDRSZ; - cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if (0 == cmp) return (bool) (len1 >= len2 ? 1 : 0); else @@ -715,7 +715,7 @@ varcharcmp(char *arg1, char *arg2) len1 = VARSIZE(arg1) - VARHDRSZ; len2 = VARSIZE(arg2) - VARHDRSZ; - cmp = (strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2))); + cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2); if ((0 == cmp) && (len1 != len2)) return (int32) (len1 < len2 ? -1 : 1); else diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 46f74c41442..596863dd876 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.36 1998/06/15 19:29:38 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.37 1998/06/16 06:41:51 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -468,116 +468,87 @@ textne(text *arg1, text *arg2) return ((bool) !texteq(arg1, arg2)); } -/* text_lt() - * Comparison function for text strings. +/* varstr_cmp() + * Comparison function for text strings with given lengths. * Includes locale support, but must copy strings to temporary memory * to allow null-termination for inputs to strcoll(). - * XXX HACK code for textlen() indicates that there can be embedded nulls - * but it appears that most routines (incl. this one) assume not! - tgl 97/04/07 + * Returns -1, 0 or 1 */ -bool -text_lt(text *arg1, text *arg2) +int +varstr_cmp(unsigned char *arg1, int len1, unsigned char *arg2, int len2) { - bool result; - -#ifdef USE_LOCALE - int cval; - -#endif - int len; - unsigned char *a1p, - *a2p; - - if (arg1 == NULL || arg2 == NULL) - return ((bool) FALSE); - - len = (((VARSIZE(arg1) <= VARSIZE(arg2)) ? VARSIZE(arg1) : VARSIZE(arg2)) - VARHDRSZ); + int result; + unsigned char *a1p, *a2p; #ifdef USE_LOCALE - a1p = (unsigned char *) palloc(len + 1); - a2p = (unsigned char *) palloc(len + 1); + a1p = (unsigned char *) palloc(len1 + 1); + a2p = (unsigned char *) palloc(len2 + 1); - memcpy(a1p, VARDATA(arg1), len); - *(a1p + len) = '\0'; - memcpy(a2p, VARDATA(arg2), len); - *(a2p + len) = '\0'; + memcpy(a1p, arg1, len1); + *(a1p + len1) = '\0'; + memcpy(a2p, arg2, len2); + *(a2p + len2) = '\0'; - cval = strcoll(a1p, a2p); - result = ((cval < 0) || ((cval == 0) && (VARSIZE(arg1) < VARSIZE(arg2)))); + result = strcoll(a1p, a2p); pfree(a1p); pfree(a2p); + #else - a1p = (unsigned char *) VARDATA(arg1); - a2p = (unsigned char *) VARDATA(arg2); - while (len != 0 && *a1p == *a2p) - { - a1p++; - a2p++; - len--; - }; + a1p = arg1; + a2p = arg2; - result = (len ? (*a1p < *a2p) : (VARSIZE(arg1) < VARSIZE(arg2))); + result = strncmp(a1p, a2p, Min(len1, len2)); + if ((result == 0) && (len1 != len2)) + result = (len1 < len2) ? -1 : 1; #endif return (result); -} /* text_lt() */ +} /* varstr_cmp() */ -/* text_le() +/* text_cmp() * Comparison function for text strings. * Includes locale support, but must copy strings to temporary memory * to allow null-termination for inputs to strcoll(). * XXX HACK code for textlen() indicates that there can be embedded nulls * but it appears that most routines (incl. this one) assume not! - tgl 97/04/07 + * Returns -1, 0 or 1 */ -bool -text_le(text *arg1, text *arg2) +int +text_cmp(text *arg1, text *arg2) { - bool result; - -#ifdef USE_LOCALE - int cval; - -#endif - int len; - unsigned char *a1p, - *a2p; + unsigned char *a1p, *a2p; + int len1, len2; if (arg1 == NULL || arg2 == NULL) - return ((bool) 0); - - len = (((VARSIZE(arg1) <= VARSIZE(arg2)) ? VARSIZE(arg1) : VARSIZE(arg2)) - VARHDRSZ); - -#ifdef USE_LOCALE - a1p = (unsigned char *) palloc(len + 1); - a2p = (unsigned char *) palloc(len + 1); - - memcpy(a1p, VARDATA(arg1), len); - *(a1p + len) = '\0'; - memcpy(a2p, VARDATA(arg2), len); - *(a2p + len) = '\0'; - - cval = strcoll(a1p, a2p); - result = ((cval < 0) || ((cval == 0) && (VARSIZE(arg1) <= VARSIZE(arg2)))); + return ((bool) FALSE); - pfree(a1p); - pfree(a2p); -#else a1p = (unsigned char *) VARDATA(arg1); a2p = (unsigned char *) VARDATA(arg2); - while (len != 0 && *a1p == *a2p) - { - a1p++; - a2p++; - len--; - }; + len1 = VARSIZE(arg1) - VARHDRSZ; + len2 = VARSIZE(arg2) - VARHDRSZ; - result = (len ? (*a1p <= *a2p) : (VARSIZE(arg1) <= VARSIZE(arg2))); -#endif + return varstr_cmp(a1p, len1, a2p, len2); +} /* text_cmp() */ - return (result); +/* text_lt() + * Comparison function for text strings. + */ +bool +text_lt(text *arg1, text *arg2) +{ + return (bool)(text_cmp(arg1, arg2) < 0); +} /* text_lt() */ + +/* text_le() + * Comparison function for text strings. + */ +bool +text_le(text *arg1, text *arg2) +{ + return (bool)(text_cmp(arg1, arg2) <= 0); } /* text_le() */ bool |
