From 77ede8900d96647a8293d76d08c0c5d47cc1049e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 6 Feb 2003 20:25:33 +0000 Subject: Create a GUC variable REGEX_FLAVOR to control the type of regular expression accepted by the regex operators, per discussion yesterday. Along the way, reduce deadlock_timeout from PGC_POSTMASTER to PGC_SIGHUP category. It is probably best to insist that all backends share the same setting, but that doesn't mean it has to be frozen at startup. --- src/backend/utils/adt/regexp.c | 52 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 10 deletions(-) (limited to 'src/backend/utils/adt/regexp.c') diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 604e55d4145..56f78422bcc 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/regexp.c,v 1.44 2003/02/05 17:41:32 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/regexp.c,v 1.45 2003/02/06 20:25:33 tgl Exp $ * * Alistair Crooks added the code for the regex caching * agc - cached the regular expressions used - there's a good chance @@ -34,6 +34,10 @@ #include "utils/builtins.h" +/* GUC-settable flavor parameter */ +static int regex_flavor = REG_ADVANCED; + + /* * We cache precompiled regular expressions using a "self organizing list" * structure, in which recently-used items tend to be near the front. @@ -216,6 +220,34 @@ RE_compile_and_execute(text *text_re, unsigned char *dat, int dat_len, } +/* + * assign_regex_flavor - GUC hook to validate and set REGEX_FLAVOR + */ +const char * +assign_regex_flavor(const char *value, + bool doit, bool interactive) +{ + if (strcasecmp(value, "advanced") == 0) + { + if (doit) + regex_flavor = REG_ADVANCED; + } + else if (strcasecmp(value, "extended") == 0) + { + if (doit) + regex_flavor = REG_EXTENDED; + } + else if (strcasecmp(value, "basic") == 0) + { + if (doit) + regex_flavor = REG_BASIC; + } + else + return NULL; /* fail */ + return value; /* OK */ +} + + /* * interface routines called by the function manager */ @@ -229,7 +261,7 @@ nameregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, (unsigned char *) NameStr(*n), strlen(NameStr(*n)), - REG_ADVANCED, + regex_flavor, 0, NULL)); } @@ -242,7 +274,7 @@ nameregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, (unsigned char *) NameStr(*n), strlen(NameStr(*n)), - REG_ADVANCED, + regex_flavor, 0, NULL)); } @@ -255,7 +287,7 @@ textregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, (unsigned char *) VARDATA(s), VARSIZE(s) - VARHDRSZ, - REG_ADVANCED, + regex_flavor, 0, NULL)); } @@ -268,7 +300,7 @@ textregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, (unsigned char *) VARDATA(s), VARSIZE(s) - VARHDRSZ, - REG_ADVANCED, + regex_flavor, 0, NULL)); } @@ -288,7 +320,7 @@ nameicregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, (unsigned char *) NameStr(*n), strlen(NameStr(*n)), - REG_ICASE | REG_ADVANCED, + regex_flavor | REG_ICASE, 0, NULL)); } @@ -301,7 +333,7 @@ nameicregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, (unsigned char *) NameStr(*n), strlen(NameStr(*n)), - REG_ICASE | REG_ADVANCED, + regex_flavor | REG_ICASE, 0, NULL)); } @@ -314,7 +346,7 @@ texticregexeq(PG_FUNCTION_ARGS) PG_RETURN_BOOL(RE_compile_and_execute(p, (unsigned char *) VARDATA(s), VARSIZE(s) - VARHDRSZ, - REG_ICASE | REG_ADVANCED, + regex_flavor | REG_ICASE, 0, NULL)); } @@ -327,7 +359,7 @@ texticregexne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(!RE_compile_and_execute(p, (unsigned char *) VARDATA(s), VARSIZE(s) - VARHDRSZ, - REG_ICASE | REG_ADVANCED, + regex_flavor | REG_ICASE, 0, NULL)); } @@ -353,7 +385,7 @@ textregexsubstr(PG_FUNCTION_ARGS) match = RE_compile_and_execute(p, (unsigned char *) VARDATA(s), VARSIZE(s) - VARHDRSZ, - REG_ADVANCED, + regex_flavor, 2, pmatch); /* match? then return the substring matching the pattern */ -- cgit v1.2.3