aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/regexp.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-02-06 20:25:33 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-02-06 20:25:33 +0000
commit77ede8900d96647a8293d76d08c0c5d47cc1049e (patch)
tree79b54813dc073aa4c4c4d9877ed6c3a38068df1f /src/backend/utils/adt/regexp.c
parent465ed56531aa41536925d2169a7c3c99f9860eb8 (diff)
downloadpostgresql-77ede8900d96647a8293d76d08c0c5d47cc1049e.tar.gz
postgresql-77ede8900d96647a8293d76d08c0c5d47cc1049e.zip
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.
Diffstat (limited to 'src/backend/utils/adt/regexp.c')
-rw-r--r--src/backend/utils/adt/regexp.c52
1 files changed, 42 insertions, 10 deletions
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.
@@ -217,6 +221,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 */