aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/regexp.c56
-rw-r--r--src/backend/utils/adt/selfuncs.c32
-rw-r--r--src/backend/utils/misc/guc.c19
-rw-r--r--src/backend/utils/misc/postgresql.conf.sample1
-rw-r--r--src/include/regex/regex.h7
-rw-r--r--src/include/utils/builtins.h3
-rw-r--r--src/test/regress/expected/guc.out78
-rw-r--r--src/test/regress/sql/guc.sql46
8 files changed, 93 insertions, 149 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')
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 4cc88225583..33f38a20c48 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.522 2009/10/21 20:22:38 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.523 2009/10/21 20:38:58 tgl Exp $
*
*--------------------------------------------------------------------
*/
@@ -54,7 +54,6 @@
#include "postmaster/postmaster.h"
#include "postmaster/syslogger.h"
#include "postmaster/walwriter.h"
-#include "regex/regex.h"
#include "storage/bufmgr.h"
#include "storage/fd.h"
#include "tcop/tcopprot.h"
@@ -248,13 +247,6 @@ static const struct config_enum_entry log_statement_options[] = {
{NULL, 0, false}
};
-static const struct config_enum_entry regex_flavor_options[] = {
- {"advanced", REG_ADVANCED, false},
- {"extended", REG_EXTENDED, false},
- {"basic", REG_BASIC, false},
- {NULL, 0, false}
-};
-
static const struct config_enum_entry isolation_level_options[] = {
{"serializable", XACT_SERIALIZABLE, false},
{"repeatable read", XACT_REPEATABLE_READ, false},
@@ -2659,15 +2651,6 @@ static struct config_enum ConfigureNamesEnum[] =
#endif
{
- {"regex_flavor", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
- gettext_noop("Sets the regular expression \"flavor\"."),
- NULL
- },
- &regex_flavor,
- REG_ADVANCED, regex_flavor_options, NULL, NULL
- },
-
- {
{"session_replication_role", PGC_SUSET, CLIENT_CONN_STATEMENT,
gettext_noop("Sets the session's behavior for triggers and rewrite rules."),
NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index ce853a74819..4c5f1590de4 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -488,7 +488,6 @@
#backslash_quote = safe_encoding # on, off, or safe_encoding
#default_with_oids = off
#escape_string_warning = on
-#regex_flavor = advanced # advanced, extended, or basic
#sql_inheritance = on
#standard_conforming_strings = off
#synchronize_seqscans = on
diff --git a/src/include/regex/regex.h b/src/include/regex/regex.h
index abd90bc07c0..15975bc4786 100644
--- a/src/include/regex/regex.h
+++ b/src/include/regex/regex.h
@@ -29,7 +29,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $PostgreSQL: pgsql/src/include/regex/regex.h,v 1.31 2009/06/11 14:49:12 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/regex/regex.h,v 1.32 2009/10/21 20:38:58 tgl Exp $
*/
/*
@@ -166,9 +166,4 @@ extern int pg_regexec(regex_t *, const pg_wchar *, size_t, size_t, rm_detail_t *
extern void pg_regfree(regex_t *);
extern size_t pg_regerror(int, const regex_t *, char *, size_t);
-/*
- * guc configuration variables
- */
-extern int regex_flavor;
-
#endif /* _REGEX_H_ */
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index d77f4b6ecd9..c400c67e0ec 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.340 2009/10/09 21:02:56 petere Exp $
+ * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.341 2009/10/21 20:38:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -525,7 +525,6 @@ extern Datum regexp_split_to_table(PG_FUNCTION_ARGS);
extern Datum regexp_split_to_table_no_flags(PG_FUNCTION_ARGS);
extern Datum regexp_split_to_array(PG_FUNCTION_ARGS);
extern Datum regexp_split_to_array_no_flags(PG_FUNCTION_ARGS);
-extern bool regex_flavor_is_basic(void);
/* regproc.c */
extern Datum regprocin(PG_FUNCTION_ARGS);
diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out
index a580daa089d..1fd2b98f6e8 100644
--- a/src/test/regress/expected/guc.out
+++ b/src/test/regress/expected/guc.out
@@ -607,95 +607,95 @@ DROP ROLE temp_reset_user;
--
-- Tests for function-local GUC settings
--
-set regex_flavor = advanced;
+set work_mem = '3MB';
create function report_guc(text) returns text as
$$ select current_setting($1) $$ language sql
-set regex_flavor = basic;
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+set work_mem = '1MB';
+select report_guc('work_mem'), current_setting('work_mem');
report_guc | current_setting
------------+-----------------
- basic | advanced
+ 1MB | 3MB
(1 row)
-- this should draw only a warning
alter function report_guc(text) set search_path = no_such_schema;
NOTICE: schema "no_such_schema" does not exist
-- with error occurring here
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+select report_guc('work_mem'), current_setting('work_mem');
ERROR: schema "no_such_schema" does not exist
-alter function report_guc(text) reset search_path set regex_flavor = extended;
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+alter function report_guc(text) reset search_path set work_mem = '2MB';
+select report_guc('work_mem'), current_setting('work_mem');
report_guc | current_setting
------------+-----------------
- extended | advanced
+ 2MB | 3MB
(1 row)
alter function report_guc(text) reset all;
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+select report_guc('work_mem'), current_setting('work_mem');
report_guc | current_setting
------------+-----------------
- advanced | advanced
+ 3MB | 3MB
(1 row)
-- SET LOCAL is restricted by a function SET option
create or replace function myfunc(int) returns text as $$
begin
- set local regex_flavor = extended;
- return current_setting('regex_flavor');
+ set local work_mem = '2MB';
+ return current_setting('work_mem');
end $$
language plpgsql
-set regex_flavor = basic;
-select myfunc(0), current_setting('regex_flavor');
- myfunc | current_setting
-----------+-----------------
- extended | advanced
+set work_mem = '1MB';
+select myfunc(0), current_setting('work_mem');
+ myfunc | current_setting
+--------+-----------------
+ 2MB | 3MB
(1 row)
alter function myfunc(int) reset all;
-select myfunc(0), current_setting('regex_flavor');
- myfunc | current_setting
-----------+-----------------
- extended | extended
+select myfunc(0), current_setting('work_mem');
+ myfunc | current_setting
+--------+-----------------
+ 2MB | 2MB
(1 row)
-set regex_flavor = advanced;
+set work_mem = '3MB';
-- but SET isn't
create or replace function myfunc(int) returns text as $$
begin
- set regex_flavor = extended;
- return current_setting('regex_flavor');
+ set work_mem = '2MB';
+ return current_setting('work_mem');
end $$
language plpgsql
-set regex_flavor = basic;
-select myfunc(0), current_setting('regex_flavor');
- myfunc | current_setting
-----------+-----------------
- extended | extended
+set work_mem = '1MB';
+select myfunc(0), current_setting('work_mem');
+ myfunc | current_setting
+--------+-----------------
+ 2MB | 2MB
(1 row)
-set regex_flavor = advanced;
+set work_mem = '3MB';
-- it should roll back on error, though
create or replace function myfunc(int) returns text as $$
begin
- set regex_flavor = extended;
+ set work_mem = '2MB';
perform 1/$1;
- return current_setting('regex_flavor');
+ return current_setting('work_mem');
end $$
language plpgsql
-set regex_flavor = basic;
+set work_mem = '1MB';
select myfunc(0);
ERROR: division by zero
CONTEXT: SQL statement "SELECT 1/ $1 "
PL/pgSQL function "myfunc" line 3 at PERFORM
-select current_setting('regex_flavor');
+select current_setting('work_mem');
current_setting
-----------------
- advanced
+ 3MB
(1 row)
-select myfunc(1), current_setting('regex_flavor');
- myfunc | current_setting
-----------+-----------------
- extended | extended
+select myfunc(1), current_setting('work_mem');
+ myfunc | current_setting
+--------+-----------------
+ 2MB | 2MB
(1 row)
diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql
index 9966606275c..a7b795af47d 100644
--- a/src/test/regress/sql/guc.sql
+++ b/src/test/regress/sql/guc.sql
@@ -186,68 +186,68 @@ DROP ROLE temp_reset_user;
-- Tests for function-local GUC settings
--
-set regex_flavor = advanced;
+set work_mem = '3MB';
create function report_guc(text) returns text as
$$ select current_setting($1) $$ language sql
-set regex_flavor = basic;
+set work_mem = '1MB';
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+select report_guc('work_mem'), current_setting('work_mem');
-- this should draw only a warning
alter function report_guc(text) set search_path = no_such_schema;
-- with error occurring here
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+select report_guc('work_mem'), current_setting('work_mem');
-alter function report_guc(text) reset search_path set regex_flavor = extended;
+alter function report_guc(text) reset search_path set work_mem = '2MB';
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+select report_guc('work_mem'), current_setting('work_mem');
alter function report_guc(text) reset all;
-select report_guc('regex_flavor'), current_setting('regex_flavor');
+select report_guc('work_mem'), current_setting('work_mem');
-- SET LOCAL is restricted by a function SET option
create or replace function myfunc(int) returns text as $$
begin
- set local regex_flavor = extended;
- return current_setting('regex_flavor');
+ set local work_mem = '2MB';
+ return current_setting('work_mem');
end $$
language plpgsql
-set regex_flavor = basic;
+set work_mem = '1MB';
-select myfunc(0), current_setting('regex_flavor');
+select myfunc(0), current_setting('work_mem');
alter function myfunc(int) reset all;
-select myfunc(0), current_setting('regex_flavor');
+select myfunc(0), current_setting('work_mem');
-set regex_flavor = advanced;
+set work_mem = '3MB';
-- but SET isn't
create or replace function myfunc(int) returns text as $$
begin
- set regex_flavor = extended;
- return current_setting('regex_flavor');
+ set work_mem = '2MB';
+ return current_setting('work_mem');
end $$
language plpgsql
-set regex_flavor = basic;
+set work_mem = '1MB';
-select myfunc(0), current_setting('regex_flavor');
+select myfunc(0), current_setting('work_mem');
-set regex_flavor = advanced;
+set work_mem = '3MB';
-- it should roll back on error, though
create or replace function myfunc(int) returns text as $$
begin
- set regex_flavor = extended;
+ set work_mem = '2MB';
perform 1/$1;
- return current_setting('regex_flavor');
+ return current_setting('work_mem');
end $$
language plpgsql
-set regex_flavor = basic;
+set work_mem = '1MB';
select myfunc(0);
-select current_setting('regex_flavor');
-select myfunc(1), current_setting('regex_flavor');
+select current_setting('work_mem');
+select myfunc(1), current_setting('work_mem');