summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/misc/guc-file.l6
-rw-r--r--src/backend/utils/misc/guc.c40
-rw-r--r--src/include/utils/guc.h1
3 files changed, 44 insertions, 3 deletions
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index 3d71a393570..f5a0f87ea1c 100644
--- a/src/backend/utils/misc/guc-file.l
+++ b/src/backend/utils/misc/guc-file.l
@@ -317,9 +317,9 @@ ProcessConfigFile(GucContext context)
/* In SIGHUP cases in the postmaster, report changes */
if (context == PGC_SIGHUP && !IsUnderPostmaster)
{
- const char *preval = GetConfigOption(item->name, false);
+ const char *preval = GetConfigOptionNoError(item->name);
- /* string variables could be NULL; treat that as empty */
+ /* If option doesn't exist yet or is NULL, treat as empty string */
if (!preval)
preval = "";
/* must dup, else might have dangling pointer below */
@@ -334,7 +334,7 @@ ProcessConfigFile(GucContext context)
if (pre_value)
{
- const char *post_value = GetConfigOption(item->name, false);
+ const char *post_value = GetConfigOptionNoError(item->name);
if (!post_value)
post_value = "";
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 4e55b161f6c..d4ca2711d71 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -5392,6 +5392,46 @@ GetConfigOption(const char *name, bool restrict_superuser)
}
/*
+ * As above, but return NULL if no such option.
+ * (This is a stopgap to avoid changing GetConfigOption's API within the
+ * 9.0.x release series.)
+ */
+const char *
+GetConfigOptionNoError(const char *name)
+{
+ struct config_generic *record;
+ static char buffer[256];
+
+ record = find_option(name, false, ERROR);
+ if (record == NULL)
+ return NULL;
+
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ return *((struct config_bool *) record)->variable ? "on" : "off";
+
+ case PGC_INT:
+ snprintf(buffer, sizeof(buffer), "%d",
+ *((struct config_int *) record)->variable);
+ return buffer;
+
+ case PGC_REAL:
+ snprintf(buffer, sizeof(buffer), "%g",
+ *((struct config_real *) record)->variable);
+ return buffer;
+
+ case PGC_STRING:
+ return *((struct config_string *) record)->variable;
+
+ case PGC_ENUM:
+ return config_enum_lookup_by_value((struct config_enum *) record,
+ *((struct config_enum *) record)->variable);
+ }
+ return NULL;
+}
+
+/*
* Get the RESET value associated with the given option.
*
* Note: this is not re-entrant, due to use of static result buffer;
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 9eb37b88604..b6879bcff18 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -253,6 +253,7 @@ extern void DefineCustomEnumVariable(
extern void EmitWarningsOnPlaceholders(const char *className);
extern const char *GetConfigOption(const char *name, bool restrict_superuser);
+extern const char *GetConfigOptionNoError(const char *name);
extern const char *GetConfigOptionResetString(const char *name);
extern void ProcessConfigFile(GucContext context);
extern void InitializeGUCOptions(void);