aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/like.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/like.c')
-rw-r--r--src/backend/utils/adt/like.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/src/backend/utils/adt/like.c b/src/backend/utils/adt/like.c
index 1603a4e61ae..4c4ca2c1936 100644
--- a/src/backend/utils/adt/like.c
+++ b/src/backend/utils/adt/like.c
@@ -11,7 +11,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/like.c,v 1.70 2007/09/21 22:52:52 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/like.c,v 1.71 2007/09/22 03:58:34 adunstan Exp $
*
*-------------------------------------------------------------------------
*/
@@ -36,6 +36,8 @@ static text *MB_do_like_escape(text *, text *);
static int UTF8_MatchText(char *t, int tlen, char *p, int plen);
+static int SB_IMatchText(char *t, int tlen, char *p, int plen);
+
static int GenericMatchText(char *s, int slen, char* p, int plen);
static int Generic_Text_IC_like(text *str, text *pat);
@@ -104,6 +106,12 @@ wchareq(char *p1, char *p2)
#include "like_match.c"
+/* setup to compile like_match.c for single byte case insensitive matches */
+#define MATCH_LOWER
+#define NextChar(p, plen) NextByte((p), (plen))
+#define MatchText SB_IMatchText
+
+#include "like_match.c"
/* setup to compile like_match.c for UTF8 encoding, using fast NextChar */
@@ -132,16 +140,33 @@ Generic_Text_IC_like(text *str, text *pat)
int slen,
plen;
- /* Force inputs to lower case to achieve case insensitivity */
- str = DatumGetTextP(DirectFunctionCall1(lower, PointerGetDatum(str)));
- pat = DatumGetTextP(DirectFunctionCall1(lower, PointerGetDatum(pat)));
- /* lower's result is never packed, so OK to use old macros here */
- s = VARDATA(str);
- slen = (VARSIZE(str) - VARHDRSZ);
- p = VARDATA(pat);
- plen = (VARSIZE(pat) - VARHDRSZ);
+ /* For efficiency reasons, in the single byte case we don't call
+ * lower() on the pattern and text, but instead call to_lower on each
+ * character. In the multi-byte case we don't have much choice :-(
+ */
- return GenericMatchText(s, slen, p, plen);
+ if (pg_database_encoding_max_length() > 1)
+ {
+ /* lower's result is never packed, so OK to use old macros here */
+ pat = DatumGetTextP(DirectFunctionCall1(lower, PointerGetDatum(pat)));
+ p = VARDATA(pat);
+ plen = (VARSIZE(pat) - VARHDRSZ);
+ str = DatumGetTextP(DirectFunctionCall1(lower, PointerGetDatum(str)));
+ s = VARDATA(str);
+ slen = (VARSIZE(str) - VARHDRSZ);
+ if (GetDatabaseEncoding() == PG_UTF8)
+ return UTF8_MatchText(s, slen, p, plen);
+ else
+ return MB_MatchText(s, slen, p, plen);
+ }
+ else
+ {
+ p = VARDATA_ANY(pat);
+ plen = VARSIZE_ANY_EXHDR(pat);
+ s = VARDATA_ANY(str);
+ slen = VARSIZE_ANY_EXHDR(str);
+ return SB_IMatchText(s, slen, p, plen);
+ }
}
/*