static int SB_MatchText(const char *t, int tlen, const char *p, int plen,
- pg_locale_t locale, bool locale_is_c);
+ pg_locale_t locale);
static text *SB_do_like_escape(text *pat, text *esc);
static int MB_MatchText(const char *t, int tlen, const char *p, int plen,
- pg_locale_t locale, bool locale_is_c);
+ pg_locale_t locale);
static text *MB_do_like_escape(text *pat, text *esc);
static int UTF8_MatchText(const char *t, int tlen, const char *p, int plen,
- pg_locale_t locale, bool locale_is_c);
+ pg_locale_t locale);
static int SB_IMatchText(const char *t, int tlen, const char *p, int plen,
- pg_locale_t locale, bool locale_is_c);
+ pg_locale_t locale);
static int GenericMatchText(const char *s, int slen, const char *p, int plen, Oid collation);
static int Generic_Text_IC_like(text *str, text *pat, Oid collation);
* fold-on-the-fly processing, however.
*/
static char
-SB_lower_char(unsigned char c, pg_locale_t locale, bool locale_is_c)
+SB_lower_char(unsigned char c, pg_locale_t locale)
{
- if (locale_is_c)
+ if (locale->ctype_is_c)
return pg_ascii_tolower(c);
else
return tolower_l(c, locale->info.lt);
#include "like_match.c"
/* setup to compile like_match.c for single byte case insensitive matches */
-#define MATCH_LOWER(t) SB_lower_char((unsigned char) (t), locale, locale_is_c)
+#define MATCH_LOWER(t, locale) SB_lower_char((unsigned char) (t), locale)
#define NextChar(p, plen) NextByte((p), (plen))
#define MatchText SB_IMatchText
}
if (pg_database_encoding_max_length() == 1)
- return SB_MatchText(s, slen, p, plen, 0, true);
+ return SB_MatchText(s, slen, p, plen, 0);
else if (GetDatabaseEncoding() == PG_UTF8)
- return UTF8_MatchText(s, slen, p, plen, 0, true);
+ return UTF8_MatchText(s, slen, p, plen, 0);
else
- return MB_MatchText(s, slen, p, plen, 0, true);
+ return MB_MatchText(s, slen, p, plen, 0);
}
static inline int
s = VARDATA_ANY(str);
slen = VARSIZE_ANY_EXHDR(str);
if (GetDatabaseEncoding() == PG_UTF8)
- return UTF8_MatchText(s, slen, p, plen, 0, true);
+ return UTF8_MatchText(s, slen, p, plen, 0);
else
- return MB_MatchText(s, slen, p, plen, 0, true);
+ return MB_MatchText(s, slen, p, plen, 0);
}
else
{
plen = VARSIZE_ANY_EXHDR(pat);
s = VARDATA_ANY(str);
slen = VARSIZE_ANY_EXHDR(str);
- return SB_IMatchText(s, slen, p, plen, locale, locale->ctype_is_c);
+ return SB_IMatchText(s, slen, p, plen, locale);
}
}
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
- result = (SB_MatchText(s, slen, p, plen, 0, true) == LIKE_TRUE);
+ result = (SB_MatchText(s, slen, p, plen, 0) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
- result = (SB_MatchText(s, slen, p, plen, 0, true) != LIKE_TRUE);
+ result = (SB_MatchText(s, slen, p, plen, 0) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
*/
#ifdef MATCH_LOWER
-#define GETCHAR(t) MATCH_LOWER(t)
+#define GETCHAR(t, locale) MATCH_LOWER(t, locale)
#else
-#define GETCHAR(t) (t)
+#define GETCHAR(t, locale) (t)
#endif
static int
-MatchText(const char *t, int tlen, const char *p, int plen,
- pg_locale_t locale, bool locale_is_c)
+MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale)
{
/* Fast path for match-everything pattern */
if (plen == 1 && *p == '%')
ereport(ERROR,
(errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
errmsg("LIKE pattern must not end with escape character")));
- if (GETCHAR(*p) != GETCHAR(*t))
+ if (GETCHAR(*p, locale) != GETCHAR(*t, locale))
return LIKE_FALSE;
}
else if (*p == '%')
ereport(ERROR,
(errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
errmsg("LIKE pattern must not end with escape character")));
- firstpat = GETCHAR(p[1]);
+ firstpat = GETCHAR(p[1], locale);
}
else
- firstpat = GETCHAR(*p);
+ firstpat = GETCHAR(*p, locale);
while (tlen > 0)
{
- if (GETCHAR(*t) == firstpat)
+ if (GETCHAR(*t, locale) == firstpat)
{
- int matched = MatchText(t, tlen, p, plen,
- locale, locale_is_c);
+ int matched = MatchText(t, tlen, p, plen, locale);
if (matched != LIKE_FALSE)
return matched; /* TRUE or ABORT */
NextByte(p, plen);
continue;
}
- else if (GETCHAR(*p) != GETCHAR(*t))
+ else if (GETCHAR(*p, locale) != GETCHAR(*t, locale))
{
/* non-wildcard pattern char fails to match text char */
return LIKE_FALSE;