The appended patch addresses the outstanding issues of the recent guc patch.
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 8 May 2007 16:33:51 +0000 (16:33 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 8 May 2007 16:33:51 +0000 (16:33 +0000)
It makes PGCLIENTENCODING work again and uses bsearch() instead of
iterating over the array of guc variables in guc_get_index().

Joachim Wieland

src/backend/utils/misc/guc.c

index 9f9d1e1bcbf9d5925ef0d61980345ac3d6ea75b8..a496489ebf3bdab1f11608bfd7a888fd22dfce2e 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.390 2007/05/04 01:13:44 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.391 2007/05/08 16:33:51 petere Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -2692,18 +2692,6 @@ add_guc_variable(struct config_generic * var, int elevel)
    return true;
 }
 
-static int
-guc_get_index(const char *name)
-{
-   int i;
-
-   for (i = 0; i < num_guc_variables; i++)
-       if (guc_name_compare(name, guc_variables[i]->name) == 0)
-           return i;
-
-   return -1;
-}
-
 /*
  * Create and add a placeholder variable. It's presumed to belong
  * to a valid custom variable class at this point.
@@ -2843,6 +2831,30 @@ guc_name_compare(const char *namea, const char *nameb)
 }
 
 
+static int
+guc_get_index(const char *name)
+{
+   const char **key = &name;
+   struct config_generic **res;
+
+   Assert(name);
+
+   /*
+    * By equating const char ** with struct config_generic *, we are assuming
+    * the name field is first in config_generic.
+    */
+   res = (struct config_generic **) bsearch((void *) &key,
+                                            (void *) guc_variables,
+                                            num_guc_variables,
+                                            sizeof(struct config_generic *),
+                                            guc_var_compare);
+   if (!res)
+       return -1;
+
+   return res - guc_variables;
+}
+
+
 /*
  * Initialize GUC options during program startup.
  *
@@ -4095,9 +4107,10 @@ set_config_option(const char *name, const char *value,
     * we can't set the variable itself.  There's one exception to
     * this rule: if we want to apply the default value to variables
     * that were removed from the configuration file.  This is
-    * indicated by source == PGC_S_DEFAULT.
+    * indicated by source == PGC_S_DEFAULT and context == PGC_SIGHUP.
     */
-   if (record->source > source && source != PGC_S_DEFAULT)
+   if (record->source > source
+       && !(source == PGC_S_DEFAULT && context == PGC_SIGHUP))
    {
        if (changeVal && !makeDefault)
        {