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.c578
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);
}