Commit d81fd94d authored by Tatsuo Ishii's avatar Tatsuo Ishii

Fix ILIKE bug (only in multi-byte case)

parent e8caadef
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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) ...@@ -63,35 +63,34 @@ static int wchareq(unsigned char *p1, unsigned char *p2)
* If they match, returns 1 otherwise returns 0. * If they match, returns 1 otherwise returns 0.
*-------------------- *--------------------
*/ */
#define UCHARMAX 0xff #define CHARMAX 0x80
static int iwchareq(unsigned char *p1, unsigned char *p2) static int iwchareq(unsigned char *p1, unsigned char *p2)
{ {
int c1, c2; int c1[2], c2[2];
int l; int l;
/* short cut. if *p1 and *p2 is lower than UCHARMAX, then /* short cut. if *p1 and *p2 is lower than CHARMAX, then
we assume they are ASCII */ we could assume they are ASCII */
if (*p1 < UCHARMAX && *p2 < UCHARMAX) if (*p1 < CHARMAX && *p2 < CHARMAX)
return(tolower(*p1) == tolower(*p2)); return(tolower(*p1) == tolower(*p2));
if (*p1 < UCHARMAX) /* if one of them is an ASCII while the other is not, then
c1 = tolower(*p1); they must be different characters
else */
{ else if (*p1 < CHARMAX || *p2 < CHARMAX)
l = pg_mblen(p1); return(0);
(void)pg_mb2wchar_with_len(p1, (pg_wchar *)&c1, l);
c1 = tolower(c1); /* ok, p1 and p2 are both > CHARMAX, then they must be multi-byte
} characters
if (*p2 < UCHARMAX) */
c2 = tolower(*p2); l = pg_mblen(p1);
else (void)pg_mb2wchar_with_len(p1, (pg_wchar *)c1, l);
{ c1[0] = tolower(c1[0]);
l = pg_mblen(p2); l = pg_mblen(p2);
(void)pg_mb2wchar_with_len(p2, (pg_wchar *)&c2, l); (void)pg_mb2wchar_with_len(p2, (pg_wchar *)c2, l);
c2 = tolower(c2); c2[0] = tolower(c2[0]);
} return(c1[0] == c2[0]);
return(c1 == c2);
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment