Fix ILIKE bug (only in multi-byte case)
authorTatsuo Ishii
Mon, 11 Dec 2000 05:00:18 +0000 (05:00 +0000)
committerTatsuo Ishii
Mon, 11 Dec 2000 05:00:18 +0000 (05:00 +0000)
src/backend/utils/adt/like.c

index 41e86648b8789aa449bf549f29a28d20d38f2115..5df0680a0c4e74cac21511531e7c86a53ed34bfa 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/like.c,v 1.42 2000/09/15 18:45:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/like.c,v 1.43 2000/12/11 05:00:18 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -63,35 +63,34 @@ static int wchareq(unsigned char *p1, unsigned char *p2)
  * If they match, returns 1 otherwise returns 0.
  *--------------------
  */
-#define UCHARMAX 0xff
+#define CHARMAX 0x80
 
 static int iwchareq(unsigned char *p1, unsigned char *p2)
 {
-   int c1, c2;
+   int c1[2], c2[2];
    int l;
 
-   /* short cut. if *p1 and *p2 is lower than UCHARMAX, then
-      we assume they are ASCII */
-   if (*p1 < UCHARMAX && *p2 < UCHARMAX)
+   /* short cut. if *p1 and *p2 is lower than CHARMAX, then
+      we could assume they are ASCII */
+   if (*p1 < CHARMAX && *p2 < CHARMAX)
        return(tolower(*p1) == tolower(*p2));
 
-   if (*p1 < UCHARMAX)
-       c1 = tolower(*p1);
-   else
-   {
-       l = pg_mblen(p1);
-       (void)pg_mb2wchar_with_len(p1, (pg_wchar *)&c1, l);
-       c1 = tolower(c1);
-   }
-   if (*p2 < UCHARMAX)
-       c2 = tolower(*p2);
-   else
-   {
-       l = pg_mblen(p2);
-       (void)pg_mb2wchar_with_len(p2, (pg_wchar *)&c2, l);
-       c2 = tolower(c2);
-   }
-   return(c1 == c2);
+   /* if one of them is an ASCII while the other is not, then
+      they must be different characters
+   */
+   else if (*p1 < CHARMAX || *p2 < CHARMAX)
+       return(0);
+
+   /* ok, p1 and p2 are both > CHARMAX, then they must be multi-byte
+      characters
+   */
+   l = pg_mblen(p1);
+   (void)pg_mb2wchar_with_len(p1, (pg_wchar *)c1, l);
+   c1[0] = tolower(c1[0]);
+   l = pg_mblen(p2);
+   (void)pg_mb2wchar_with_len(p2, (pg_wchar *)c2, l);
+   c2[0] = tolower(c2[0]);
+   return(c1[0] == c2[0]);
 }
 
 #endif