Hi, Attached patch which fixes my review comments.
Since code changes were good, just fixed reported cosmetic changes. David, can you please cross check? Thanks -- Jeevan B Chalke Principal Software Engineer, Product Development EnterpriseDB Corporation The Enterprise PostgreSQL Company
diff --git a/contrib/tsearch2/tsearch2.c b/contrib/tsearch2/tsearch2.c index 143dabb..4354c5b 100644 --- a/contrib/tsearch2/tsearch2.c +++ b/contrib/tsearch2/tsearch2.c @@ -363,7 +363,7 @@ tsa_tsearch2(PG_FUNCTION_ARGS) tgargs[i + 1] = trigger->tgargs[i]; tgargs[1] = pstrdup(GetConfigOptionByName("default_text_search_config", - NULL)); + NULL, false)); tgargs_old = trigger->tgargs; trigger->tgargs = tgargs; trigger->tgnargs++; diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index c6e3540..7f6c4ad 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -16435,7 +16435,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); <indexterm> <primary>current_setting</primary> </indexterm> - <literal><function>current_setting(<parameter>setting_name</parameter>)</function></literal> + <literal><function>current_setting(<parameter>setting_name</parameter> [, <parameter>missing_ok</parameter> ])</function></literal> </entry> <entry><type>text</type></entry> <entry>get current value of setting</entry> @@ -16474,7 +16474,9 @@ SELECT collation for ('foo' COLLATE "de_DE"); The function <function>current_setting</function> yields the current value of the setting <parameter>setting_name</parameter>. It corresponds to the <acronym>SQL</acronym> command - <command>SHOW</command>. An example: + <command>SHOW</command>. If <parameter>setting</parameter> does not exist, + throws an error unless <parameter>missing_ok</parameter> is + <literal>true</literal>. An example: <programlisting> SELECT current_setting('datestyle'); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index b3c9f14..a43925d 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -7137,7 +7137,7 @@ ExtractSetVariableArgs(VariableSetStmt *stmt) case VAR_SET_VALUE: return flatten_set_variable_args(stmt->name, stmt->args); case VAR_SET_CURRENT: - return GetConfigOptionByName(stmt->name, NULL); + return GetConfigOptionByName(stmt->name, NULL, false); default: return NULL; } @@ -7206,7 +7206,7 @@ set_config_by_name(PG_FUNCTION_ARGS) true, 0, false); /* get the new current value */ - new_value = GetConfigOptionByName(name, NULL); + new_value = GetConfigOptionByName(name, NULL, false); /* Convert return string to text */ PG_RETURN_TEXT_P(cstring_to_text(new_value)); @@ -7633,7 +7633,7 @@ GetPGVariableResultDesc(const char *name) const char *varname; /* Get the canonical spelling of name */ - (void) GetConfigOptionByName(name, &varname); + (void) GetConfigOptionByName(name, &varname, false); /* need a tuple descriptor representing a single TEXT column */ tupdesc = CreateTemplateTupleDesc(1, false); @@ -7656,7 +7656,7 @@ ShowGUCConfigOption(const char *name, DestReceiver *dest) char *value; /* Get the value and canonical spelling of name */ - value = GetConfigOptionByName(name, &varname); + value = GetConfigOptionByName(name, &varname, false); /* need a tuple descriptor representing a single TEXT column */ tupdesc = CreateTemplateTupleDesc(1, false); @@ -7740,19 +7740,26 @@ ShowAllGUCConfig(DestReceiver *dest) } /* - * Return GUC variable value by name; optionally return canonical - * form of name. Return value is palloc'd. + * Return GUC variable value by name; optionally return canonical form of + * name. If the GUC is unset, then throw an error unless missing_ok is true, + * in which case return NULL. Return value is palloc'd. */ char * -GetConfigOptionByName(const char *name, const char **varname) +GetConfigOptionByName(const char *name, const char **varname, bool missing_ok) { struct config_generic *record; record = find_option(name, false, ERROR); if (record == NULL) + { + if (missing_ok) + return NULL; + ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("unrecognized configuration parameter \"%s\"", name))); + } + if ((record->flags & GUC_SUPERUSER_ONLY) && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), @@ -8046,12 +8053,42 @@ show_config_by_name(PG_FUNCTION_ARGS) varname = TextDatumGetCString(PG_GETARG_DATUM(0)); /* Get the value */ - varval = GetConfigOptionByName(varname, NULL); + varval = GetConfigOptionByName(varname, NULL, false); + + /* Convert to text */ + PG_RETURN_TEXT_P(cstring_to_text(varval)); +} + +/* + * show_config_by_name_missing_ok - equiv to SHOW X command but implemented as + * a function. If X does not exist, suppress the error and just return NULL + * if missing_ok is TRUE. + */ +Datum +show_config_by_name_missing_ok(PG_FUNCTION_ARGS) +{ + char *varname; + bool missing_ok; + char *varval; + + /* Get the GUC variable name */ + varname = TextDatumGetCString(PG_GETARG_DATUM(0)); + + /* Get the missing_ok value */ + missing_ok = PG_GETARG_BOOL(1); + + /* Get the value */ + varval = GetConfigOptionByName(varname, NULL, missing_ok); + + /* return NULL if this was NULL */ + if (!varval) + PG_RETURN_NULL(); /* Convert to text */ PG_RETURN_TEXT_P(cstring_to_text(varval)); } + /* * show_all_settings - equiv to SHOW ALL command but implemented as * a Table Function. diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index fe06ec2..6468be4 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -3067,6 +3067,8 @@ DESCR("convert bitstring to int8"); DATA(insert OID = 2077 ( current_setting PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ show_config_by_name _null_ _null_ _null_ )); DESCR("SHOW X as a function"); +DATA(insert OID = 4066 ( current_setting PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "25 16" _null_ _null_ _null_ _null_ _null_ show_config_by_name_missing_ok _null_ _null_ _null_ )); +DESCR("SHOW X as a function; if second argument is true then don't thrown an error if unset"); DATA(insert OID = 2078 ( set_config PGNSP PGUID 12 1 0 0 0 f f f f f f v 3 0 25 "25 25 16" _null_ _null_ _null_ _null_ _null_ set_config_by_name _null_ _null_ _null_ )); DESCR("SET X as a function"); DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,1009,25,25,25,23,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline,pending_restart}" _null_ _null_ show_all_settings _null_ _null_ _null_ )); diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index ffe1168..ed62ee4 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -355,7 +355,9 @@ extern int set_config_option(const char *name, const char *value, GucAction action, bool changeVal, int elevel, bool is_reload); extern void AlterSystemSetConfigFile(AlterSystemStmt *setstmt); -extern char *GetConfigOptionByName(const char *name, const char **varname); + +extern char *GetConfigOptionByName(const char *name, const char **varname, + bool missing_ok); extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow); extern int GetNumConfigOptions(void); diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out index 4f0065c..e20f6a9 100644 --- a/src/test/regress/expected/guc.out +++ b/src/test/regress/expected/guc.out @@ -736,3 +736,39 @@ NOTICE: text search configuration "no_such_config" does not exist select func_with_bad_set(); ERROR: invalid value for parameter "default_text_search_config": "no_such_config" reset check_function_bodies; +-- check multi-arg custom current_setting +-- this should error: +select current_setting('nosuch.setting'); +ERROR: unrecognized configuration parameter "nosuch.setting" +-- this should also error +select current_setting('nosuch.setting',false); +ERROR: unrecognized configuration parameter "nosuch.setting" +-- this should return NULL +select current_setting('nosuch.setting',true) is null; + ?column? +---------- + t +(1 row) + +-- this should now return 'nada' +set nosuch.setting = 'nada'; +select current_setting('nosuch.setting'); + current_setting +----------------- + nada +(1 row) + +-- as should this +select current_setting('nosuch.setting',false); + current_setting +----------------- + nada +(1 row) + +-- as should this +select current_setting('nosuch.setting',true); + current_setting +----------------- + nada +(1 row) + diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql index 3de8a6b..a1561f2 100644 --- a/src/test/regress/sql/guc.sql +++ b/src/test/regress/sql/guc.sql @@ -275,3 +275,25 @@ set default_text_search_config = no_such_config; select func_with_bad_set(); reset check_function_bodies; + +-- check multi-arg custom current_setting + +-- this should error: +select current_setting('nosuch.setting'); + +-- this should also error +select current_setting('nosuch.setting',false); + +-- this should return NULL +select current_setting('nosuch.setting',true) is null; + +-- this should now return 'nada' +set nosuch.setting = 'nada'; + +select current_setting('nosuch.setting'); + +-- as should this +select current_setting('nosuch.setting',false); + +-- as should this +select current_setting('nosuch.setting',true);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers