mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
/* 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().
|
||||
* Returns -1, 0 or 1
|
||||
*/
|
||||
int
|
||||
varstr_cmp(unsigned char *arg1, int len1, unsigned char *arg2, int len2)
|
||||
{
|
||||
int result;
|
||||
unsigned char *a1p, *a2p;
|
||||
|
||||
#ifdef USE_LOCALE
|
||||
a1p = (unsigned char *) palloc(len1 + 1);
|
||||
a2p = (unsigned char *) palloc(len2 + 1);
|
||||
|
||||
memcpy(a1p, arg1, len1);
|
||||
*(a1p + len1) = '\0';
|
||||
memcpy(a2p, arg2, len2);
|
||||
*(a2p + len2) = '\0';
|
||||
|
||||
result = strcoll(a1p, a2p);
|
||||
|
||||
pfree(a1p);
|
||||
pfree(a2p);
|
||||
|
||||
#else
|
||||
|
||||
a1p = arg1;
|
||||
a2p = arg2;
|
||||
|
||||
result = strncmp(a1p, a2p, Min(len1, len2));
|
||||
if ((result == 0) && (len1 != len2))
|
||||
result = (len1 < len2) ? -1 : 1;
|
||||
#endif
|
||||
|
||||
return (result);
|
||||
} /* varstr_cmp() */
|
||||
|
||||
/* 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_lt(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) FALSE);
|
||||
|
||||
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))));
|
||||
|
||||
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.
|
||||
* 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
|
||||
*/
|
||||
bool
|
||||
text_le(text *arg1, text *arg2)
|
||||
{
|
||||
bool result;
|
||||
|
||||
#ifdef USE_LOCALE
|
||||
int cval;
|
||||
|
||||
#endif
|
||||
int len;
|
||||
unsigned char *a1p,
|
||||
*a2p;
|
||||
|
||||
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))));
|
||||
|
||||
pfree(a1p);
|
||||
pfree(a2p);
|
||||
#else
|
||||
a1p = (unsigned char *) VARDATA(arg1);
|
||||
a2p = (unsigned char *) VARDATA(arg2);
|
||||
|
||||
while (len != 0 && *a1p == *a2p)
|
||||
{
|
||||
a1p++;
|
||||
a2p++;
|
||||
len--;
|
||||
};
|
||||
|
||||
result = (len ? (*a1p <= *a2p) : (VARSIZE(arg1) <= VARSIZE(arg2)));
|
||||
#endif
|
||||
|
||||
return (result);
|
||||
return (bool)(text_cmp(arg1, arg2) <= 0);
|
||||
} /* text_le() */
|
||||
|
||||
bool
|
||||
|
||||
Reference in New Issue
Block a user