show() function - Mailing list pgsql-patches

From Joe Conway
Subject show() function
Date
Msg-id 3D13EC54.4070304@joeconway.com
Whole thread Raw
Responses Re: show() function
Re: show() function
List pgsql-patches
Attached is a patch which (I believe) addresses Peter's concerns with
respect to the previous showguc patch. In this patch, contrib/showguc is
gone, the term GUC is not exposed to user space, and a builtin
show('gucvarname') function returning a single scalar value has been
added, e.g.:

test=# select show('wal_sync_method');
    show
-----------
  fdatasync
(1 row)

I will work up new table function API examples per Peter's suggestion,
and finish the C API documentation (hopefully before the weekend is
over) in a separate patch.

If there are no further objections, please apply.

Thanks,

Joe
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /opt/src/cvs/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.70
diff -c -r1.70 guc.c
*** src/backend/utils/misc/guc.c    16 Jun 2002 00:09:12 -0000    1.70
--- src/backend/utils/misc/guc.c    22 Jun 2002 02:33:37 -0000
***************
*** 819,825 ****


  static int guc_var_compare(const void *a, const void *b);
! static void _ShowOption(struct config_generic *record);


  /*
--- 819,825 ----


  static int guc_var_compare(const void *a, const void *b);
! static char *_ShowOption(struct config_generic *record);


  /*
***************
*** 2199,2210 ****
  ShowGUCConfigOption(const char *name)
  {
      struct config_generic *record;

      record = find_option(name);
      if (record == NULL)
          elog(ERROR, "Option '%s' is not recognized", name);

!     _ShowOption(record);
  }

  /*
--- 2199,2216 ----
  ShowGUCConfigOption(const char *name)
  {
      struct config_generic *record;
+     char *val;

      record = find_option(name);
      if (record == NULL)
          elog(ERROR, "Option '%s' is not recognized", name);

!     val = _ShowOption(record);
!     if(val != NULL)
!     {
!         elog(INFO, "%s is %s", record->name, val);
!         pfree(val);
!     }
  }

  /*
***************
*** 2214,2234 ****
  ShowAllGUCConfig(void)
  {
      int            i;

      for (i = 0; i < num_guc_variables; i++)
      {
          struct config_generic *conf = guc_variables[i];

          if ((conf->flags & GUC_NO_SHOW_ALL) == 0)
!             _ShowOption(conf);
      }
  }

! static void
  _ShowOption(struct config_generic *record)
  {
      char        buffer[256];
      const char *val;

      switch (record->vartype)
      {
--- 2220,2314 ----
  ShowAllGUCConfig(void)
  {
      int            i;
+     char       *val;

      for (i = 0; i < num_guc_variables; i++)
      {
          struct config_generic *conf = guc_variables[i];

          if ((conf->flags & GUC_NO_SHOW_ALL) == 0)
!         {
!             val = _ShowOption(conf);
!             if(val != NULL)
!             {
!                 elog(INFO, "%s is %s", conf->name, val);
!                 pfree(val);
!             }
!         }
      }
  }

! /*
!  * Return GUC variable value by name
!  */
! char *
! GetConfigOptionByName(const char *name)
! {
!     struct config_generic *record;
!
!     record = find_option(name);
!     if (record == NULL)
!         elog(ERROR, "Option '%s' is not recognized", name);
!
!     return _ShowOption(record);
! }
!
! /*
!  * Return GUC variable value and set varname for a specific
!  * variable by number.
!  */
! char *
! GetConfigOptionByNum(int varnum, char **varname)
! {
!     struct config_generic *conf = guc_variables[varnum];
!
!     *varname = pstrdup(conf->name);
!
!     if ((conf->flags & GUC_NO_SHOW_ALL) == 0)
!         return _ShowOption(conf);
!     else
!         return NULL;
! }
!
! /*
!  * Return the total number of GUC variables
!  */
! int
! GetNumConfigOptions(void)
! {
!     return num_guc_variables;
! }
!
! /*
!  * show_config_by_name - equiv to SHOW X command but implemented as
!  * a function.
!  */
! Datum
! show_config_by_name(PG_FUNCTION_ARGS)
! {
!     char   *varname;
!     char   *varval;
!     text   *result_text;
!
!     /* Get the GUC variable name */
!     varname = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(PG_GETARG_TEXT_P(0))));
!
!     /* Get the value */
!     varval = GetConfigOptionByName(varname);
!
!     /* Convert to text */
!     result_text = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(varval)));
!
!     /* return it */
!     PG_RETURN_TEXT_P(result_text);
! }
!
! static char *
  _ShowOption(struct config_generic *record)
  {
      char        buffer[256];
      const char *val;
+     char       *retval;

      switch (record->vartype)
      {
***************
*** 2292,2298 ****
              break;
      }

!     elog(INFO, "%s is %s", record->name, val);
  }


--- 2372,2380 ----
              break;
      }

!     retval = pstrdup(val);
!
!     return retval;
  }


Index: src/include/catalog/catversion.h
===================================================================
RCS file: /opt/src/cvs/pgsql/src/include/catalog/catversion.h,v
retrieving revision 1.136
diff -c -r1.136 catversion.h
*** src/include/catalog/catversion.h    20 Jun 2002 20:29:43 -0000    1.136
--- src/include/catalog/catversion.h    22 Jun 2002 02:35:42 -0000
***************
*** 53,58 ****
   */

  /*                            yyyymmddN */
! #define CATALOG_VERSION_NO    200206151

  #endif
--- 53,58 ----
   */

  /*                            yyyymmddN */
! #define CATALOG_VERSION_NO    200206211

  #endif
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /opt/src/cvs/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.243
diff -c -r1.243 pg_proc.h
*** src/include/catalog/pg_proc.h    20 Jun 2002 20:29:44 -0000    1.243
--- src/include/catalog/pg_proc.h    22 Jun 2002 02:35:28 -0000
***************
*** 2881,2886 ****
--- 2881,2889 ----
  DATA(insert OID = 2074 (  substring            PGNSP PGUID 14 f f f t f i 3 25 "25 25 25" 100 0 0 100    "select
substring($1,like_escape($2, $3))" - _null_ )); 
  DESCR("substitutes regular expression with escape argument");

+ DATA(insert OID = 2099 (  show                PGNSP PGUID 12 f f f t f s 1 25 "25" 100 0 0 100 show_config_by_name -
_null_)); 
+ DESCR("SHOW X as a function");
+
  /* Aggregates (moved here from pg_aggregate for 7.3) */

  DATA(insert OID = 2100 (  avg                PGNSP PGUID 12 t f f f f i 1 1700 "20" 100 0 0 100  aggregate_dummy -
_null_)); 
Index: src/include/utils/builtins.h
===================================================================
RCS file: /opt/src/cvs/pgsql/src/include/utils/builtins.h,v
retrieving revision 1.186
diff -c -r1.186 builtins.h
*** src/include/utils/builtins.h    20 Jun 2002 20:29:52 -0000    1.186
--- src/include/utils/builtins.h    22 Jun 2002 02:33:23 -0000
***************
*** 633,636 ****
--- 633,639 ----
  extern Datum quote_ident(PG_FUNCTION_ARGS);
  extern Datum quote_literal(PG_FUNCTION_ARGS);

+ /* guc.c */
+ extern Datum show_config_by_name(PG_FUNCTION_ARGS);
+
  #endif   /* BUILTINS_H */
Index: src/include/utils/guc.h
===================================================================
RCS file: /opt/src/cvs/pgsql/src/include/utils/guc.h,v
retrieving revision 1.17
diff -c -r1.17 guc.h
*** src/include/utils/guc.h    17 May 2002 01:19:19 -0000    1.17
--- src/include/utils/guc.h    22 Jun 2002 02:23:14 -0000
***************
*** 86,91 ****
--- 86,94 ----
                                bool isLocal, bool DoIt);
  extern void ShowGUCConfigOption(const char *name);
  extern void ShowAllGUCConfig(void);
+ extern char *GetConfigOptionByName(const char *name);
+ extern char *GetConfigOptionByNum(int varnum, char **varname);
+ extern int GetNumConfigOptions(void);

  extern void SetPGVariable(const char *name, List *args, bool is_local);
  extern void GetPGVariable(const char *name);

pgsql-patches by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: Reduce heap tuple header size
Next
From: Bruce Momjian
Date:
Subject: Re: Reduce heap tuple header size