#include "postgres.h"#include <ctype.h>#include "catalog/pg_collation.h"#include "mb/pg_wchar.h"#include "utils/builtins.h"#include "utils/pg_locale.h"#include "like_match.c"
Go to the source code of this file.
Defines | |
| #define | LIKE_TRUE 1 |
| #define | LIKE_FALSE 0 |
| #define | LIKE_ABORT (-1) |
| #define | NextByte(p, plen) ((p)++, (plen)--) |
| #define | CHAREQ(p1, p2) wchareq((p1), (p2)) |
| #define | NextChar(p, plen) do { int __l = pg_mblen(p); (p) +=__l; (plen) -=__l; } while (0) |
| #define | CopyAdvChar(dst, src, srclen) |
| #define | MatchText MB_MatchText |
| #define | do_like_escape MB_do_like_escape |
| #define | CHAREQ(p1, p2) (*(p1) == *(p2)) |
| #define | NextChar(p, plen) NextByte((p), (plen)) |
| #define | CopyAdvChar(dst, src, srclen) (*(dst)++ = *(src)++, (srclen)--) |
| #define | MatchText SB_MatchText |
| #define | do_like_escape SB_do_like_escape |
| #define | MATCH_LOWER(t) SB_lower_char((unsigned char) (t), locale, locale_is_c) |
| #define | NextChar(p, plen) NextByte((p), (plen)) |
| #define | MatchText SB_IMatchText |
| #define | NextChar(p, plen) do { (p)++; (plen)--; } while ((plen) > 0 && (*(p) & 0xC0) == 0x80 ) |
| #define | MatchText UTF8_MatchText |
Functions | |
| static int | SB_MatchText (char *t, int tlen, char *p, int plen, pg_locale_t locale, bool locale_is_c) |
| static text * | SB_do_like_escape (text *, text *) |
| static int | MB_MatchText (char *t, int tlen, char *p, int plen, pg_locale_t locale, bool locale_is_c) |
| static text * | MB_do_like_escape (text *, text *) |
| static int | UTF8_MatchText (char *t, int tlen, char *p, int plen, pg_locale_t locale, bool locale_is_c) |
| static int | SB_IMatchText (char *t, int tlen, char *p, int plen, pg_locale_t locale, bool locale_is_c) |
| static int | GenericMatchText (char *s, int slen, char *p, int plen) |
| static int | Generic_Text_IC_like (text *str, text *pat, Oid collation) |
| static int | wchareq (char *p1, char *p2) |
| static char | SB_lower_char (unsigned char c, pg_locale_t locale, bool locale_is_c) |
| Datum | namelike (PG_FUNCTION_ARGS) |
| Datum | namenlike (PG_FUNCTION_ARGS) |
| Datum | textlike (PG_FUNCTION_ARGS) |
| Datum | textnlike (PG_FUNCTION_ARGS) |
| Datum | bytealike (PG_FUNCTION_ARGS) |
| Datum | byteanlike (PG_FUNCTION_ARGS) |
| Datum | nameiclike (PG_FUNCTION_ARGS) |
| Datum | nameicnlike (PG_FUNCTION_ARGS) |
| Datum | texticlike (PG_FUNCTION_ARGS) |
| Datum | texticnlike (PG_FUNCTION_ARGS) |
| Datum | like_escape (PG_FUNCTION_ARGS) |
| Datum | like_escape_bytea (PG_FUNCTION_ARGS) |
| #define CopyAdvChar | ( | dst, | ||
| src, | ||||
| srclen | ||||
| ) |
| #define CopyAdvChar | ( | dst, | ||
| src, | ||||
| srclen | ||||
| ) | (*(dst)++ = *(src)++, (srclen)--) |
| #define LIKE_FALSE 0 |
Definition at line 29 of file like.c.
Referenced by MatchText().
| #define MATCH_LOWER | ( | t | ) | SB_lower_char((unsigned char) (t), locale, locale_is_c) |
| #define NextByte | ( | p, | ||
| plen | ||||
| ) | ((p)++, (plen)--) |
Definition at line 105 of file like.c.
Referenced by MatchText().
| #define NextChar | ( | p, | ||
| plen | ||||
| ) | do { int __l = pg_mblen(p); (p) +=__l; (plen) -=__l; } while (0) |
Definition at line 142 of file like.c.
Referenced by MatchText().
| #define NextChar | ( | p, | ||
| plen | ||||
| ) | do { (p)++; (plen)--; } while ((plen) > 0 && (*(p) & 0xC0) == 0x80 ) |
| Datum bytealike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 314 of file like.c.
References PG_GETARG_BYTEA_PP, PG_RETURN_BOOL, SB_MatchText(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.
{
bytea *str = PG_GETARG_BYTEA_PP(0);
bytea *pat = PG_GETARG_BYTEA_PP(1);
bool result;
char *s,
*p;
int slen,
plen;
s = VARDATA_ANY(str);
slen = VARSIZE_ANY_EXHDR(str);
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
result = (SB_MatchText(s, slen, p, plen, 0, true) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum byteanlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 335 of file like.c.
References PG_GETARG_BYTEA_PP, PG_RETURN_BOOL, SB_MatchText(), VARDATA_ANY, and VARSIZE_ANY_EXHDR.
{
bytea *str = PG_GETARG_BYTEA_PP(0);
bytea *pat = PG_GETARG_BYTEA_PP(1);
bool result;
char *s,
*p;
int slen,
plen;
s = VARDATA_ANY(str);
slen = VARSIZE_ANY_EXHDR(str);
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
result = (SB_MatchText(s, slen, p, plen, 0, true) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Definition at line 161 of file like.c.
References DatumGetTextP, DEFAULT_COLLATION_OID, DirectFunctionCall1Coll(), ereport, errcode(), errhint(), errmsg(), ERROR, GetDatabaseEncoding(), lc_ctype_is_c(), locale, lower(), MB_MatchText(), OidIsValid, pg_database_encoding_max_length(), pg_newlocale_from_collation(), PointerGetDatum, SB_IMatchText(), UTF8_MatchText(), VARDATA, VARDATA_ANY, VARSIZE, and VARSIZE_ANY_EXHDR.
Referenced by nameiclike(), nameicnlike(), texticlike(), and texticnlike().
{
char *s,
*p;
int slen,
plen;
/*
* For efficiency reasons, in the single byte case we don't call lower()
* on the pattern and text, but instead call SB_lower_char on each
* character. In the multi-byte case we don't have much choice :-(
*/
if (pg_database_encoding_max_length() > 1)
{
/* lower's result is never packed, so OK to use old macros here */
pat = DatumGetTextP(DirectFunctionCall1Coll(lower, collation,
PointerGetDatum(pat)));
p = VARDATA(pat);
plen = (VARSIZE(pat) - VARHDRSZ);
str = DatumGetTextP(DirectFunctionCall1Coll(lower, collation,
PointerGetDatum(str)));
s = VARDATA(str);
slen = (VARSIZE(str) - VARHDRSZ);
if (GetDatabaseEncoding() == PG_UTF8)
return UTF8_MatchText(s, slen, p, plen, 0, true);
else
return MB_MatchText(s, slen, p, plen, 0, true);
}
else
{
/*
* Here we need to prepare locale information for SB_lower_char. This
* should match the methods used in str_tolower().
*/
pg_locale_t locale = 0;
bool locale_is_c = false;
if (lc_ctype_is_c(collation))
locale_is_c = true;
else if (collation != DEFAULT_COLLATION_OID)
{
if (!OidIsValid(collation))
{
/*
* This typically means that the parser could not resolve a
* conflict of implicit collations, so report it that way.
*/
ereport(ERROR,
(errcode(ERRCODE_INDETERMINATE_COLLATION),
errmsg("could not determine which collation to use for ILIKE"),
errhint("Use the COLLATE clause to set the collation explicitly.")));
}
locale = pg_newlocale_from_collation(collation);
}
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, locale, locale_is_c);
}
}
| static int GenericMatchText | ( | char * | s, | |
| int | slen, | |||
| char * | p, | |||
| int | plen | |||
| ) | [inline, static] |
Definition at line 150 of file like.c.
References GetDatabaseEncoding(), MB_MatchText(), pg_database_encoding_max_length(), PG_UTF8, SB_MatchText(), and UTF8_MatchText().
Referenced by namelike(), namenlike(), textlike(), and textnlike().
{
if (pg_database_encoding_max_length() == 1)
return SB_MatchText(s, slen, p, plen, 0, true);
else if (GetDatabaseEncoding() == PG_UTF8)
return UTF8_MatchText(s, slen, p, plen, 0, true);
else
return MB_MatchText(s, slen, p, plen, 0, true);
}
| Datum like_escape | ( | PG_FUNCTION_ARGS | ) |
Definition at line 418 of file like.c.
References MB_do_like_escape(), pg_database_encoding_max_length(), PG_GETARG_TEXT_PP, PG_RETURN_TEXT_P, and SB_do_like_escape().
{
text *pat = PG_GETARG_TEXT_PP(0);
text *esc = PG_GETARG_TEXT_PP(1);
text *result;
if (pg_database_encoding_max_length() == 1)
result = SB_do_like_escape(pat, esc);
else
result = MB_do_like_escape(pat, esc);
PG_RETURN_TEXT_P(result);
}
| Datum like_escape_bytea | ( | PG_FUNCTION_ARGS | ) |
Definition at line 437 of file like.c.
References PG_GETARG_BYTEA_PP, PG_RETURN_BYTEA_P, and SB_do_like_escape().
{
bytea *pat = PG_GETARG_BYTEA_PP(0);
bytea *esc = PG_GETARG_BYTEA_PP(1);
bytea *result = SB_do_like_escape((text *) pat, (text *) esc);
PG_RETURN_BYTEA_P((bytea *) result);
}
Referenced by like_escape().
| static int MB_MatchText | ( | char * | t, | |
| int | tlen, | |||
| char * | p, | |||
| int | plen, | |||
| pg_locale_t | locale, | |||
| bool | locale_is_c | |||
| ) | [static] |
Referenced by Generic_Text_IC_like(), and GenericMatchText().
| Datum nameiclike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 360 of file like.c.
References DatumGetTextP, DirectFunctionCall1, Generic_Text_IC_like(), name_text(), NameGetDatum, PG_GET_COLLATION, PG_GETARG_NAME, PG_GETARG_TEXT_PP, and PG_RETURN_BOOL.
{
Name str = PG_GETARG_NAME(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
text *strtext;
strtext = DatumGetTextP(DirectFunctionCall1(name_text,
NameGetDatum(str)));
result = (Generic_Text_IC_like(strtext, pat, PG_GET_COLLATION()) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum nameicnlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 375 of file like.c.
References DatumGetTextP, DirectFunctionCall1, Generic_Text_IC_like(), name_text(), NameGetDatum, PG_GET_COLLATION, PG_GETARG_NAME, PG_GETARG_TEXT_PP, and PG_RETURN_BOOL.
{
Name str = PG_GETARG_NAME(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
text *strtext;
strtext = DatumGetTextP(DirectFunctionCall1(name_text,
NameGetDatum(str)));
result = (Generic_Text_IC_like(strtext, pat, PG_GET_COLLATION()) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum namelike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 230 of file like.c.
References GenericMatchText(), NameStr, PG_GETARG_NAME, PG_GETARG_TEXT_PP, PG_RETURN_BOOL, VARDATA_ANY, and VARSIZE_ANY_EXHDR.
{
Name str = PG_GETARG_NAME(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
char *s,
*p;
int slen,
plen;
s = NameStr(*str);
slen = strlen(s);
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
result = (GenericMatchText(s, slen, p, plen) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum namenlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 251 of file like.c.
References GenericMatchText(), NameStr, PG_GETARG_NAME, PG_GETARG_TEXT_PP, PG_RETURN_BOOL, VARDATA_ANY, and VARSIZE_ANY_EXHDR.
{
Name str = PG_GETARG_NAME(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
char *s,
*p;
int slen,
plen;
s = NameStr(*str);
slen = strlen(s);
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
result = (GenericMatchText(s, slen, p, plen) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Referenced by like_escape(), and like_escape_bytea().
| static int SB_IMatchText | ( | char * | t, | |
| int | tlen, | |||
| char * | p, | |||
| int | plen, | |||
| pg_locale_t | locale, | |||
| bool | locale_is_c | |||
| ) | [static] |
Referenced by Generic_Text_IC_like().
| static char SB_lower_char | ( | unsigned char | c, | |
| pg_locale_t | locale, | |||
| bool | locale_is_c | |||
| ) | [static] |
Definition at line 92 of file like.c.
References pg_ascii_tolower(), pg_tolower(), and tolower_l.
{
if (locale_is_c)
return pg_ascii_tolower(c);
#ifdef HAVE_LOCALE_T
else if (locale)
return tolower_l(c, locale);
#endif
else
return pg_tolower(c);
}
| static int SB_MatchText | ( | char * | t, | |
| int | tlen, | |||
| char * | p, | |||
| int | plen, | |||
| pg_locale_t | locale, | |||
| bool | locale_is_c | |||
| ) | [static] |
Referenced by bytealike(), byteanlike(), and GenericMatchText().
| Datum texticlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 390 of file like.c.
References Generic_Text_IC_like(), PG_GET_COLLATION, PG_GETARG_TEXT_PP, and PG_RETURN_BOOL.
{
text *str = PG_GETARG_TEXT_PP(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
result = (Generic_Text_IC_like(str, pat, PG_GET_COLLATION()) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum texticnlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 402 of file like.c.
References Generic_Text_IC_like(), PG_GET_COLLATION, PG_GETARG_TEXT_PP, and PG_RETURN_BOOL.
{
text *str = PG_GETARG_TEXT_PP(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
result = (Generic_Text_IC_like(str, pat, PG_GET_COLLATION()) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum textlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 272 of file like.c.
References GenericMatchText(), PG_GETARG_TEXT_PP, PG_RETURN_BOOL, VARDATA_ANY, and VARSIZE_ANY_EXHDR.
{
text *str = PG_GETARG_TEXT_PP(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
char *s,
*p;
int slen,
plen;
s = VARDATA_ANY(str);
slen = VARSIZE_ANY_EXHDR(str);
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
result = (GenericMatchText(s, slen, p, plen) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| Datum textnlike | ( | PG_FUNCTION_ARGS | ) |
Definition at line 293 of file like.c.
References GenericMatchText(), PG_GETARG_TEXT_PP, PG_RETURN_BOOL, VARDATA_ANY, and VARSIZE_ANY_EXHDR.
{
text *str = PG_GETARG_TEXT_PP(0);
text *pat = PG_GETARG_TEXT_PP(1);
bool result;
char *s,
*p;
int slen,
plen;
s = VARDATA_ANY(str);
slen = VARSIZE_ANY_EXHDR(str);
p = VARDATA_ANY(pat);
plen = VARSIZE_ANY_EXHDR(pat);
result = (GenericMatchText(s, slen, p, plen) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
| static int UTF8_MatchText | ( | char * | t, | |
| int | tlen, | |||
| char * | p, | |||
| int | plen, | |||
| pg_locale_t | locale, | |||
| bool | locale_is_c | |||
| ) | [static] |
Referenced by Generic_Text_IC_like(), and GenericMatchText().
| static int wchareq | ( | char * | p1, | |
| char * | p2 | |||
| ) | [inline, static] |
Definition at line 56 of file like.c.
References pg_mblen().
1.7.1