Skip site navigation (1) Skip section navigation (2)

Re: Allow commenting of variables in postgresql.conf to

From: Zdenek Kotala <Zdenek(dot)Kotala(at)Sun(dot)COM>
To: Andrew Dunstan <andrew(at)dunslane(dot)net>
Cc: pgsql-patches(at)postgresql(dot)org, Joachim Wieland <joe(at)mcknight(dot)de>
Subject: Re: Allow commenting of variables in postgresql.conf to
Date: 2006-05-24 14:14:52
Message-ID: 44746A5C.7010502@sun.com (view raw or flat)
Thread:
Lists: pgsql-hackerspgsql-patches
Andrew Dunstan wrote:
> Zdenek Kotala wrote:
>> There is path implements following item from todo list: "Allow 
>> commenting of variables in postgresql.conf to restore them to defaults".
>> Main idea is:
>>
>> General config structure is extend with default_val attribute to keep 
>> really default value. (There is small conflict - for string boot_val 
>> has same meaning).
>> During reconfiguration all values which has reset source equal with 
>> PGC_S_FILE are revert back to really default values. New values from
>> configuration files are set after this step and commented variables 
>> stay with default value.
>>
>
> Please resubmit your patch as a context diff, as documented here:  
> http://www.postgresql.org/docs/faqs.FAQ_DEV.html#item1.5
>
> cheers
>
> andrew
I am sorry. Here it is:



Index: src/backend/utils/misc/guc-file.l
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v
retrieving revision 1.37
diff -c -r1.37 guc-file.l
*** src/backend/utils/misc/guc-file.l    7 Mar 2006 01:03:12 -0000    1.37
--- src/backend/utils/misc/guc-file.l    24 May 2006 14:10:12 -0000
***************
*** 112,119 ****
  void
  ProcessConfigFile(GucContext context)
  {
!     int            elevel;
      struct name_value_pair *item, *head, *tail;
 
      Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
 
--- 112,120 ----
  void
  ProcessConfigFile(GucContext context)
  {
!     int            elevel, i;
      struct name_value_pair *item, *head, *tail;
+     char       *env;
 
      Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
 
***************
*** 143,148 ****
--- 144,185 ----
              goto cleanup_list;
      }
 
+     /* Revert all options with reset source PGC_S_FILE to default value.
+      * This implementation is easier then iplementing some change flag 
and verify
+      * what realy was commented out. 
+      * XXX When log_line_prefix is set in configuration file then log 
output
+      * is not correct during this phase - prefix is revert to empty value.
+      */
+     for (i = 0; i < num_guc_variables; i++)
+     {
+         struct config_generic *gconf = guc_variables[i];
+         if ( gconf->reset_source == PGC_S_FILE )
+         {
+             set_config_option(gconf->name, NULL, context,
+                   PGC_S_FILE, false, true);
+         }
+     }
+
+     /* Revert to environment variable. PGPORT is ignored, because it 
cannot be
+      * set in running state. PGC_S_FILE is used instead PGC_S_ENV so as
+      * set_config_option can override previous defined option in 
config file.
+      * If these options are still in config file They will be 
overriden in
+      * the following step.
+      */
+     env = getenv("PGDATESTYLE");
+     if (env != NULL)
+     {
+         set_config_option("datestyle", env, context,
+                             PGC_S_FILE, false, true);
+     }
+
+     env = getenv("PGCLIENTENCODING");
+     if (env != NULL)
+     {
+         set_config_option("client_encoding", env, context,
+                             PGC_S_FILE, false, true);
+     }
+
      /* If we got here all the options checked out okay, so apply them. */
      for (item = head; item; item = item->next)
      {
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.319
diff -c -r1.319 guc.c
*** src/backend/utils/misc/guc.c    11 May 2006 19:15:35 -0000    1.319
--- src/backend/utils/misc/guc.c    24 May 2006 14:10:12 -0000
***************
*** 2648,2658 ****
                      struct config_bool *conf = (struct config_bool *) 
gconf;
 
                      if (conf->assign_hook)
!                         if (!(*conf->assign_hook) (conf->reset_val, true,
                                                     PGC_S_DEFAULT))
                              elog(FATAL, "failed to initialize %s to %d",
!                                  conf->gen.name, (int) conf->reset_val);
!                     *conf->variable = conf->reset_val;
                      break;
                  }
              case PGC_INT:
--- 2648,2658 ----
                      struct config_bool *conf = (struct config_bool *) 
gconf;
 
                      if (conf->assign_hook)
!                         if (!(*conf->assign_hook) (conf->default_val, 
true,
                                                     PGC_S_DEFAULT))
                              elog(FATAL, "failed to initialize %s to %d",
!                                  conf->gen.name, (int) conf->default_val);
!                     *conf->variable = conf->reset_val = conf->default_val;
                      break;
                  }
              case PGC_INT:
***************
*** 2662,2672 ****
                      Assert(conf->reset_val >= conf->min);
                      Assert(conf->reset_val <= conf->max);
                      if (conf->assign_hook)
!                         if (!(*conf->assign_hook) (conf->reset_val, true,
                                                     PGC_S_DEFAULT))
                              elog(FATAL, "failed to initialize %s to %d",
!                                  conf->gen.name, conf->reset_val);
!                     *conf->variable = conf->reset_val;
                      break;
                  }
              case PGC_REAL:
--- 2662,2672 ----
                      Assert(conf->reset_val >= conf->min);
                      Assert(conf->reset_val <= conf->max);
                      if (conf->assign_hook)
!                         if (!(*conf->assign_hook) (conf->default_val, 
true,
                                                     PGC_S_DEFAULT))
                              elog(FATAL, "failed to initialize %s to %d",
!                                  conf->gen.name, conf->default_val);
!                     *conf->variable = conf->reset_val = 
conf->default_val;
                      break;
                  }
              case PGC_REAL:
***************
*** 2676,2686 ****
                      Assert(conf->reset_val >= conf->min);
                      Assert(conf->reset_val <= conf->max);
                      if (conf->assign_hook)
!                         if (!(*conf->assign_hook) (conf->reset_val, true,
                                                     PGC_S_DEFAULT))
                              elog(FATAL, "failed to initialize %s to %g",
!                                  conf->gen.name, conf->reset_val);
!                     *conf->variable = conf->reset_val;
                      break;
                  }
              case PGC_STRING:
--- 2676,2686 ----
                      Assert(conf->reset_val >= conf->min);
                      Assert(conf->reset_val <= conf->max);
                      if (conf->assign_hook)
!                         if (!(*conf->assign_hook) (conf->default_val, 
true,
                                                     PGC_S_DEFAULT))
                              elog(FATAL, "failed to initialize %s to %g",
!                                  conf->gen.name, conf->default_val);
!                     *conf->variable = conf->reset_val = 
conf->default_val;
                      break;
                  }
              case PGC_STRING:
***************
*** 3647,3653 ****
          case PGC_POSTMASTER:
              if (context == PGC_SIGHUP)
              {
!                 if (changeVal && !is_newvalue_equal(record, value))
                      ereport(elevel,
                              (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
                               errmsg("parameter \"%s\" cannot be 
changed after server start; configuration file change ignored",
--- 3647,3653 ----
          case PGC_POSTMASTER:
              if (context == PGC_SIGHUP)
              {
!                 if (changeVal && value != NULL && 
!is_newvalue_equal(record, value))
                      ereport(elevel,
                              (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
                               errmsg("parameter \"%s\" cannot be 
changed after server start; configuration file change ignored",
***************
*** 3723,3729 ****
       * Should we set reset/stacked values?    (If so, the behavior is not
       * transactional.)
       */
!     makeDefault = changeVal && (source <= PGC_S_OVERRIDE) && (value != 
NULL);
 
      /*
       * Ignore attempted set if overridden by previously processed setting.
--- 3723,3729 ----
       * Should we set reset/stacked values?    (If so, the behavior is not
       * transactional.)
       */
!     makeDefault = changeVal && (source <= PGC_S_OVERRIDE) && (value != 
NULL || source == PGC_S_FILE);
 
      /*
       * Ignore attempted set if overridden by previously processed setting.
***************
*** 3766,3773 ****
                  }
                  else
                  {
!                     newval = conf->reset_val;
!                     source = conf->gen.reset_source;
                  }
 
                  if (conf->assign_hook)
--- 3766,3784 ----
                  }
                  else
                  {
!                     /* Revert value to default if source is 
configuration file. It is used when
!                      * configuration parameter is removed/commented 
out in the config file. Else
!                      * RESET or SET TO DEFAULT command is called and 
reset_val is used.
!                      */
!                     if( source == PGC_S_FILE )
!                     {
!                         newval =  conf->default_val;
!                     }
!                     else
!                     {
!                         newval = conf->reset_val;
!                         source = conf->gen.reset_source;
!                     }
                  }
 
                  if (conf->assign_hook)
***************
*** 3850,3857 ****
                  }
                  else
                  {
!                     newval = conf->reset_val;
!                     source = conf->gen.reset_source;
                  }
 
                  if (conf->assign_hook)
--- 3861,3879 ----
                  }
                  else
                  {
!                     /* Revert value to default if source is 
configuration file. It is used when
!                      * configuration parameter is removed/commented 
out in the config file. Else
!                      * RESET or SET TO DEFAULT command is called and 
reset_val is used.
!                      */
!                     if( source == PGC_S_FILE )
!                     {
!                         newval =  conf->default_val;
!                     }
!                     else
!                     {
!                         newval = conf->reset_val;
!                         source = conf->gen.reset_source;
!                     }
                  }
 
                  if (conf->assign_hook)
***************
*** 3934,3941 ****
                  }
                  else
                  {
!                     newval = conf->reset_val;
!                     source = conf->gen.reset_source;
                  }
 
                  if (conf->assign_hook)
--- 3956,3974 ----
                  }
                  else
                  {
!                     /* Revert value to default if source is 
configuration file. It is used when
!                      * configuration parameter is removed/commented 
out in the config file. Else
!                      * RESET or SET TO DEFAULT command is called and 
reset_val is used.
!                      */
!                     if( source == PGC_S_FILE )
!                     {
!                         newval =  conf->default_val;
!                     }
!                     else
!                     {
!                         newval = conf->reset_val;
!                         source = conf->gen.reset_source;
!                     }
                  }
 
                  if (conf->assign_hook)
***************
*** 4009,4014 ****
--- 4042,4061 ----
                      if (conf->gen.flags & GUC_IS_NAME)
                          truncate_identifier(newval, strlen(newval), true);
                  }
+                 else if (source == PGC_S_FILE)
+                 {
+                     /* Revert value to default when item is removed 
from config file. */
+                     if ( conf->boot_val != NULL )
+                     {
+                         newval = guc_strdup(elevel, conf->boot_val);
+                         if (newval == NULL)
+                             return false;
+                     }
+                     else
+                     {
+                         return false;
+                     }
+                 }
                  else if (conf->reset_val)
                  {
                      /*
***************
*** 5111,5116 ****
--- 5158,5168 ----
  static bool
  is_newvalue_equal(struct config_generic *record, const char *newvalue)
  {
+     if( !newvalue )
+     {
+         return false;
+     }
+  
      switch (record->vartype)
      {
          case PGC_BOOL:
Index: src/include/utils/guc_tables.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/guc_tables.h,v
retrieving revision 1.22
diff -c -r1.22 guc_tables.h
*** src/include/utils/guc_tables.h    5 Mar 2006 15:59:07 -0000    1.22
--- src/include/utils/guc_tables.h    24 May 2006 14:10:13 -0000
***************
*** 142,152 ****
      /* these fields must be set correctly in initial value: */
      /* (all but reset_val are constants) */
      bool       *variable;
!     bool        reset_val;
      GucBoolAssignHook assign_hook;
      GucShowHook show_hook;
      /* variable fields, initialized at runtime: */
      bool        tentative_val;
  };
 
  struct config_int
--- 142,153 ----
      /* these fields must be set correctly in initial value: */
      /* (all but reset_val are constants) */
      bool       *variable;
!     bool        default_val;
      GucBoolAssignHook assign_hook;
      GucShowHook show_hook;
      /* variable fields, initialized at runtime: */
      bool        tentative_val;
+     bool        reset_val;
  };
 
  struct config_int
***************
*** 155,167 ****
      /* these fields must be set correctly in initial value: */
      /* (all but reset_val are constants) */
      int           *variable;
!     int            reset_val;
      int            min;
      int            max;
      GucIntAssignHook assign_hook;
      GucShowHook show_hook;
      /* variable fields, initialized at runtime: */
      int            tentative_val;
  };
 
  struct config_real
--- 156,169 ----
      /* these fields must be set correctly in initial value: */
      /* (all but reset_val are constants) */
      int           *variable;
!     int            default_val;
      int            min;
      int            max;
      GucIntAssignHook assign_hook;
      GucShowHook show_hook;
      /* variable fields, initialized at runtime: */
      int            tentative_val;
+     int            reset_val;
  };
 
  struct config_real
***************
*** 170,182 ****
      /* these fields must be set correctly in initial value: */
      /* (all but reset_val are constants) */
      double       *variable;
!     double        reset_val;
      double        min;
      double        max;
      GucRealAssignHook assign_hook;
      GucShowHook show_hook;
      /* variable fields, initialized at runtime: */
      double        tentative_val;
  };
 
  struct config_string
--- 172,186 ----
      /* these fields must be set correctly in initial value: */
      /* (all but reset_val are constants) */
      double       *variable;
!     double        default_val;
      double        min;
      double        max;
      GucRealAssignHook assign_hook;
      GucShowHook show_hook;
      /* variable fields, initialized at runtime: */
      double        tentative_val;
+       double        reset_val;
+ 
  };
 
  struct config_string


In response to

Responses

pgsql-hackers by date

Next:From: Alvaro HerreraDate: 2006-05-24 14:19:48
Subject: Re: Allow commenting of variables in postgresql.conf to
Previous:From: Andrew DunstanDate: 2006-05-24 14:01:45
Subject: Re: Allow commenting of variables in postgresql.conf to

pgsql-patches by date

Next:From: Alvaro HerreraDate: 2006-05-24 14:19:48
Subject: Re: Allow commenting of variables in postgresql.conf to
Previous:From: Andrew DunstanDate: 2006-05-24 14:12:17
Subject: Re: plperl - put schema-name in $_TD

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group