diff options
Diffstat (limited to 'src/backend/utils/adt/like.c')
-rw-r--r-- | src/backend/utils/adt/like.c | 578 |
1 files changed, 457 insertions, 121 deletions
diff --git a/src/backend/utils/adt/like.c b/src/backend/utils/adt/like.c index 0be559598d5..da4055a16eb 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 - * $Header: /cvsroot/pgsql/src/backend/utils/adt/like.c,v 1.39 2000/08/07 01:45:00 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/like.c,v 1.40 2000/08/09 14:13:03 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -37,101 +37,321 @@ static int MatchTextLower(pg_wchar * t, int tlen, pg_wchar * p, int plen, char * Datum namelike(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchText(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - == LIKE_TRUE); + bool result; + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = strlen(NameStr(*str)); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) NameStr(*str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchText(s, slen, p, plen, "\\") == LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum namenlike(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchText(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - != LIKE_TRUE); + bool result; + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = strlen(NameStr(*str)); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) NameStr(*str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchText(s, slen, p, plen, "\\") != LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum namelike_escape(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchText(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - == LIKE_TRUE); + bool result; + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = strlen(NameStr(*str)); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) NameStr(*str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchText(s, slen, p, plen, e) == LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum namenlike_escape(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchText(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - != LIKE_TRUE); + bool result; + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = strlen(NameStr(*str)); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) NameStr(*str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchText(s, slen, p, plen, e) != LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum textlike(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchText(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - == LIKE_TRUE); + bool result; + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = (VARSIZE(str)-VARHDRSZ); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchText(s, slen, p, plen, NULL) == LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum textnlike(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchText(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - != LIKE_TRUE); + bool result; + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = (VARSIZE(str)-VARHDRSZ); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchText(s, slen, p, plen, "\\") != LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum textlike_escape(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchText(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - == LIKE_TRUE); + bool result; + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = (VARSIZE(str)-VARHDRSZ); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchText(s, slen, p, plen, e) == LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } Datum textnlike_escape(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchText(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - != LIKE_TRUE); + bool result; + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + pg_wchar *ss, *pp; + + slen = (VARSIZE(str)-VARHDRSZ); + s = (pg_wchar *) palloc((slen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(str), s, slen); + for (ss = s, slen = 0; *ss != 0; ss++) slen++; + + plen = (VARSIZE(pat)-VARHDRSZ); + p = (pg_wchar *) palloc((plen+1) * sizeof(pg_wchar)); + (void) pg_mb2wchar_with_len((unsigned char *) VARDATA(pat), p, plen); + for (pp = p, plen = 0; *pp != 0; pp++) plen++; +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchText(s, slen, p, plen, e) != LIKE_TRUE); + +#ifdef MULTIBYTE + pfree(s); + pfree(p); +#endif + + PG_RETURN_BOOL(result); } /* @@ -141,101 +361,217 @@ textnlike_escape(PG_FUNCTION_ARGS) Datum inamelike(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchTextLower(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - == LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchTextLower(s, slen, p, plen, "\\") == LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum inamenlike(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchTextLower(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - != LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchTextLower(s, slen, p, plen, "\\") != LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum inamelike_escape(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchTextLower(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - == LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchTextLower(s, slen, p, plen, e) == LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum inamenlike_escape(PG_FUNCTION_ARGS) { - Name n = PG_GETARG_NAME(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchTextLower(NameStr(*n), strlen(NameStr(*n)), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - != LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + Name str = PG_GETARG_NAME(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = NameStr(*str); + slen = strlen(s); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchTextLower(s, slen, p, plen, e) != LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum itextlike(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchTextLower(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - == LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchTextLower(s, slen, p, plen, "\\") == LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum itextnlike(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - - PG_RETURN_BOOL(MatchTextLower(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - NULL) - != LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + pg_wchar *s, *p; + int slen, plen; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + result = (MatchTextLower(s, slen, p, plen, "\\") != LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum itextlike_escape(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchTextLower(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - == LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchTextLower(s, slen, p, plen, e) == LIKE_TRUE); + + PG_RETURN_BOOL(result); } Datum itextnlike_escape(PG_FUNCTION_ARGS) { - text *s = PG_GETARG_TEXT_P(0); - text *p = PG_GETARG_TEXT_P(1); - text *e = PG_GETARG_TEXT_P(2); - - PG_RETURN_BOOL(MatchTextLower(VARDATA(s), (VARSIZE(s)-VARHDRSZ), - VARDATA(p), (VARSIZE(p)-VARHDRSZ), - ((VARSIZE(e)-VARHDRSZ) > 0? VARDATA(e): NULL)) - != LIKE_TRUE); + bool result; +#ifndef MULTIBYTE + text *str = PG_GETARG_TEXT_P(0); + text *pat = PG_GETARG_TEXT_P(1); +#endif + text *esc = PG_GETARG_TEXT_P(2); + pg_wchar *s, *p; + int slen, plen; + char *e; + +#ifdef MULTIBYTE + elog(ERROR, "Case-insensitive multi-byte comparisons are not yet supported"); +#else + s = VARDATA(str); + slen = (VARSIZE(str)-VARHDRSZ); + p = VARDATA(pat); + plen = (VARSIZE(pat)-VARHDRSZ); +#endif + + e = ((VARSIZE(esc)-VARHDRSZ) > 0? VARDATA(esc): NULL); + + result = (MatchTextLower(s, slen, p, plen, e) != LIKE_TRUE); + + PG_RETURN_BOOL(result); } |