All,

> I agree that we should probably seperate the concerns here.  Personally,
> I like the idea of being able to say "CURRENT_USER" in utility commands
> to refer to the current user where a role would normally be expected, as
> I could see it simplifying things for some applications, but that's a
> new feature and independent of making role-vs-user cases more
> consistent.
>

So, I've been doing a little digging and it would appear that the ALTER
ROLE/USER consistency was brought up earlier in the year.

http://www.postgresql.org/message-id/cadyruxmv-tvsbv7mttcs+qedny6xj1+krtzfowvuhdjc5mg...@mail.gmail.com

It was returned with feedback in Commitfest 2014-06 and apparently lost
steam:

https://commitfest.postgresql.org/action/patch_view?id=1408

Tom put forward a suggestion for how to fix it:

http://www.postgresql.org/message-id/21570.1408832...@sss.pgh.pa.us

I have taken that patch and updated the documentation (attached) and ran it
through some cursory testing.

At any rate, this is probably a good starting point for those changes.

-Adam

-- 
Adam Brightwell - adam.brightw...@crunchydatasolutions.com
Database Engineer - www.crunchydatasolutions.com
diff --git a/doc/src/sgml/ref/alter_user.sgml b/doc/src/sgml/ref/alter_user.sgml
new file mode 100644
index 58ae1da..ac05682
*** a/doc/src/sgml/ref/alter_user.sgml
--- b/doc/src/sgml/ref/alter_user.sgml
*************** ALTER USER <replaceable class="PARAMETER
*** 38,47 ****
  
  ALTER USER <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable>new_name</replaceable>
  
! ALTER USER <replaceable class="PARAMETER">name</replaceable> SET <replaceable>configuration_parameter</replaceable> { TO | = } { <replaceable>value</replaceable> | DEFAULT }
! ALTER USER <replaceable class="PARAMETER">name</replaceable> SET <replaceable>configuration_parameter</replaceable> FROM CURRENT
! ALTER USER <replaceable class="PARAMETER">name</replaceable> RESET <replaceable>configuration_parameter</replaceable>
! ALTER USER <replaceable class="PARAMETER">name</replaceable> RESET ALL
  </synopsis>
   </refsynopsisdiv>
  
--- 38,47 ----
  
  ALTER USER <replaceable class="PARAMETER">name</replaceable> RENAME TO <replaceable>new_name</replaceable>
  
! ALTER USER <replaceable class="PARAMETER">name</replaceable> [ IN DATABASE <replaceable class="PARAMETER">database_name</replaceable> ] SET <replaceable>configuration_parameter</replaceable> { TO | = } { <replaceable>value</replaceable> | DEFAULT }
! ALTER USER { <replaceable class="PARAMETER">name</replaceable> | ALL } [ IN DATABASE <replaceable class="PARAMETER">database_name</replaceable> ] SET <replaceable>configuration_parameter</replaceable> FROM CURRENT
! ALTER USER { <replaceable class="PARAMETER">name</replaceable> | ALL } [ IN DATABASE <replaceable class="PARAMETER">database_name</replaceable> ] RESET <replaceable>configuration_parameter</replaceable>
! ALTER USER { <replaceable class="PARAMETER">name</replaceable> | ALL } [ IN DATABASE <replaceable class="PARAMETER">database_name</replaceable> ] RESET ALL
  </synopsis>
   </refsynopsisdiv>
  
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
new file mode 100644
index 0de9584..d7c0586
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
*************** static Node *makeRecursiveViewSelect(cha
*** 230,236 ****
  		AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
  		AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
  		AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
! 		AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt
  		AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt
  		AlterDefaultPrivilegesStmt DefACLAction
  		AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
--- 230,236 ----
  		AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
  		AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
  		AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
! 		AlterCompositeTypeStmt AlterUserMappingStmt
  		AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt
  		AlterDefaultPrivilegesStmt DefACLAction
  		AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
*************** static Node *makeRecursiveViewSelect(cha
*** 520,525 ****
--- 520,527 ----
  %type <str>		opt_existing_window_name
  %type <boolean> opt_if_not_exists
  
+ %type <str>		role_or_user
+ 
  /*
   * Non-keyword token types.  These are hard-wired into the "flex" lexer.
   * They must be listed first so that their numeric codes do not depend on
*************** stmt :
*** 756,763 ****
  			| AlterTSConfigurationStmt
  			| AlterTSDictionaryStmt
  			| AlterUserMappingStmt
- 			| AlterUserSetStmt
- 			| AlterUserStmt
  			| AnalyzeStmt
  			| CheckPointStmt
  			| ClosePortalStmt
--- 758,763 ----
*************** CreateUserStmt:
*** 1033,1042 ****
   *
   * Alter a postgresql DBMS role
   *
   *****************************************************************************/
  
  AlterRoleStmt:
! 			ALTER ROLE RoleId opt_with AlterOptRoleList
  				 {
  					AlterRoleStmt *n = makeNode(AlterRoleStmt);
  					n->role = $3;
--- 1033,1044 ----
   *
   * Alter a postgresql DBMS role
   *
+  * ALTER USER is accepted interchangeably with ALTER ROLE.
+  *
   *****************************************************************************/
  
  AlterRoleStmt:
! 			ALTER role_or_user RoleId opt_with AlterOptRoleList
  				 {
  					AlterRoleStmt *n = makeNode(AlterRoleStmt);
  					n->role = $3;
*************** AlterRoleStmt:
*** 1046,1058 ****
  				 }
  		;
  
  opt_in_database:
  			   /* EMPTY */					{ $$ = NULL; }
  			| IN_P DATABASE database_name	{ $$ = $3; }
  		;
  
  AlterRoleSetStmt:
! 			ALTER ROLE RoleId opt_in_database SetResetClause
  				{
  					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  					n->role = $3;
--- 1048,1065 ----
  				 }
  		;
  
+ role_or_user:
+ 			ROLE				{}
+ 			| USER				{}
+ 		;
+ 
  opt_in_database:
  			   /* EMPTY */					{ $$ = NULL; }
  			| IN_P DATABASE database_name	{ $$ = $3; }
  		;
  
  AlterRoleSetStmt:
! 			ALTER role_or_user RoleId opt_in_database SetResetClause
  				{
  					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  					n->role = $3;
*************** AlterRoleSetStmt:
*** 1060,1066 ****
  					n->setstmt = $5;
  					$$ = (Node *)n;
  				}
! 			| ALTER ROLE ALL opt_in_database SetResetClause
  				{
  					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  					n->role = NULL;
--- 1067,1073 ----
  					n->setstmt = $5;
  					$$ = (Node *)n;
  				}
! 			| ALTER role_or_user ALL opt_in_database SetResetClause
  				{
  					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  					n->role = NULL;
*************** AlterRoleSetStmt:
*** 1073,1108 ****
  
  /*****************************************************************************
   *
-  * Alter a postgresql DBMS user
-  *
-  *****************************************************************************/
- 
- AlterUserStmt:
- 			ALTER USER RoleId opt_with AlterOptRoleList
- 				 {
- 					AlterRoleStmt *n = makeNode(AlterRoleStmt);
- 					n->role = $3;
- 					n->action = +1;	/* add, if there are members */
- 					n->options = $5;
- 					$$ = (Node *)n;
- 				 }
- 		;
- 
- 
- AlterUserSetStmt:
- 			ALTER USER RoleId SetResetClause
- 				{
- 					AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
- 					n->role = $3;
- 					n->database = NULL;
- 					n->setstmt = $4;
- 					$$ = (Node *)n;
- 				}
- 			;
- 
- 
- /*****************************************************************************
-  *
   * Drop a postgresql DBMS role
   *
   * XXX Ideally this would have CASCADE/RESTRICT options, but since a role
--- 1080,1085 ----
*************** DropUserMappingStmt: DROP USER MAPPING F
*** 4493,4501 ****
   *		QUERY :
   *				ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
   *
   ****************************************************************************/
  
! AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
  				{
  					AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
  					n->username = $5;
--- 4470,4483 ----
   *		QUERY :
   *				ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
   *
+  * Note: we also accept "ALTER ROLE MAPPING", because distinguishing that
+  * case in the grammar would require us to distinguish ROLE from USER in all
+  * other ALTER cases, and we don't want to do that.  However, that spelling
+  * of the command is nonstandard and is not documented.
+  *
   ****************************************************************************/
  
! AlterUserMappingStmt: ALTER role_or_user MAPPING FOR auth_ident SERVER name alter_generic_options
  				{
  					AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
  					n->username = $5;
*************** RenameStmt: ALTER AGGREGATE func_name ag
*** 7611,7626 ****
  					n->newname = $7;
  					$$ = (Node *)n;
  				}
! 			| ALTER ROLE RoleId RENAME TO RoleId
! 				{
! 					RenameStmt *n = makeNode(RenameStmt);
! 					n->renameType = OBJECT_ROLE;
! 					n->subname = $3;
! 					n->newname = $6;
! 					n->missing_ok = false;
! 					$$ = (Node *)n;
! 				}
! 			| ALTER USER RoleId RENAME TO RoleId
  				{
  					RenameStmt *n = makeNode(RenameStmt);
  					n->renameType = OBJECT_ROLE;
--- 7593,7599 ----
  					n->newname = $7;
  					$$ = (Node *)n;
  				}
! 			| ALTER role_or_user RoleId RENAME TO RoleId
  				{
  					RenameStmt *n = makeNode(RenameStmt);
  					n->renameType = OBJECT_ROLE;
-- 
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