diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 0e4cae814129a3ce4f4639e25d97da3f2deb1ba0..2de93e956c6548acf472127dc052b9f05cf2aa8b 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.231 2009/10/21 20:22:38 tgl Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.232 2009/10/21 20:38:58 tgl Exp $ --> <chapter Id="runtime-config"> <title>Server Configuration</title> @@ -4772,24 +4772,6 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' </listitem> </varlistentry> - <varlistentry id="guc-regex-flavor" xreflabel="regex_flavor"> - <term><varname>regex_flavor</varname> (<type>enum</type>)</term> - <indexterm><primary>regular expressions</></> - <indexterm> - <primary><varname>regex_flavor</> configuration parameter</primary> - </indexterm> - <listitem> - <para> - The regular expression <quote>flavor</> can be set to - <literal>advanced</>, <literal>extended</>, or <literal>basic</>. - The default is <literal>advanced</>. The <literal>extended</> - setting might be useful for exact backwards compatibility with - pre-7.4 releases of <productname>PostgreSQL</>. See - <xref linkend="posix-syntax-details"> for details. - </para> - </listitem> - </varlistentry> - <varlistentry id="guc-sql-inheritance" xreflabel="sql_inheritance"> <term><varname>sql_inheritance</varname> (<type>boolean</type>)</term> <indexterm> diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 3cec9f97bc5b47c543cd84dc6584999ed20ca8e9..b6737ac177400c1f4b4ec79cb822ea9c0c9c4c23 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.490 2009/10/13 22:46:13 petere Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.491 2009/10/21 20:38:58 tgl Exp $ --> <chapter id="functions"> <title>Functions and Operators</title> @@ -3308,8 +3308,7 @@ substring('foobar' from '#"o_b#"%' for '#') <lineannotation>NULL</lineannotat <para> <acronym>POSIX</acronym> regular expressions provide a more - powerful means for - pattern matching than the <function>LIKE</function> and + powerful means for pattern matching than the <function>LIKE</function> and <function>SIMILAR TO</> operators. Many Unix tools such as <command>egrep</command>, <command>sed</command>, or <command>awk</command> use a pattern @@ -3572,12 +3571,12 @@ SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo; <note> <para> - The form of regular expressions accepted by - <productname>PostgreSQL</> can be chosen by setting the <xref - linkend="guc-regex-flavor"> run-time parameter. The usual - setting is <literal>advanced</>, but one might choose - <literal>extended</> for backwards compatibility with - pre-7.4 releases of <productname>PostgreSQL</>. + <productname>PostgreSQL</> always initially presumes that a regular + expression follows the ARE rules. However, the more limited ERE or + BRE rules can be chosen by prepending an <firstterm>embedded option</> + to the RE pattern, as described in <xref linkend="posix-metasyntax">. + This can be useful for compatibility with applications that expect + exactly the <acronym>POSIX</acronym> 1003.2 rules. </para> </note> @@ -4278,7 +4277,7 @@ SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo; <entry> (where <replaceable>m</> is a nonzero digit, and <replaceable>nn</> is some more digits, and the decimal value <replaceable>mnn</> is not greater than the number of closing capturing - parentheses seen so far) + parentheses seen so far) a back reference to the <replaceable>mnn</>'th subexpression </entry> </row> </tbody> @@ -4310,12 +4309,12 @@ SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo; </para> <para> - Normally the flavor of RE being used is determined by - <varname>regex_flavor</>. - However, this can be overridden by a <firstterm>director</> prefix. + An RE can begin with one of two special <firstterm>director</> prefixes. If an RE begins with <literal>***:</>, - the rest of the RE is taken as an ARE regardless of - <varname>regex_flavor</>. + the rest of the RE is taken as an ARE. (This normally has no effect in + <productname>PostgreSQL</>, since REs are assumed to be AREs; + but it does have an effect if ERE or BRE mode had been specified by + the <replaceable>flags</> parameter to a regex function.) If an RE begins with <literal>***=</>, the rest of the RE is taken to be a literal string, with all characters considered ordinary characters. @@ -4326,10 +4325,14 @@ SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo; a sequence <literal>(?</><replaceable>xyz</><literal>)</> (where <replaceable>xyz</> is one or more alphabetic characters) specifies options affecting the rest of the RE. - These options override any previously determined options (including - both the RE flavor and case sensitivity). + These options override any previously determined options — + in particular, they can override the case-sensitivity behavior implied by + a regex operator, or the <replaceable>flags</> parameter to a regex + function. The available option letters are shown in <xref linkend="posix-embedded-options-table">. + Note that these same option letters are used in the <replaceable>flags</> + parameters of regex functions. </para> <table id="posix-embedded-options-table"> @@ -4700,10 +4703,6 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})'); </para> </listitem> </itemizedlist> - - While these differences are unlikely to create a problem for most - applications, you can avoid them if necessary by - setting <varname>regex_flavor</> to <literal>extended</>. </para> </sect3> diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 118d42d2a0acf7befaf7249391cabb4081c16346..6c09531f2ffbd9428d40175b5a765856dd0f7c70 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) @@ -414,16 +410,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 e85ab06819c80d7a7df2ee4382e4f87ec114afd7..20d4180e9b9aaf3efbe38d63494ebf20eaf31a44 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 4cc88225583f8b34767858d5002105c87541f24b..33f38a20c48649d9a9eb645168227a3bcc97f8a2 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}, @@ -2658,15 +2650,6 @@ static struct config_enum ConfigureNamesEnum[] = }, #endif - { - {"regex_flavor", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS, - gettext_noop("Sets the regular expression \"flavor\"."), - NULL - }, - ®ex_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."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index ce853a74819ac5d3c3835eda34d2198acd8a7843..4c5f1590de4c08e083f6466e6387a7fa697784e5 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 abd90bc07c081a4dd5b37a68a2ed60fed7350a93..15975bc4786eb7ba66c2870ca67d8a1959996056 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 d77f4b6ecd913d321b0e8121db865478d6218064..c400c67e0ecb1a4e4d4a0eeee342bcb268a991aa 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 a580daa089ddde3a05ede33c478abbe44d6707e6..1fd2b98f6e8df422af540e771051f26246aa7937 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 9966606275c9b32ac50182cb1974e0d18e6fdecd..a7b795af47d6660c405093b5a61d42808ee054b9 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');