Skip to content
Snippets Groups Projects
Commit 25541a5c authored by Bruce Momjian's avatar Bruce Momjian
Browse files

LIKE cleanup.

parent 4a9c2390
No related branches found
No related tags found
No related merge requests found
...@@ -111,7 +111,7 @@ textnlike(struct varlena *s, struct varlena *p) ...@@ -111,7 +111,7 @@ textnlike(struct varlena *s, struct varlena *p)
} }
/* $Revision: 1.22 $ /* $Revision: 1.23 $
** "like.c" A first attempt at a LIKE operator for Postgres95. ** "like.c" A first attempt at a LIKE operator for Postgres95.
** **
** Originally written by Rich $alz, mirror!rs, Wed Nov 26 19:03:17 EST 1986. ** Originally written by Rich $alz, mirror!rs, Wed Nov 26 19:03:17 EST 1986.
...@@ -150,10 +150,8 @@ DoMatch(pg_wchar *text, pg_wchar *p) ...@@ -150,10 +150,8 @@ DoMatch(pg_wchar *text, pg_wchar *p)
{ {
int matched; int matched;
for (; *p; text ++, p++) for (; *p && *text; text++, p++)
{ {
if (*text == '\0' && *p != '%')
return LIKE_ABORT;
switch (*p) switch (*p)
{ {
case '\\': case '\\':
...@@ -163,25 +161,41 @@ DoMatch(pg_wchar *text, pg_wchar *p) ...@@ -163,25 +161,41 @@ DoMatch(pg_wchar *text, pg_wchar *p)
default: default:
if (*text != *p) if (*text != *p)
return LIKE_FALSE; return LIKE_FALSE;
continue; break;
case '_': case '_':
/* Match anything. */ /* Match anything. */
continue; break;
case '%': case '%':
while (*++p == '%') /* %% is the same as % according to the SQL standard */
/* Consecutive percents act just like one. */ /* Advance past all %'s */
continue; while (*p == '%')
p++;
if (*p == '\0') if (*p == '\0')
/* Trailing percent matches everything. */ /* Trailing percent matches everything. */
return LIKE_TRUE; return LIKE_TRUE;
while (*text) while (*text)
if ((matched = DoMatch(text ++, p)) != LIKE_FALSE) {
/* Optimization to prevent most recursion */
if ((*text == *p ||
*p == '\\' || *p == '%' || *p == '_') &&
(matched = DoMatch(text, p)) != LIKE_FALSE)
return matched; return matched;
text++;
}
return LIKE_ABORT; return LIKE_ABORT;
} }
} }
return *text == '\0'; if (*text != '\0')
return LIKE_ABORT;
else
{
/* End of input string. Do we have matching string remaining? */
if (p[0] == '\0' || (p[0] == '%' && p[1] == '\0'))
return LIKE_TRUE;
else
return LIKE_ABORT;
}
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment