diff --git a/doc/src/sgml/ref/alter_user.sgml b/doc/src/sgml/ref/alter_user.sgml
index 9b8a39b376..411a6dcc38 100644
--- a/doc/src/sgml/ref/alter_user.sgml
+++ b/doc/src/sgml/ref/alter_user.sgml
@@ -38,10 +38,10 @@ ALTER USER role_specification [ WIT
ALTER USER name RENAME TO new_name
-ALTER USER role_specification SET configuration_parameter { TO | = } { value | DEFAULT }
-ALTER USER role_specification SET configuration_parameter FROM CURRENT
-ALTER USER role_specification RESET configuration_parameter
-ALTER USER role_specification RESET ALL
+ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
+ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT
+ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter
+ALTER USER { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL
where role_specification can be:
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 62092ff7ec..7d0de99baf 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -250,7 +250,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
AlterOperatorStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
- AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt
+ AlterCompositeTypeStmt AlterUserMappingStmt
AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt
AlterDefaultPrivilegesStmt DefACLAction
AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
@@ -262,9 +262,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
CreateAssertStmt CreateTransformStmt CreateTrigStmt CreateEventTrigStmt
CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatePolicyStmt
CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
- DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
+ DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
DropAssertStmt DropCastStmt DropRoleStmt
- DropUserStmt DropdbStmt DropTableSpaceStmt
+ DropdbStmt DropTableSpaceStmt
DropTransformStmt
DropUserMappingStmt ExplainStmt FetchStmt
GrantStmt GrantRoleStmt ImportForeignSchemaStmt IndexStmt InsertStmt
@@ -841,8 +841,6 @@ stmt :
| AlterTSConfigurationStmt
| AlterTSDictionaryStmt
| AlterUserMappingStmt
- | AlterUserSetStmt
- | AlterUserStmt
| AnalyzeStmt
| CheckPointStmt
| ClosePortalStmt
@@ -890,7 +888,6 @@ stmt :
| DoStmt
| DropAssertStmt
| DropCastStmt
- | DropGroupStmt
| DropOpClassStmt
| DropOpFamilyStmt
| DropOwnedStmt
@@ -900,7 +897,6 @@ stmt :
| DropTableSpaceStmt
| DropTransformStmt
| DropRoleStmt
- | DropUserStmt
| DropUserMappingStmt
| DropdbStmt
| ExecuteStmt
@@ -1130,6 +1126,14 @@ AlterRoleStmt:
n->options = $5;
$$ = (Node *)n;
}
+ | ALTER USER RoleSpec opt_with AlterOptRoleList
+ {
+ AlterRoleStmt *n = makeNode(AlterRoleStmt);
+ n->role = $3;
+ n->action = +1; /* add, if there are members */
+ n->options = $5;
+ $$ = (Node *)n;
+ }
;
opt_in_database:
@@ -1154,37 +1158,23 @@ AlterRoleSetStmt:
n->setstmt = $5;
$$ = (Node *)n;
}
- ;
-
-
-/*****************************************************************************
- *
- * Alter a postgresql DBMS user
- *
- *****************************************************************************/
-
-AlterUserStmt:
- ALTER USER RoleSpec 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 RoleSpec SetResetClause
+ | ALTER USER RoleSpec opt_in_database SetResetClause
{
AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
n->role = $3;
- n->database = NULL;
- n->setstmt = $4;
+ n->database = $4;
+ n->setstmt = $5;
$$ = (Node *)n;
}
- ;
+ | ALTER USER ALL opt_in_database SetResetClause
+ {
+ AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
+ n->role = NULL;
+ n->database = $4;
+ n->setstmt = $5;
+ $$ = (Node *)n;
+ }
+ ;
/*****************************************************************************
@@ -1211,17 +1201,7 @@ DropRoleStmt:
n->roles = $5;
$$ = (Node *)n;
}
- ;
-
-/*****************************************************************************
- *
- * Drop a postgresql DBMS user
- *
- * XXX As with DROP ROLE, no CASCADE/RESTRICT here.
- *****************************************************************************/
-
-DropUserStmt:
- DROP USER role_list
+ | DROP USER role_list
{
DropRoleStmt *n = makeNode(DropRoleStmt);
n->missing_ok = FALSE;
@@ -1235,6 +1215,20 @@ DropUserStmt:
n->missing_ok = TRUE;
$$ = (Node *)n;
}
+ | DROP GROUP_P role_list
+ {
+ DropRoleStmt *n = makeNode(DropRoleStmt);
+ n->missing_ok = FALSE;
+ n->roles = $3;
+ $$ = (Node *)n;
+ }
+ | DROP GROUP_P IF_P EXISTS role_list
+ {
+ DropRoleStmt *n = makeNode(DropRoleStmt);
+ n->missing_ok = TRUE;
+ n->roles = $5;
+ $$ = (Node *)n;
+ }
;
@@ -1279,31 +1273,6 @@ add_drop: ADD_P { $$ = +1; }
;
-/*****************************************************************************
- *
- * Drop a postgresql group
- *
- * XXX As with DROP ROLE, no CASCADE/RESTRICT here.
- *****************************************************************************/
-
-DropGroupStmt:
- DROP GROUP_P role_list
- {
- DropRoleStmt *n = makeNode(DropRoleStmt);
- n->missing_ok = FALSE;
- n->roles = $3;
- $$ = (Node *)n;
- }
- | DROP GROUP_P IF_P EXISTS role_list
- {
- DropRoleStmt *n = makeNode(DropRoleStmt);
- n->missing_ok = TRUE;
- n->roles = $5;
- $$ = (Node *)n;
- }
- ;
-
-
/*****************************************************************************
*
* Manipulate a schema
diff --git a/src/test/regress/expected/rolenames.out b/src/test/regress/expected/rolenames.out
index fd058e4f7d..dce82f5de7 100644
--- a/src/test/regress/expected/rolenames.out
+++ b/src/test/regress/expected/rolenames.out
@@ -310,9 +310,9 @@ ERROR: syntax error at or near "CURRENT_ROLE"
LINE 1: ALTER USER CURRENT_ROLE WITH LOGIN;
^
ALTER USER ALL WITH REPLICATION; -- error
-ERROR: syntax error at or near "ALL"
+ERROR: syntax error at or near "WITH"
LINE 1: ALTER USER ALL WITH REPLICATION;
- ^
+ ^
ALTER USER SESSION_ROLE WITH NOREPLICATION; -- error
ERROR: role "session_role" does not exist
ALTER USER PUBLIC WITH NOREPLICATION; -- error
@@ -392,9 +392,6 @@ ALTER USER SESSION_USER SET application_name to 'BAR';
ALTER USER "current_user" SET application_name to 'FOOFOO';
ALTER USER "Public" SET application_name to 'BARBAR';
ALTER USER ALL SET application_name to 'SLAP';
-ERROR: syntax error at or near "ALL"
-LINE 1: ALTER USER ALL SET application_name to 'SLAP';
- ^
SELECT * FROM chksetconfig();
db | role | rolkeyword | setconfig
-----+------------------+--------------+---------------------------
@@ -419,9 +416,6 @@ ALTER USER SESSION_USER RESET application_name;
ALTER USER "current_user" RESET application_name;
ALTER USER "Public" RESET application_name;
ALTER USER ALL RESET application_name;
-ERROR: syntax error at or near "ALL"
-LINE 1: ALTER USER ALL RESET application_name;
- ^
SELECT * FROM chksetconfig();
db | role | rolkeyword | setconfig
----+------+------------+-----------