diff options
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/regexp.c | 56 | ||||
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 32 |
2 files changed, 28 insertions, 60 deletions
diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 118d42d2a0a..6c09531f2ff 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/regexp.c,v 1.83 2009/10/10 03:50:15 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/regexp.c,v 1.84 2009/10/21 20:38:58 tgl Exp $ * * Alistair Crooks added the code for the regex caching * agc - cached the regular expressions used - there's a good chance @@ -39,10 +39,6 @@ (PG_NARGS() > (_n) ? PG_GETARG_TEXT_PP(_n) : NULL) -/* GUC-settable flavor parameter */ -int regex_flavor = REG_ADVANCED; - - /* all the options of interest for regex functions */ typedef struct pg_re_flags { @@ -347,8 +343,8 @@ RE_compile_and_execute(text *text_re, char *dat, int dat_len, static void parse_re_flags(pg_re_flags *flags, text *opts) { - /* regex_flavor is always folded into the compile flags */ - flags->cflags = regex_flavor; + /* regex flavor is always folded into the compile flags */ + flags->cflags = REG_ADVANCED; flags->glob = false; if (opts) @@ -415,16 +411,6 @@ parse_re_flags(pg_re_flags *flags, text *opts) /* - * report whether regex_flavor is currently BASIC - */ -bool -regex_flavor_is_basic(void) -{ - return (regex_flavor == REG_BASIC); -} - - -/* * interface routines called by the function manager */ @@ -437,7 +423,7 @@ nameregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, NameStr(*n), strlen(NameStr(*n)), - regex_flavor, + REG_ADVANCED, 0, NULL)); } @@ -450,7 +436,7 @@ nameregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, NameStr(*n), strlen(NameStr(*n)), - regex_flavor, + REG_ADVANCED, 0, NULL)); } @@ -463,7 +449,7 @@ textregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, VARDATA_ANY(s), VARSIZE_ANY_EXHDR(s), - regex_flavor, + REG_ADVANCED, 0, NULL)); } @@ -476,7 +462,7 @@ textregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, VARDATA_ANY(s), VARSIZE_ANY_EXHDR(s), - regex_flavor, + REG_ADVANCED, 0, NULL)); } @@ -496,7 +482,7 @@ nameicregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, NameStr(*n), strlen(NameStr(*n)), - regex_flavor | REG_ICASE, + REG_ADVANCED | REG_ICASE, 0, NULL)); } @@ -509,7 +495,7 @@ nameicregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, NameStr(*n), strlen(NameStr(*n)), - regex_flavor | REG_ICASE, + REG_ADVANCED | REG_ICASE, 0, NULL)); } @@ -522,7 +508,7 @@ texticregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, VARDATA_ANY(s), VARSIZE_ANY_EXHDR(s), - regex_flavor | REG_ICASE, + REG_ADVANCED | REG_ICASE, 0, NULL)); } @@ -535,7 +521,7 @@ texticregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, VARDATA_ANY(s), VARSIZE_ANY_EXHDR(s), - regex_flavor | REG_ICASE, + REG_ADVANCED | REG_ICASE, 0, NULL)); } @@ -555,7 +541,7 @@ textregexsubstr(PG_FUNCTION_ARGS) eo; /* Compile RE */ - re = RE_compile_and_cache(p, regex_flavor); + re = RE_compile_and_cache(p, REG_ADVANCED); /* * We pass two regmatch_t structs to get info about the overall match and @@ -611,7 +597,7 @@ textregexreplace_noopt(PG_FUNCTION_ARGS) text *r = PG_GETARG_TEXT_PP(2); regex_t *re; - re = RE_compile_and_cache(p, regex_flavor); + re = RE_compile_and_cache(p, REG_ADVANCED); PG_RETURN_TEXT_P(replace_text_regexp(s, (void *) re, r, false)); } @@ -684,12 +670,10 @@ similar_escape(PG_FUNCTION_ARGS) /*---------- * We surround the transformed input string with - * ***:^(?: ... )$ - * which is bizarre enough to require some explanation. "***:" is a - * director prefix to force the regex to be treated as an ARE regardless - * of the current regex_flavor setting. We need "^" and "$" to force - * the pattern to match the entire input string as per SQL99 spec. The - * "(?:" and ")" are a non-capturing set of parens; we have to have + * ^(?: ... )$ + * which requires some explanation. We need "^" and "$" to force + * the pattern to match the entire input string as per SQL99 spec. + * The "(?:" and ")" are a non-capturing set of parens; we have to have * parens in case the string contains "|", else the "^" and "$" will * be bound into the first and last alternatives which is not what we * want, and the parens must be non capturing because we don't want them @@ -701,13 +685,9 @@ similar_escape(PG_FUNCTION_ARGS) * We need room for the prefix/postfix plus as many as 2 output bytes per * input byte */ - result = (text *) palloc(VARHDRSZ + 10 + 2 * plen); + result = (text *) palloc(VARHDRSZ + 6 + 2 * plen); r = VARDATA(result); - *r++ = '*'; - *r++ = '*'; - *r++ = '*'; - *r++ = ':'; *r++ = '^'; *r++ = '('; *r++ = '?'; diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index e85ab06819c..20d4180e9b9 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.262 2009/08/04 16:08:36 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.263 2009/10/21 20:38:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -4580,7 +4580,6 @@ regex_fixed_prefix(Const *patt_const, bool case_insensitive, char *patt; char *rest; Oid typeid = patt_const->consttype; - bool is_basic = regex_flavor_is_basic(); bool is_multibyte = (pg_database_encoding_max_length() > 1); /* @@ -4598,14 +4597,12 @@ regex_fixed_prefix(Const *patt_const, bool case_insensitive, /* * Check for ARE director prefix. It's worth our trouble to recognize - * this because similar_escape() uses it. + * this because similar_escape() used to use it, and some other code + * might still use it, to force ARE mode. */ pos = 0; if (strncmp(patt, "***:", 4) == 0) - { pos = 4; - is_basic = false; - } /* Pattern must be anchored left */ if (patt[pos] != '^') @@ -4641,17 +4638,11 @@ regex_fixed_prefix(Const *patt_const, bool case_insensitive, /* * We special-case the syntax '^(...)$' because psql uses it. But beware: - * in BRE mode these parentheses are just ordinary characters. Also, * sequences beginning "(?" are not what they seem, unless they're "(?:". - * (We should recognize that, too, because of similar_escape().) - * - * Note: it's a bit bogus to be depending on the current regex_flavor - * setting here, because the setting could change before the pattern is - * used. We minimize the risk by trusting the flavor as little as we can, - * but perhaps it would be a good idea to get rid of the "basic" setting. + * (We must recognize that because of similar_escape().) */ have_leading_paren = false; - if (patt[pos] == '(' && !is_basic && + if (patt[pos] == '(' && (patt[pos + 1] != '?' || patt[pos + 2] == ':')) { have_leading_paren = true; @@ -4691,12 +4682,10 @@ regex_fixed_prefix(Const *patt_const, bool case_insensitive, /* * Check for quantifiers. Except for +, this means the preceding * character is optional, so we must remove it from the prefix too! - * Note: in BREs, \{ is a quantifier. */ if (patt[pos] == '*' || patt[pos] == '?' || - patt[pos] == '{' || - (patt[pos] == '\\' && patt[pos + 1] == '{')) + patt[pos] == '{') { match_pos = prev_match_pos; pos = prev_pos; @@ -4711,14 +4700,13 @@ regex_fixed_prefix(Const *patt_const, bool case_insensitive, /* * Normally, backslash quotes the next character. But in AREs, * backslash followed by alphanumeric is an escape, not a quoted - * character. Must treat it as having multiple possible matches. In - * BREs, \( is a parenthesis, so don't trust that either. Note: since - * only ASCII alphanumerics are escapes, we don't have to be paranoid - * about multibyte here. + * character. Must treat it as having multiple possible matches. + * Note: since only ASCII alphanumerics are escapes, we don't have to + * be paranoid about multibyte here. */ if (patt[pos] == '\\') { - if (isalnum((unsigned char) patt[pos + 1]) || patt[pos + 1] == '(') + if (isalnum((unsigned char) patt[pos + 1])) break; pos++; if (patt[pos] == '\0') |