staticint SB_MatchText(constchar *t, int tlen, constchar *p, int plen,
pg_locale_t locale); static text *SB_do_like_escape(text *pat, text *esc);
staticint MB_MatchText(constchar *t, int tlen, constchar *p, int plen,
pg_locale_t locale); static text *MB_do_like_escape(text *pat, text *esc);
staticint UTF8_MatchText(constchar *t, int tlen, constchar *p, int plen,
pg_locale_t locale);
staticint SB_IMatchText(constchar *t, int tlen, constchar *p, int plen,
pg_locale_t locale);
staticint GenericMatchText(constchar *s, int slen, constchar *p, int plen, Oid collation); staticint Generic_Text_IC_like(text *str, text *pat, Oid collation);
/*-------------------- *SupportroutineforMatchText.Comparesgivenmultibytestreams *aswidecharacters.Iftheymatch,returns1otherwisereturns0. *--------------------
*/ staticinlineint
wchareq(constchar *p1, int p1len, constchar *p2, int p2len)
{ int p1clen;
/* Optimization: quickly compare the first byte. */ if (*p1 != *p2) return0;
p1clen = pg_mblen_with_len(p1, p1len); if (pg_mblen_with_len(p2, p2len) != p1clen) return0;
/* They are the same length */ while (p1clen--)
{ if (*p1++ != *p2++) return0;
} return1;
}
/* Generic for all cases not requiring inline case-folding */ staticinlineint
GenericMatchText(constchar *s, int slen, constchar *p, int plen, Oid collation)
{
pg_locale_t locale;
if (!OidIsValid(collation))
{ /* *Thistypicallymeansthattheparsercouldnotresolveaconflict *ofimplicitcollations,soreportitthatway.
*/
ereport(ERROR,
(errcode(ERRCODE_INDETERMINATE_COLLATION),
errmsg("could not determine which collation to use for LIKE"),
errhint("Use the COLLATE clause to set the collation explicitly.")));
}
staticinlineint
Generic_Text_IC_like(text *str, text *pat, Oid collation)
{ char *s,
*p; int slen,
plen;
pg_locale_t locale;
if (!OidIsValid(collation))
{ /* *Thistypicallymeansthattheparsercouldnotresolveaconflict *ofimplicitcollations,soreportitthatway.
*/
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);
if (!locale->deterministic)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("nondeterministic collations are not supported for ILIKE")));
Datum
namelike(PG_FUNCTION_ARGS)
{
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, PG_GET_COLLATION()) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Datum
namenlike(PG_FUNCTION_ARGS)
{
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, PG_GET_COLLATION()) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Datum
textlike(PG_FUNCTION_ARGS)
{
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, PG_GET_COLLATION()) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Datum
textnlike(PG_FUNCTION_ARGS)
{
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, PG_GET_COLLATION()) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Datum
bytealike(PG_FUNCTION_ARGS)
{
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) == LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Datum
byteanlike(PG_FUNCTION_ARGS)
{
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) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
/* *Case-insensitiveversions
*/
Datum
nameiclike(PG_FUNCTION_ARGS)
{
Name str = PG_GETARG_NAME(0);
text *pat = PG_GETARG_TEXT_PP(1); bool result;
text *strtext;
strtext = DatumGetTextPP(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)
{
Name str = PG_GETARG_NAME(0);
text *pat = PG_GETARG_TEXT_PP(1); bool result;
text *strtext;
strtext = DatumGetTextPP(DirectFunctionCall1(name_text,
NameGetDatum(str)));
result = (Generic_Text_IC_like(strtext, pat, PG_GET_COLLATION()) != LIKE_TRUE);
PG_RETURN_BOOL(result);
}
Datum
texticlike(PG_FUNCTION_ARGS)
{
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)
{
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);
}
/* *like_escape()---givenapatternandanESCAPEstring, *convertthepatterntousePostgres'standardbackslashescapeconvention.
*/
Datum
like_escape(PG_FUNCTION_ARGS)
{
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);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.