* error.
     */
    save_client_min_messages =
-       pstrdup(GetConfigOption("client_min_messages", false));
+       pstrdup(GetConfigOption("client_min_messages", false, false));
    if (client_min_messages < WARNING)
        (void) set_config_option("client_min_messages", "warning",
                                 PGC_USERSET, PGC_S_SESSION,
                                 GUC_ACTION_LOCAL, true);
 
    save_log_min_messages =
-       pstrdup(GetConfigOption("log_min_messages", false));
+       pstrdup(GetConfigOption("log_min_messages", false, false));
    if (log_min_messages < WARNING)
        (void) set_config_option("log_min_messages", "warning",
                                 PGC_SUSET, PGC_S_SESSION,
     * but we cannot do that.  We have to actually set the search_path GUC in
     * case the extension script examines or changes it.
     */
-   save_search_path = pstrdup(GetConfigOption("search_path", false));
+   save_search_path = pstrdup(GetConfigOption("search_path", false, false));
 
    initStringInfo(&pathbuf);
    appendStringInfoString(&pathbuf, quote_identifier(schemaName));
 
        /* In SIGHUP cases in the postmaster, report changes */
        if (context == PGC_SIGHUP && !IsUnderPostmaster)
        {
-           const char *preval = GetConfigOption(item->name, false);
+           const char *preval = GetConfigOption(item->name, true, false);
 
-           /* 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 */
 
            if (pre_value)
            {
-               const char *post_value = GetConfigOption(item->name, false);
+               const char *post_value = GetConfigOption(item->name, true, false);
 
                if (!post_value)
                    post_value = "";
 
 
 
 /*
- * Fetch the current value of the option `name'. If the option doesn't exist,
- * throw an ereport and don't return.
+ * Fetch the current value of the option `name', as a string.
+ *
+ * If the option doesn't exist, return NULL if missing_ok is true (NOTE that
+ * this cannot be distinguished from a string variable with a NULL value!),
+ * otherwise throw an ereport and don't return.
  *
  * If restrict_superuser is true, we also enforce that only superusers can
  * see GUC_SUPERUSER_ONLY variables.  This should only be passed as true
  * valid until the next call to configuration related functions.
  */
 const char *
-GetConfigOption(const char *name, bool restrict_superuser)
+GetConfigOption(const char *name, bool missing_ok, bool restrict_superuser)
 {
    struct config_generic *record;
    static char buffer[256];
 
    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)));
+                errmsg("unrecognized configuration parameter \"%s\"",
+                       name)));
+   }
    if (restrict_superuser &&
        (record->flags & GUC_SUPERUSER_ONLY) &&
        !superuser())
 
 
 extern void EmitWarningsOnPlaceholders(const char *className);
 
-extern const char *GetConfigOption(const char *name, bool restrict_superuser);
+extern const char *GetConfigOption(const char *name, bool missing_ok,
+               bool restrict_superuser);
 extern const char *GetConfigOptionResetString(const char *name);
 extern void ProcessConfigFile(GucContext context);
 extern void InitializeGUCOptions(void);