diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 52adbbb163f8f67f48a7ac34e9fef1a11d1065cf..75832856b6c7e89af7e4295929c9a447648a3e2f 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.162 2008/01/01 19:45:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/varlena.c,v 1.163 2008/03/13 18:31:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1003,6 +1003,19 @@ varstr_cmp(char *arg1, int len1, char *arg2, int len2) ereport(ERROR, (errmsg("could not compare Unicode strings: %m"))); + /* + * In some locales wcscoll() can claim that nonidentical strings + * are equal. Believing that would be bad news for a number of + * reasons, so we follow Perl's lead and sort "equal" strings + * according to strcmp (on the UTF-8 representation). + */ + if (result == 0) + { + result = strncmp(arg1, arg2, Min(len1, len2)); + if ((result == 0) && (len1 != len2)) + result = (len1 < len2) ? -1 : 1; + } + if (a1p != a1buf) pfree(a1p); if (a2p != a2buf)