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)