On 06/27/2014 06:22 AM, Amit Kapila wrote:
> On Thu, Jun 26, 2014 at 8:17 PM, Vik Fearing <vik.fear...@dalibo.com
> <mailto:vik.fear...@dalibo.com>> wrote:
>> On 06/26/2014 05:07 AM, Amit Kapila wrote:
>> > I think it will make sense if we support RESET ALL as well similar
>> > to Alter Database .. RESET ALL syntax.  Do you see any reason
>> > why we shouldn't support RESET ALL syntax for Alter System?
>>
>> Yes, that makes sense.  I've added that in the attached version 2 of the
>> patch.
> 
> I think the idea used in patch to implement RESET ALL is sane.  In passing
> by, I noticed that modified lines in .sgml have crossed 80 char
> boundary which
> is generally preferred to be maintained..
> 
> Refer below modification.
> 
> !    values to the <filename>postgresql.auto.conf</filename> file.
> Setting the parameter to
> !    <literal>DEFAULT</literal>, or using the <command>RESET</command>
> variant, removes the configuration entry from

I did that on purpose so that it's easy for a reviewer/committer to see
what changed.

This third patch reformats the documentation in the way I expected it to
be committed.
-- 
Vik
*** a/doc/src/sgml/ref/alter_system.sgml
--- b/doc/src/sgml/ref/alter_system.sgml
***************
*** 22,27 **** PostgreSQL documentation
--- 22,30 ----
   <refsynopsisdiv>
  <synopsis>
  ALTER SYSTEM SET <replaceable class="PARAMETER">configuration_parameter</replaceable> { TO | = } { <replaceable class="PARAMETER">value</replaceable> | '<replaceable class="PARAMETER">value</replaceable>' | DEFAULT }
+ 
+ ALTER SYSTEM RESET <replaceable class="PARAMETER">configuration_parameter</replaceable>
+ ALTER SYSTEM RESET ALL
  </synopsis>
   </refsynopsisdiv>
  
***************
*** 30,37 **** ALTER SYSTEM SET <replaceable class="PARAMETER">configuration_parameter</replace
  
    <para>
     <command>ALTER SYSTEM</command> writes the configuration parameter
!    values to the <filename>postgresql.auto.conf</filename> file. With
!    <literal>DEFAULT</literal>, it removes a configuration entry from
     <filename>postgresql.auto.conf</filename> file. The values will be
     effective after reload of server configuration (SIGHUP) or in next 
     server start based on the type of configuration parameter modified.
--- 33,41 ----
  
    <para>
     <command>ALTER SYSTEM</command> writes the configuration parameter
!    values to the <filename>postgresql.auto.conf</filename> file.
!    Setting the parameter to <literal>DEFAULT</literal>, or using the
!    <command>RESET</command> variant, removes the configuration entry from
     <filename>postgresql.auto.conf</filename> file. The values will be
     effective after reload of server configuration (SIGHUP) or in next 
     server start based on the type of configuration parameter modified.
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
***************
*** 401,407 **** static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
  
  %type <istmt>	insert_rest
  
! %type <vsetstmt> generic_set set_rest set_rest_more SetResetClause FunctionSetResetClause
  
  %type <node>	TableElement TypedTableElement ConstraintElem TableFuncElement
  %type <node>	columnDef columnOptions
--- 401,407 ----
  
  %type <istmt>	insert_rest
  
! %type <vsetstmt> generic_set set_rest set_rest_more generic_reset reset_rest SetResetClause FunctionSetResetClause
  
  %type <node>	TableElement TypedTableElement ConstraintElem TableFuncElement
  %type <node>	columnDef columnOptions
***************
*** 1567,1605 **** NonReservedWord_or_Sconst:
  		;
  
  VariableResetStmt:
! 			RESET var_name
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = $2;
! 					$$ = (Node *) n;
  				}
! 			| RESET TIME ZONE
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = "timezone";
! 					$$ = (Node *) n;
  				}
! 			| RESET TRANSACTION ISOLATION LEVEL
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = "transaction_isolation";
! 					$$ = (Node *) n;
  				}
! 			| RESET SESSION AUTHORIZATION
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = "session_authorization";
! 					$$ = (Node *) n;
  				}
! 			| RESET ALL
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET_ALL;
! 					$$ = (Node *) n;
  				}
  		;
  
--- 1567,1613 ----
  		;
  
  VariableResetStmt:
! 			RESET reset_rest						{ $$ = (Node *) $2; }
! 		;
! 
! reset_rest:
! 			generic_reset							{ $$ = $1; }
! 			| TIME ZONE
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = "timezone";
! 					$$ = n;
  				}
! 			| TRANSACTION ISOLATION LEVEL
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = "transaction_isolation";
! 					$$ = n;
  				}
! 			| SESSION AUTHORIZATION
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = "session_authorization";
! 					$$ = n;
  				}
! 		;
! 
! generic_reset:
! 			var_name
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET;
! 					n->name = $1;
! 					$$ = n;
  				}
! 			| ALL
  				{
  					VariableSetStmt *n = makeNode(VariableSetStmt);
  					n->kind = VAR_RESET_ALL;
! 					$$ = n;
  				}
  		;
  
***************
*** 8474,8480 **** DropdbStmt: DROP DATABASE database_name
  
  /*****************************************************************************
   *
!  *		ALTER SYSTEM SET
   *
   * This is used to change configuration parameters persistently.
   *****************************************************************************/
--- 8482,8488 ----
  
  /*****************************************************************************
   *
!  *		ALTER SYSTEM
   *
   * This is used to change configuration parameters persistently.
   *****************************************************************************/
***************
*** 8486,8491 **** AlterSystemStmt:
--- 8494,8505 ----
  					n->setstmt = $4;
  					$$ = (Node *)n;
  				}
+ 			| ALTER SYSTEM_P RESET generic_reset
+ 				{
+ 					AlterSystemStmt *n = makeNode(AlterSystemStmt);
+ 					n->setstmt = $4;
+ 					$$ = (Node *)n;
+ 				}
  		;
  
  
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
***************
*** 6693,6698 **** AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
--- 6693,6699 ----
  {
  	char	   *name;
  	char	   *value;
+ 	bool		resetall = false;
  	int			Tmpfd = -1;
  	FILE	   *infile;
  	struct config_generic *record;
***************
*** 6720,6756 **** AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
  			break;
  
  		case VAR_SET_DEFAULT:
  			value = NULL;
  			break;
  		default:
  			elog(ERROR, "unrecognized alter system stmt type: %d",
  				 altersysstmt->setstmt->kind);
  			break;
  	}
  
! 	record = find_option(name, false, LOG);
! 	if (record == NULL)
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 			   errmsg("unrecognized configuration parameter \"%s\"", name)));
  
! 	/*
! 	 * Don't allow the parameters which can't be set in configuration
! 	 * files to be set in PG_AUTOCONF_FILENAME file.
! 	 */
! 	if ((record->context == PGC_INTERNAL) ||
! 		(record->flags & GUC_DISALLOW_IN_FILE) ||
! 		(record->flags & GUC_DISALLOW_IN_AUTO_FILE))
! 		 ereport(ERROR,
! 				 (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
! 				  errmsg("parameter \"%s\" cannot be changed",
! 						 name)));
! 
! 	if (!validate_conf_option(record, name, value, PGC_S_FILE,
! 							  ERROR, true, NULL,
! 							  &newextra))
! 		ereport(ERROR,
! 		(errmsg("invalid value for parameter \"%s\": \"%s\"", name, value)));
  
  
  	/*
--- 6721,6768 ----
  			break;
  
  		case VAR_SET_DEFAULT:
+ 		case VAR_RESET:
+ 			value = NULL;
+ 			break;
+ 
+ 		case VAR_RESET_ALL:
  			value = NULL;
+ 			resetall = true;
  			break;
+ 
  		default:
  			elog(ERROR, "unrecognized alter system stmt type: %d",
  				 altersysstmt->setstmt->kind);
  			break;
  	}
  
! 	/* If we're resetting everything, there's no need to validate anything */
! 	if (!resetall)
! 	{
! 		record = find_option(name, false, LOG);
! 		if (record == NULL)
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				   errmsg("unrecognized configuration parameter \"%s\"", name)));
  
! 		/*
! 		 * Don't allow the parameters which can't be set in configuration
! 		 * files to be set in PG_AUTOCONF_FILENAME file.
! 		 */
! 		if ((record->context == PGC_INTERNAL) ||
! 			(record->flags & GUC_DISALLOW_IN_FILE) ||
! 			(record->flags & GUC_DISALLOW_IN_AUTO_FILE))
! 			 ereport(ERROR,
! 					 (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
! 					  errmsg("parameter \"%s\" cannot be changed",
! 							 name)));
! 	
! 		if (!validate_conf_option(record, name, value, PGC_S_FILE,
! 								  ERROR, true, NULL,
! 								  &newextra))
! 			ereport(ERROR,
! 			(errmsg("invalid value for parameter \"%s\": \"%s\"", name, value)));
! 	}
  
  
  	/*
***************
*** 6782,6808 **** AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt)
  
  	PG_TRY();
  	{
! 		if (stat(AutoConfFileName, &st) == 0)
  		{
! 			/* open file PG_AUTOCONF_FILENAME */
! 			infile = AllocateFile(AutoConfFileName, "r");
! 			if (infile == NULL)
! 				ereport(ERROR,
! 						(errmsg("failed to open auto conf file \"%s\": %m ",
! 								AutoConfFileName)));
! 
! 			/* parse it */
! 			ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail);
! 
! 			FreeFile(infile);
  		}
  
- 		/*
- 		 * replace with new value if the configuration parameter already
- 		 * exists OR add it as a new cofiguration parameter in the file.
- 		 */
- 		replace_auto_config_value(&head, &tail, AutoConfFileName, name, value);
- 
  		/* Write and sync the new contents to the temporary file */
  		write_auto_conf_file(Tmpfd, AutoConfTmpFileName, &head);
  
--- 6794,6828 ----
  
  	PG_TRY();
  	{
! 		/* 
! 		 * If we're going to reset everything, then don't open the file, don't
! 		 * parse it, and don't do anything with the configuration list.  Just
! 		 * write out an empty file.
! 		 */
! 		if (!resetall)
  		{
! 			if (stat(AutoConfFileName, &st) == 0)
! 			{
! 				/* open file PG_AUTOCONF_FILENAME */
! 				infile = AllocateFile(AutoConfFileName, "r");
! 				if (infile == NULL)
! 					ereport(ERROR,
! 							(errmsg("failed to open auto conf file \"%s\": %m ",
! 									AutoConfFileName)));
! 	
! 				/* parse it */
! 				ParseConfigFp(infile, AutoConfFileName, 0, LOG, &head, &tail);
! 	
! 				FreeFile(infile);
! 			}
! 	
! 			/*
! 			 * replace with new value if the configuration parameter already
! 			 * exists OR add it as a new cofiguration parameter in the file.
! 			 */
! 			replace_auto_config_value(&head, &tail, AutoConfFileName, name, value);
  		}
  
  		/* Write and sync the new contents to the temporary file */
  		write_auto_conf_file(Tmpfd, AutoConfTmpFileName, &head);
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to