Index: doc/src/sgml/ref/reset.sgml
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/ref/reset.sgml,v
retrieving revision 1.10
diff -c -r1.10 reset.sgml
*** doc/src/sgml/ref/reset.sgml	2000/12/25 23:15:26	1.10
--- doc/src/sgml/ref/reset.sgml	2001/06/07 04:43:17
***************
*** 16,21 ****
--- 16,24 ----
    <synopsis>
  RESET <replaceable class="PARAMETER">variable</replaceable>
    </synopsis>
+   <synopsis>
+ RESET ALL
+   </synopsis>
  
    <refsect2 id="R2-SQL-RESET-1">
     <title>Inputs</title>
***************
*** 27,32 ****
--- 30,43 ----
         <para>
  	The name of a run-time parameter. See <xref
  	linkend="sql-set" endterm="sql-set-title"> for a list.
+        </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>ALL</term>
+       <listitem>
+        <para>
+         Resets all run-time parameters to default values.
         </para>
        </listitem>
       </varlistentry>
Index: doc/src/sgml/ref/show.sgml
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/ref/show.sgml,v
retrieving revision 1.11
diff -c -r1.11 show.sgml
*** doc/src/sgml/ref/show.sgml	2000/12/25 23:15:26	1.11
--- doc/src/sgml/ref/show.sgml	2001/06/07 04:43:17
***************
*** 16,21 ****
--- 16,24 ----
    <synopsis>
  SHOW <replaceable class="PARAMETER">name</replaceable>
    </synopsis>
+   <synopsis>
+ SHOW ALL
+   </synopsis>
  
    <refsect2 id="R2-SQL-SHOW-1">
     <title>Inputs</title>
***************
*** 29,34 ****
--- 32,45 ----
          The name of a run-time parameter. See
  	<xref linkend="sql-set" endterm="sql-set-title">
          for a list.
+        </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>ALL</term>
+       <listitem>
+        <para>
+         Show all current session parameters.
         </para>
        </listitem>
       </varlistentry>
Index: src/backend/commands/variable.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/variable.c,v
retrieving revision 1.48
diff -c -r1.48 variable.c
*** src/backend/commands/variable.c	2001/05/08 21:06:42	1.48
--- src/backend/commands/variable.c	2001/06/07 04:43:17
***************
*** 39,47 ****
  #endif
  
  
! static bool show_date(void);
! static bool reset_date(void);
! static bool parse_date(char *);
  static bool show_timezone(void);
  static bool reset_timezone(void);
  static bool parse_timezone(char *);
--- 39,47 ----
  #endif
  
  
! static bool show_datestyle(void);
! static bool reset_datestyle(void);
! static bool parse_datestyle(char *);
  static bool show_timezone(void);
  static bool reset_timezone(void);
  static bool parse_timezone(char *);
***************
*** 192,198 ****
  static bool DefaultEuroDates;
  
  static bool
! parse_date(char *value)
  {
  	char	   *tok;
  	int			dcnt = 0,
--- 192,198 ----
  static bool DefaultEuroDates;
  
  static bool
! parse_datestyle(char *value)
  {
  	char	   *tok;
  	int			dcnt = 0,
***************
*** 200,206 ****
  
  	if (value == NULL)
  	{
! 		reset_date();
  		return TRUE;
  	}
  
--- 200,206 ----
  
  	if (value == NULL)
  	{
! 		reset_datestyle();
  		return TRUE;
  	}
  
***************
*** 261,267 ****
  }
  
  static bool
! show_date(void)
  {
  	char		buf[64];
  
--- 261,267 ----
  }
  
  static bool
! show_datestyle(void)
  {
  	char		buf[64];
  
***************
*** 291,297 ****
  }
  
  static bool
! reset_date(void)
  {
  	DateStyle = DefaultDateStyle;
  	EuroDates = DefaultEuroDates;
--- 291,297 ----
  }
  
  static bool
! reset_datestyle(void)
  {
  	DateStyle = DefaultDateStyle;
  	EuroDates = DefaultEuroDates;
***************
*** 325,331 ****
  	DBDate = strdup(DBDate);
  
  	/* Parse desired setting into DateStyle/EuroDates */
! 	parse_date(DBDate);
  
  	free(DBDate);
  
--- 325,331 ----
  	DBDate = strdup(DBDate);
  
  	/* Parse desired setting into DateStyle/EuroDates */
! 	parse_datestyle(DBDate);
  
  	free(DBDate);
  
***************
*** 396,402 ****
  
  	tz = getenv("TZ");
  
! 	elog(NOTICE, "Time zone is %s", ((tz != NULL) ? tz : "unknown"));
  
  	return TRUE;
  }	/* show_timezone() */
--- 396,402 ----
  
  	tz = getenv("TZ");
  
! 	elog(NOTICE, "Time zone is %s", ((tz != NULL) ? tz : "unset"));
  
  	return TRUE;
  }	/* show_timezone() */
***************
*** 586,592 ****
  static bool
  show_random_seed(void)
  {
! 	elog(NOTICE, "Seed for random number generator is not known");
  	return (TRUE);
  }
  
--- 586,592 ----
  static bool
  show_random_seed(void)
  {
! 	elog(NOTICE, "Seed for random number generator is unavailable");
  	return (TRUE);
  }
  
***************
*** 708,714 ****
  	 * Special cases ought to be removed and handled separately by TCOP
  	 */
  	if (strcasecmp(name, "datestyle") == 0)
! 		parse_date(mvalue);
  	else if (strcasecmp(name, "timezone") == 0)
  		parse_timezone(mvalue);
  	else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
--- 708,714 ----
  	 * Special cases ought to be removed and handled separately by TCOP
  	 */
  	if (strcasecmp(name, "datestyle") == 0)
! 		parse_datestyle(mvalue);
  	else if (strcasecmp(name, "timezone") == 0)
  		parse_timezone(mvalue);
  	else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
***************
*** 724,741 ****
  	else if (strcasecmp(name, "session_authorization") == 0)
  		SetSessionAuthorization(value);
  	else
! 		SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET);
  
  	if (mvalue)
  		pfree(mvalue);
  }
  
- 
  void
  GetPGVariable(const char *name)
  {
  	if (strcasecmp(name, "datestyle") == 0)
! 		show_date();
  	else if (strcasecmp(name, "timezone") == 0)
  		show_timezone();
  	else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
--- 724,740 ----
  	else if (strcasecmp(name, "session_authorization") == 0)
  		SetSessionAuthorization(value);
  	else
! 		SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET, false);
  
  	if (mvalue)
  		pfree(mvalue);
  }
  
  void
  GetPGVariable(const char *name)
  {
  	if (strcasecmp(name, "datestyle") == 0)
! 		show_datestyle();
  	else if (strcasecmp(name, "timezone") == 0)
  		show_timezone();
  	else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
***************
*** 748,754 ****
  		show_server_encoding();
  	else if (strcasecmp(name, "seed") == 0)
  		show_random_seed();
! 	else
  	{
  		const char *val = GetConfigOption(name);
  
--- 747,763 ----
  		show_server_encoding();
  	else if (strcasecmp(name, "seed") == 0)
  		show_random_seed();
! 	else if (strcasecmp(name, "all") == 0)
! 	{
! 		ShowAllGUCConfig();
! 		show_datestyle();
! 		show_timezone();
! 		show_DefaultXactIsoLevel();
! 		show_XactIsoLevel();
! 		show_client_encoding();
! 		show_server_encoding();
! 		show_random_seed();
! 	} else
  	{
  		const char *val = GetConfigOption(name);
  
***************
*** 760,766 ****
  ResetPGVariable(const char *name)
  {
  	if (strcasecmp(name, "datestyle") == 0)
! 		reset_date();
  	else if (strcasecmp(name, "timezone") == 0)
  		reset_timezone();
  	else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
--- 769,775 ----
  ResetPGVariable(const char *name)
  {
  	if (strcasecmp(name, "datestyle") == 0)
! 		reset_datestyle();
  	else if (strcasecmp(name, "timezone") == 0)
  		reset_timezone();
  	else if (strcasecmp(name, "DefaultXactIsoLevel") == 0)
***************
*** 773,778 ****
  		reset_server_encoding();
  	else if (strcasecmp(name, "seed") == 0)
  		reset_random_seed();
! 	else
! 		SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET);
  }
--- 782,798 ----
  		reset_server_encoding();
  	else if (strcasecmp(name, "seed") == 0)
  		reset_random_seed();
! 	else if (strcasecmp(name, "all") == 0)
! 	{
! 		reset_DefaultXactIsoLevel();
! 		reset_XactIsoLevel();
! 		reset_random_seed();
! 		/* reset_server_encoding(); */
! 		reset_client_encoding();
! 		reset_datestyle();
! 		reset_timezone();
! 
! 		ResetAllOptions();
! 	} else
! 		SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET, false);
  }
Index: src/backend/parser/gram.y
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.228
diff -c -r2.228 gram.y
*** src/backend/parser/gram.y	2001/06/04 23:27:23	2.228
--- src/backend/parser/gram.y	2001/06/07 04:43:21
***************
*** 860,865 ****
--- 860,871 ----
  					n->name  = "timezone";
  					$$ = (Node *) n;
  				}
+ 		| SHOW ALL
+ 				{
+ 					VariableShowStmt *n = makeNode(VariableShowStmt);
+ 					n->name  = "all";
+ 					$$ = (Node *) n;
+ 				}
  		| SHOW TRANSACTION ISOLATION LEVEL
  				{
  					VariableShowStmt *n = makeNode(VariableShowStmt);
***************
*** 884,889 ****
--- 890,901 ----
  				{
  					VariableResetStmt *n = makeNode(VariableResetStmt);
  					n->name  = "XactIsoLevel";
+ 					$$ = (Node *) n;
+ 				}
+ 		| RESET ALL
+ 				{
+ 					VariableResetStmt *n = makeNode(VariableResetStmt);
+ 					n->name  = "all";
  					$$ = (Node *) n;
  				}
  		;
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.216
diff -c -r1.216 postmaster.c
*** src/backend/postmaster/postmaster.c	2001/06/03 14:53:56	1.216
--- src/backend/postmaster/postmaster.c	2001/06/07 04:43:23
***************
*** 533,539 ****
  							elog(ERROR, "-c %s requires argument", optarg);
  					}
  
! 					SetConfigOption(name, value, PGC_POSTMASTER);
  					free(name);
  					if (value)
  						free(value);
--- 533,539 ----
  							elog(ERROR, "-c %s requires argument", optarg);
  					}
  
! 					SetConfigOption(name, value, PGC_POSTMASTER, true);
  					free(name);
  					if (value)
  						free(value);
Index: src/backend/tcop/postgres.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/tcop/postgres.c,v
retrieving revision 1.218
diff -c -r1.218 postgres.c
*** src/backend/tcop/postgres.c	2001/04/14 19:11:45	1.218
--- src/backend/tcop/postgres.c	2001/06/07 04:43:29
***************
*** 1462,1468 ****
  
  					/* all options are allowed if not under postmaster */
  					SetConfigOption(name, value,
! 					 (IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER);
  					free(name);
  					if (value)
  						free(value);
--- 1462,1468 ----
  
  					/* all options are allowed if not under postmaster */
  					SetConfigOption(name, value,
! 					 (IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER, true);
  					free(name);
  					if (value)
  						free(value);
Index: src/backend/utils/misc/guc-file.l
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/misc/guc-file.l,v
retrieving revision 1.7
diff -c -r1.7 guc-file.l
*** src/backend/utils/misc/guc-file.l	2001/06/01 20:29:43	1.7
--- src/backend/utils/misc/guc-file.l	2001/06/07 04:43:29
***************
*** 260,272 ****
  	 */
      for(item = head; item; item=item->next)
  	{
! 		if (!set_config_option(item->name, item->value, context, false))
  			goto cleanup_exit;
  	}
  
      /* If we got here all the options parsed okay. */
  	for(item = head; item; item=item->next)
! 		set_config_option(item->name, item->value, context, true);
  
   cleanup_exit:
  	free_name_value_list(head);
--- 260,272 ----
  	 */
      for(item = head; item; item=item->next)
  	{
! 		if (!set_config_option(item->name, item->value, context, false, false))
  			goto cleanup_exit;
  	}
  
      /* If we got here all the options parsed okay. */
  	for(item = head; item; item=item->next)
! 		set_config_option(item->name, item->value, context, true, true);
  
   cleanup_exit:
  	free_name_value_list(head);
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.36
diff -c -r1.36 guc.c
*** src/backend/utils/misc/guc.c	2001/05/17 17:44:18	1.36
--- src/backend/utils/misc/guc.c	2001/06/07 04:43:30
***************
*** 136,144 ****
  	const char *name;
  	GucContext	context;
  	char	  **variable;
! 	const char *default_val;
  	bool		(*parse_hook) (const char *proposed);
  	void		(*assign_hook) (const char *newval);
  };
  
  
--- 136,145 ----
  	const char *name;
  	GucContext	context;
  	char	  **variable;
! 	const char *boot_default_val;
  	bool		(*parse_hook) (const char *proposed);
  	void		(*assign_hook) (const char *newval);
+ 	char		*default_val;
  };
  
  
***************
*** 433,438 ****
--- 434,448 ----
  	{
  		char	   *str = NULL;
  
+ 		if (!ConfigureNamesString[i].default_val
+ 				&& ConfigureNamesString[i].boot_default_val)
+ 		{
+ 			str = strdup(ConfigureNamesString[i].boot_default_val);
+ 			if (str == NULL)
+ 				elog(ERROR, "out of memory");
+ 
+ 			ConfigureNamesString[i].default_val = str;
+ 		}
  		if (ConfigureNamesString[i].default_val)
  		{
  			str = strdup(ConfigureNamesString[i].default_val);
***************
*** 582,588 ****
   */
  bool
  set_config_option(const char *name, const char *value, GucContext
! 				  context, bool DoIt)
  {
  	struct config_generic *record;
  	enum config_type type;
--- 592,598 ----
   */
  bool
  set_config_option(const char *name, const char *value, GucContext
! 				  context, bool DoIt, bool makeDefault)
  {
  	struct config_generic *record;
  	enum config_type type;
***************
*** 653,659 ****
--- 663,673 ----
  						return false;
  					}
  					if (DoIt)
+ 					{
  						*conf->variable = boolval;
+ 						if (makeDefault)
+ 							conf->default_val = boolval;
+ 					}
  				}
  				else if (DoIt)
  					*conf->variable = conf->default_val;
***************
*** 681,687 ****
--- 695,705 ----
  						return false;
  					}
  					if (DoIt)
+ 					{
  						*conf->variable = intval;
+ 						if (makeDefault)
+ 							conf->default_val = intval;
+ 					}
  				}
  				else if (DoIt)
  					*conf->variable = conf->default_val;
***************
*** 709,715 ****
--- 727,737 ----
  						return false;
  					}
  					if (DoIt)
+ 					{
  						*conf->variable = dval;
+ 						if (makeDefault)
+ 							conf->default_val = dval;
+ 					}
  				}
  				else if (DoIt)
  					*conf->variable = conf->default_val;
***************
*** 742,753 ****
--- 764,796 ----
  						if (*conf->variable)
  							free(*conf->variable);
  						*conf->variable = str;
+ 						if (makeDefault)
+ 						{
+ 							if (conf->default_val)
+ 								free(conf->default_val);
+ 							str = strdup(value);
+ 							if (str == NULL) {
+ 								elog(elevel, "out of memory");
+ 								return false;
+ 							}
+ 							conf->default_val = str;
+ 						}
  					}
  				}
  				else if (DoIt)
  				{
  					char	   *str;
  
+ 					if (!conf->default_val && conf->boot_default_val)
+ 					{
+ 						str = strdup(conf->boot_default_val);
+ 						if (str == NULL)
+ 						{
+ 							elog(elevel, "out of memory");
+ 							return false;
+ 						}
+ 						conf->boot_default_val = str;
+ 					}
  					str = strdup(conf->default_val);
  					if (str == NULL)
  					{
***************
*** 776,784 ****
   */
  void
  SetConfigOption(const char *name, const char *value, GucContext
! 				context)
  {
! 	(void) set_config_option(name, value, context, true);
  }
  
  
--- 819,827 ----
   */
  void
  SetConfigOption(const char *name, const char *value, GucContext
! 				context, bool makeDefault)
  {
! 	(void) set_config_option(name, value, context, true, makeDefault);
  }
  
  
***************
*** 825,830 ****
--- 868,925 ----
  	}
  	return NULL;
  }
+ 
+ static void
+ _ShowOption(enum config_type opttype, struct config_generic *record)
+ {
+ 	static char buffer[256];
+ 	char *val;
+ 
+ 	switch (opttype)
+ 	{
+ 		case PGC_BOOL:
+ 			val = *((struct config_bool *) record)->variable ? "on" : "off";
+ 			break;
+ 		case PGC_INT:
+ 			snprintf(buffer, 256, "%d", *((struct config_int *) record)->variable);
+ 			val = buffer;
+ 			break;
+ 
+ 		case PGC_REAL:
+ 			snprintf(buffer, 256, "%g", *((struct config_real *) record)->variable);
+ 			val = buffer;
+ 			break;
+ 
+ 		case PGC_STRING:
+ 			val = strlen(*((struct config_string *) record)->variable) != 0 ?
+ 				*((struct config_string *) record)->variable : "unset";
+ 			break;
+ 
+ 		default:
+ 			val = "???";
+ 	}
+ 	elog(NOTICE, "%s is %s", record->name, val);
+ }
+ 
+ void
+ ShowAllGUCConfig(void)
+ {
+ 	int			i;
+ 
+ 	for (i = 0; ConfigureNamesBool[i].name; i++)
+ 		_ShowOption(PGC_BOOL, (struct config_generic *)&ConfigureNamesBool[i]);
+ 
+ 	for (i = 0; ConfigureNamesInt[i].name; i++)
+ 		_ShowOption(PGC_INT, (struct config_generic *)&ConfigureNamesInt[i]);
+ 
+ 	for (i = 0; ConfigureNamesReal[i].name; i++)
+ 		_ShowOption(PGC_REAL, (struct config_generic *)&ConfigureNamesReal[i]);
+ 
+ 	for (i = 0; ConfigureNamesString[i].name; i++)
+ 		_ShowOption(PGC_STRING, (struct config_generic *)&ConfigureNamesString[i]);
+ }
+ 
+ 
  
  
  
Index: src/include/utils/guc.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/utils/guc.h,v
retrieving revision 1.6
diff -c -r1.6 guc.h
*** src/include/utils/guc.h	2001/03/22 04:01:12	1.6
--- src/include/utils/guc.h	2001/06/07 04:43:32
***************
*** 46,57 ****
  } GucContext;
  
  
! void		SetConfigOption(const char *name, const char *value, GucContext context);
  const char *GetConfigOption(const char *name);
  void		ProcessConfigFile(GucContext context);
  void		ResetAllOptions(void);
  void		ParseLongOption(const char *string, char **name, char **value);
! bool		set_config_option(const char *name, const char *value, GucContext context, bool DoIt);
  
  
  extern bool Debug_print_query;
--- 46,58 ----
  } GucContext;
  
  
! void		SetConfigOption(const char *name, const char *value, GucContext context, bool makeDefault);
  const char *GetConfigOption(const char *name);
  void		ProcessConfigFile(GucContext context);
  void		ResetAllOptions(void);
  void		ParseLongOption(const char *string, char **name, char **value);
! bool		set_config_option(const char *name, const char *value, GucContext context, bool DoIt, bool makeDefault);
! void		ShowAllGUCConfig(void);
  
  
  extern bool Debug_print_query;
