pg_settings.enumval as array - Mailing list pgsql-hackers

From Magnus Hagander
Subject pg_settings.enumval as array
Date
Msg-id 4926A7AF.8040606@hagander.net
Whole thread Raw
Responses Re: pg_settings.enumval as array
List pgsql-hackers
The attached patch changes pg_settings.enumval to be an array of text
instead of just a string, per previous discussion and the open items list.

Comments?

//Magnus
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
***************
*** 168,174 **** static bool assign_maxconnections(int newval, bool doit, GucSource source);
  static const char *assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source);

  static char *config_enum_get_options(struct config_enum *record,
!                                      const char *prefix, const char *suffix);


  /*
--- 168,175 ----
  static const char *assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source);

  static char *config_enum_get_options(struct config_enum *record,
!                                      const char *prefix, const char *suffix,
!                                      const char *separator);


  /*
***************
*** 4427,4433 **** config_enum_lookup_by_name(struct config_enum *record, const char *value, int *r
   * If suffix is non-NULL, it is added to the end of the string.
   */
  static char *
! config_enum_get_options(struct config_enum *record, const char *prefix, const char *suffix)
  {
      const struct config_enum_entry *entry = record->options;
      int        len = 0;
--- 4428,4435 ----
   * If suffix is non-NULL, it is added to the end of the string.
   */
  static char *
! config_enum_get_options(struct config_enum *record, const char *prefix,
!                         const char *suffix, const char *separator)
  {
      const struct config_enum_entry *entry = record->options;
      int        len = 0;
***************
*** 4439,4445 **** config_enum_get_options(struct config_enum *record, const char *prefix, const ch
      while (entry && entry->name)
      {
          if (!entry->hidden)
!             len += strlen(entry->name) + 2; /* string and ", " */

          entry++;
      }
--- 4441,4447 ----
      while (entry && entry->name)
      {
          if (!entry->hidden)
!             len += strlen(entry->name) + strlen(separator);

          entry++;
      }
***************
*** 4454,4460 **** config_enum_get_options(struct config_enum *record, const char *prefix, const ch
          if (!entry->hidden)
          {
              strcat(hintmsg, entry->name);
!             strcat(hintmsg, ", ");
          }

          entry++;
--- 4456,4462 ----
          if (!entry->hidden)
          {
              strcat(hintmsg, entry->name);
!             strcat(hintmsg, separator);
          }

          entry++;
***************
*** 4469,4484 **** config_enum_get_options(struct config_enum *record, const char *prefix, const ch
       * to make sure we don't write to invalid memory instead of actually
       * trying to do something smart with it.
       */
!     if (len > 1)
!         /* Replace final comma/space */
!         hintmsg[len-2] = '\0';

      strcat(hintmsg, suffix);

      return hintmsg;
  }

-
  /*
   * Call a GucStringAssignHook function, being careful to free the
   * "newval" string if the hook ereports.
--- 4471,4485 ----
       * to make sure we don't write to invalid memory instead of actually
       * trying to do something smart with it.
       */
!     if (len > strlen(separator)-1)
!         /* Replace final separator */
!         hintmsg[len-strlen(separator)] = '\0';

      strcat(hintmsg, suffix);

      return hintmsg;
  }

  /*
   * Call a GucStringAssignHook function, being careful to free the
   * "newval" string if the hook ereports.
***************
*** 5044,5050 **** set_config_option(const char *name, const char *value,
                  {
                      if (!config_enum_lookup_by_name(conf, value, &newval))
                      {
!                         char *hintmsg = config_enum_get_options(conf, "Available values: ", ".");

                          ereport(elevel,
                                  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
--- 5045,5051 ----
                  {
                      if (!config_enum_lookup_by_name(conf, value, &newval))
                      {
!                         char *hintmsg = config_enum_get_options(conf, "Available values: ", ".", ", ");

                          ereport(elevel,
                                  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
***************
*** 6249,6255 **** GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
                  values[10] = NULL;

                  /* enumvals */
!                 values[11] = config_enum_get_options((struct config_enum *) conf, "", "");

                   /* boot_val */
                  values[12] = pstrdup(config_enum_lookup_by_value(lconf, lconf->boot_val));
--- 6250,6256 ----
                  values[10] = NULL;

                  /* enumvals */
!                 values[11] = config_enum_get_options((struct config_enum *) conf, "{\"", "\"}", "\",\"");

                   /* boot_val */
                  values[12] = pstrdup(config_enum_lookup_by_value(lconf, lconf->boot_val));
***************
*** 6385,6391 **** show_all_settings(PG_FUNCTION_ARGS)
          TupleDescInitEntry(tupdesc, (AttrNumber) 11, "max_val",
                             TEXTOID, -1, 0);
          TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals",
!                            TEXTOID, -1, 0);
           TupleDescInitEntry(tupdesc, (AttrNumber) 13, "boot_val",
                              TEXTOID, -1, 0);
           TupleDescInitEntry(tupdesc, (AttrNumber) 14, "reset_val",
--- 6386,6392 ----
          TupleDescInitEntry(tupdesc, (AttrNumber) 11, "max_val",
                             TEXTOID, -1, 0);
          TupleDescInitEntry(tupdesc, (AttrNumber) 12, "enumvals",
!                            CSTRINGARRAYOID, -1, 0);
           TupleDescInitEntry(tupdesc, (AttrNumber) 13, "boot_val",
                              TEXTOID, -1, 0);
           TupleDescInitEntry(tupdesc, (AttrNumber) 14, "reset_val",
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 3166,3172 **** DATA(insert OID = 2077 (  current_setting    PGNSP PGUID 12 1 0 0 f f t f s 1 25 "2
  DESCR("SHOW X as a function");
  DATA(insert OID = 2078 (  set_config        PGNSP PGUID 12 1 0 0 f f f f v 3 25 "25 25 16" _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 f f t t s 0 2249 ""
"{25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,23}""{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}"
show_all_settings_null_ _null_ _null_ )); 
  DESCR("SHOW ALL as a function");
  DATA(insert OID = 1371 (  pg_lock_status   PGNSP PGUID 12 1 1000 0 f f t t v 0 2249 ""
"{25,26,26,23,21,25,28,26,26,21,25,23,25,16}""{o,o,o,o,o,o,o,o,o,o,o,o,o,o}"
"{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}"
pg_lock_status_null_ _null_ _null_ )); 
  DESCR("view system lock information");
--- 3166,3172 ----
  DESCR("SHOW X as a function");
  DATA(insert OID = 2078 (  set_config        PGNSP PGUID 12 1 0 0 f f f f v 3 25 "25 25 16" _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 f f t t s 0 2249 ""
"{25,25,25,25,25,25,25,25,25,25,25,1263,25,25,25,23}""{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}"
show_all_settings_null_ _null_ _null_ )); 
  DESCR("SHOW ALL as a function");
  DATA(insert OID = 1371 (  pg_lock_status   PGNSP PGUID 12 1 1000 0 f f t t v 0 2249 ""
"{25,26,26,23,21,25,28,26,26,21,25,23,25,16}""{o,o,o,o,o,o,o,o,o,o,o,o,o,o}"
"{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted}"
pg_lock_status_null_ _null_ _null_ )); 
  DESCR("view system lock information");

pgsql-hackers by date:

Previous
From: "Pavan Deolasee"
Date:
Subject: Re: Hot Standby (commit fest version - v5)
Next
From: Simon Riggs
Date:
Subject: Re: Hot Standby (commit fest version - v5)