]> granicus.if.org Git - postgresql/commitdiff
Fix ILIKE bug (only in multi-byte case)
authorTatsuo Ishii <ishii@postgresql.org>
Mon, 11 Dec 2000 05:00:18 +0000 (05:00 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
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