Index: like.c =================================================================== RCS file: /usr/local/cvsroot/pgsql/src/backend/utils/adt/like.c,v retrieving revision 1.22 retrieving revision 1.23 diff -c -r1.22 -r1.23 *** like.c 1999/03/15 02:18:36 1.22 --- like.c 1999/03/15 13:45:09 1.23 *************** *** 150,159 **** { int matched; ! for (; *p; text ++, p++) { - if (*text == '\0' && *p != '%') - return LIKE_ABORT; switch (*p) { case '\\': --- 150,157 ---- { int matched; ! for (; *p && *text; text++, p++) { switch (*p) { case '\\': *************** *** 161,187 **** p++; /* FALLTHROUGH */ default: ! if (*text !=*p) return LIKE_FALSE; ! continue; case '_': /* Match anything. */ ! continue; case '%': ! while (*++p == '%') ! /* Consecutive percents act just like one. */ ! continue; if (*p == '\0') /* Trailing percent matches everything. */ return LIKE_TRUE; while (*text) ! if ((matched = DoMatch(text ++, p)) != LIKE_FALSE) return matched; return LIKE_ABORT; } } ! return *text == '\0'; } --- 159,201 ---- p++; /* FALLTHROUGH */ default: ! if (*text != *p) return LIKE_FALSE; ! break; case '_': /* Match anything. */ ! break; case '%': ! /* %% is the same as % according to the SQL standard */ ! /* Advance past all %'s */ ! while (*p == '%') ! p++; if (*p == '\0') /* Trailing percent matches everything. */ return LIKE_TRUE; while (*text) ! { ! /* Optimization to prevent most recursion */ ! if ((*text == *p || ! *p == '\\' || *p == '%' || *p == '_') && ! (matched = DoMatch(text, p)) != LIKE_FALSE) return matched; + text++; + } return LIKE_ABORT; } } ! 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; ! } }