Thanks for the comment. At Tue, 23 Aug 2022 09:58:47 -0400, Robert Haas <robertmh...@gmail.com> wrote in > On Mon, Aug 22, 2022 at 9:29 PM Kyotaro Horiguchi > <horikyota....@gmail.com> wrote: > In the case of GRANT, that's more ambiguous, because the word OPTION > actually appears in the syntax. But isn't that sort of accidental?
Yeah I think so. My intension is to let the translators do their work more mechanically. A capital-letter word is automatically recognized as a keyword then can be copied as-is. I would translate "ADMIN OPTION" to "ADMIN OPTION" in Japanese but "admin option" is translated to "管理者オプション" which is a bit hard for the readers to come up with the connection to "ADMIN OPTION" (or ADMIN <roles>). I guess this is somewhat simliar to use "You need to give capability to administrate the role" to suggest users to add WITH ADMIN OPTION to the role. Maybe Álvaro has a similar difficulty on it. > It's quite possible to give someone the right to administer a role > without ever mentioning the OPTION keyword: Mmm.. Fair point. > In short, I'm wondering whether we should regard ADMIN as the name of > the option, but OPTION as part of the GRANT syntax, and hence > capitalize it "ADMIN option". However, if the non-English speakers on > this list have a strong preference for something else I'm certainly > not going to fight about it. "ADMIN option" which is translated into "ADMINオプション" is fine by me. I hope Álvaro thinks the same way. What do you think about the attached? > > In passing, I met the following code in the same file. > > > > > if (!have_createrole_privilege() && > > > !is_admin_of_role(currentUserId, roleid)) > > > ereport(ERROR, > > > > > > (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), > > > errmsg("must have admin option on > > > role \"%s\"", > > > rolename))); > > > > The message seems a bit short that it only mentions admin option while > > omitting CREATEROLE privilege. "must have CREATEROLE privilege or > > admin option on role %s" might be better. Or we could say just > > "insufficient privilege" or "permission denied" in the main error > > message then provide "CREATEROLE privilege or admin option on role %s > > is required" in DETAILS or HINTS message. The message was added by > > c33d575899 along with the have_createrole_privilege() call so it is > > unclear to me whether it is intentional or not. > > Yeah, I wasn't sure what to do about this. We do not mention superuser > privileges in every message where they theoretically apply, because it > would make a lot of messages longer for not much benefit. CREATEROLE > is a similar case and I think, but am not sure, that we treat it > similarly. So in my mind it is a judgement call what to do here, and > if other people think that what I picked wasn't best, we can change > it. > > For what it's worth, I'm hoping to eventually remove the CREATEROLE > exception here. The superuser exception will remain, of course. If it were simply "permission denied", I don't think about the details then seek for the way to allow that. But I don't mean to fight this for now. For the record, I would prefer the follwoing message for this sort of failure. ERROR: permission denied DETAILS: CREATEROLE or ADMIN option is required for the role. regards. -- Kyotaro Horiguchi NTT Open Source Software Center
diff --git a/doc/src/sgml/information_schema.sgml b/doc/src/sgml/information_schema.sgml index 350c75bc31..5f661552d8 100644 --- a/doc/src/sgml/information_schema.sgml +++ b/doc/src/sgml/information_schema.sgml @@ -183,8 +183,8 @@ <para> The view <literal>administrable_role_authorizations</literal> - identifies all roles that the current user has the admin option - for. + identifies all roles that the current user has the <literal>ADMIN</literal> + option for. </para> <table> diff --git a/doc/src/sgml/ref/alter_group.sgml b/doc/src/sgml/ref/alter_group.sgml index b9e641818c..4b528498df 100644 --- a/doc/src/sgml/ref/alter_group.sgml +++ b/doc/src/sgml/ref/alter_group.sgml @@ -55,7 +55,7 @@ ALTER GROUP <replaceable class="parameter">group_name</replaceable> RENAME TO <r <link linkend="sql-revoke"><command>REVOKE</command></link>. Note that <command>GRANT</command> and <command>REVOKE</command> have additional options which are not available with this command, such as the ability - to grant and revoke <literal>ADMIN OPTION</literal>, and the ability to + to grant and revoke <literal>ADMIN</literal> option, and the ability to specify the grantor. </para> diff --git a/doc/src/sgml/ref/createuser.sgml b/doc/src/sgml/ref/createuser.sgml index c6a7c603f7..22cd885c82 100644 --- a/doc/src/sgml/ref/createuser.sgml +++ b/doc/src/sgml/ref/createuser.sgml @@ -82,7 +82,8 @@ PostgreSQL documentation <listitem> <para> Indicates role that will be immediately added as a member of the new - role with admin option, giving it the right to grant membership in the + role with <literal>ADMIN</literal> option, giving it the right to + grant membership in the new role to others. Multiple roles to add as members (with admin option) of the new role can be specified by writing multiple <option>-a</option> switches. diff --git a/doc/src/sgml/ref/grant.sgml b/doc/src/sgml/ref/grant.sgml index 2fd0f34d55..8f0c572051 100644 --- a/doc/src/sgml/ref/grant.sgml +++ b/doc/src/sgml/ref/grant.sgml @@ -257,10 +257,10 @@ GRANT <replaceable class="parameter">role_name</replaceable> [, ...] TO <replace <para> If <literal>WITH ADMIN OPTION</literal> is specified, the member can in turn grant membership in the role to others, and revoke membership - in the role as well. Without the admin option, ordinary users cannot - do that. A role is not considered to hold <literal>WITH ADMIN - OPTION</literal> on itself. Database superusers can grant or revoke - membership in any role to anyone. Roles having + in the role as well. Without the <literal>ADMIN</literal> option, ordinary + users cannot do that. A role is not considered to hold + the <literal>ADMIN</literal> option on itself. Database superusers can + grant or revoke membership in any role to anyone. Roles having <literal>CREATEROLE</literal> privilege can grant or revoke membership in any role that is not a superuser. </para> @@ -269,11 +269,11 @@ GRANT <replaceable class="parameter">role_name</replaceable> [, ...] TO <replace If <literal>GRANTED BY</literal> is specified, the grant is recorded as having been done by the specified role. A user can only attribute a grant to another role if they possess the privileges of that role. The role - recorded as the grantor must have <literal>ADMIN OPTION</literal> on the + recorded as the grantor must have <literal>ADMIN</literal> option on the target role, unless it is the bootstrap superuser. When a grant is recorded as having a grantor other than the bootstrap superuser, it depends on the - grantor continuing to posess <literal>ADMIN OPTION</literal> on the role; - so, if <literal>ADMIN OPTION</literal> is revoked, dependent grants must + grantor continuing to posess <literal>ADMIN</literal> option on the role; + so, if <literal>ADMIN</literal> option is revoked, dependent grants must be revoked as well. </para> diff --git a/doc/src/sgml/ref/revoke.sgml b/doc/src/sgml/ref/revoke.sgml index 16e840458c..d783beaaa4 100644 --- a/doc/src/sgml/ref/revoke.sgml +++ b/doc/src/sgml/ref/revoke.sgml @@ -197,7 +197,7 @@ REVOKE [ ADMIN OPTION FOR ] <para> When revoking membership in a role, <literal>GRANT OPTION</literal> is instead - called <literal>ADMIN OPTION</literal>, but the behavior is similar. + called <literal>ADMIN</literal> option, but the behavior is similar. Note that, in releases prior to <productname>PostgreSQL</productname> 16, dependent privileges were not tracked for grants of role membership, and thus <literal>CASCADE</literal> had no effect for role membership. diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 511ca8d8fd..f46a7ab930 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -41,7 +41,7 @@ #include "utils/timestamp.h" /* - * Removing a role grant - or the admin option on it - might recurse to + * Removing a role grant - or the ADMIN option on it - might recurse to * dependent grants. We use these values to reason about what would need to * be done in such cases. * @@ -662,7 +662,7 @@ AlterRole(ParseState *pstate, AlterRoleStmt *stmt) * superuser. We also insist on superuser to change the BYPASSRLS * property. Otherwise, if you don't have createrole, you're only allowed * to (1) change your own password or (2) add members to a role for which - * you have ADMIN OPTION. + * you have ADMIN option. */ if (authform->rolsuper || dissuper) { @@ -704,7 +704,7 @@ AlterRole(ParseState *pstate, AlterRoleStmt *stmt) if (drolemembers && !is_admin_of_role(GetUserId(), roleid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must have admin option on role \"%s\" to add members", + errmsg("must have ADMIN option on role \"%s\" to add members", rolename))); } @@ -1483,7 +1483,7 @@ roleSpecsToIds(List *memberNames) * memberSpecs: list of RoleSpec of roles to add (used only for error messages) * memberIds: OIDs of roles to add * grantorId: who is granting the membership (InvalidOid if not set explicitly) - * admin_opt: granting admin option? + * admin_opt: granting ADMIN option? */ static void AddRoleMems(const char *rolename, Oid roleid, @@ -1503,7 +1503,7 @@ AddRoleMems(const char *rolename, Oid roleid, return; /* - * Check permissions: must have createrole or admin option on the role to + * Check permissions: must have CREATEROLE or ADMIN option on the role to * be changed. To mess with a superuser role, you gotta be superuser. */ if (superuser_arg(roleid)) @@ -1519,7 +1519,7 @@ AddRoleMems(const char *rolename, Oid roleid, !is_admin_of_role(currentUserId, roleid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must have admin option on role \"%s\"", + errmsg("must have ADMIN option on role \"%s\"", rolename))); } @@ -1543,7 +1543,7 @@ AddRoleMems(const char *rolename, Oid roleid, /* * Only allow changes to this role by one backend at a time, so that we - * can check integrity constraints like the lack of circular ADMIN OPTION + * can check integrity constraints like the lack of circular ADMIN option * grants without fear of race conditions. */ LockSharedObject(AuthIdRelationId, roleid, 0, @@ -1562,7 +1562,7 @@ AddRoleMems(const char *rolename, Oid roleid, * TO proposed_datdba" fail if is_member_of_role(pg_database_owner, * proposed_datdba). Hence, gaining a membership could reduce what a * role could do. Alternately, one could allow these memberships to - * complete loops. A role could then have actual WITH ADMIN OPTION on + * complete loops. A role could then have actual ADMIN option on * itself, prompting a decision about is_admin_of_role() treatment of * the case. * @@ -1594,7 +1594,7 @@ AddRoleMems(const char *rolename, Oid roleid, } /* - * Disallow attempts to grant ADMIN OPTION back to a user who granted it + * Disallow attempts to grant ADMIN option back to a user who granted it * to you, similar to what check_circularity does for ACLs. We want the * chains of grants to remain acyclic, so that it's always possible to use * REVOKE .. CASCADE to clean up all grants that depend on the one being @@ -1603,8 +1603,8 @@ AddRoleMems(const char *rolename, Oid roleid, * NB: This check might look redundant with the check for membership loops * above, but it isn't. That's checking for role-member loop (e.g. A is a * member of B and B is a member of A) while this is checking for a - * member-grantor loop (e.g. A gave ADMIN OPTION on X to B and now B, who - * has no other source of ADMIN OPTION on X, tries to give ADMIN OPTION on + * member-grantor loop (e.g. A gave ADMIN option on X to B and now B, who + * has no other source of ADMIN option on X, tries to give ADMIN option on * X back to A). */ if (admin_opt && grantorId != BOOTSTRAP_SUPERUSERID) @@ -1629,7 +1629,7 @@ AddRoleMems(const char *rolename, Oid roleid, if (memberid == BOOTSTRAP_SUPERUSERID) ereport(ERROR, (errcode(ERRCODE_INVALID_GRANT_OPERATION), - errmsg("admin option cannot be granted back to your own grantor"))); + errmsg("ADMIN option cannot be granted back to your own grantor"))); plan_member_revoke(memlist, actions, memberid); } @@ -1654,7 +1654,7 @@ AddRoleMems(const char *rolename, Oid roleid, if (i >= memlist->n_members) ereport(ERROR, (errcode(ERRCODE_INVALID_GRANT_OPERATION), - errmsg("admin option cannot be granted back to your own grantor"))); + errmsg("ADMIN option cannot be granted back to your own grantor"))); ReleaseSysCacheList(memlist); } @@ -1673,7 +1673,7 @@ AddRoleMems(const char *rolename, Oid roleid, /* * Check if entry for this role/member already exists; if so, give - * warning unless we are adding admin option. + * warning unless we are adding ADMIN option. */ authmem_tuple = SearchSysCache3(AUTHMEMROLEMEM, ObjectIdGetDatum(roleid), @@ -1751,7 +1751,7 @@ AddRoleMems(const char *rolename, Oid roleid, * memberSpecs: list of RoleSpec of roles to del (used only for error messages) * memberIds: OIDs of roles to del * grantorId: who is revoking the membership - * admin_opt: remove admin option only? + * admin_opt: remove ADMIN option only? * behavior: RESTRICT or CASCADE behavior for recursive removal */ static void @@ -1775,7 +1775,7 @@ DelRoleMems(const char *rolename, Oid roleid, return; /* - * Check permissions: must have createrole or admin option on the role to + * Check permissions: must have CREATEROLE or ADMIN option on the role to * be changed. To mess with a superuser role, you gotta be superuser. */ if (superuser_arg(roleid)) @@ -1791,7 +1791,7 @@ DelRoleMems(const char *rolename, Oid roleid, !is_admin_of_role(currentUserId, roleid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must have admin option on role \"%s\"", + errmsg("must have ADMIN option on role \"%s\"", rolename))); } @@ -1862,7 +1862,7 @@ DelRoleMems(const char *rolename, Oid roleid, } else { - /* Just turn off the admin option */ + /* Just turn off the ADMIN option */ HeapTuple tuple; Datum new_record[Natts_pg_auth_members] = {0}; bool new_record_nulls[Natts_pg_auth_members] = {0}; @@ -1891,7 +1891,7 @@ DelRoleMems(const char *rolename, Oid roleid, * Sanity-check, or infer, the grantor for a GRANT or REVOKE statement * targeting a role. * - * The grantor must always be either a role with ADMIN OPTION on the role in + * The grantor must always be either a role with ADMIN option on the role in * which membership is being granted, or the bootstrap superuser. This is * similar to the restriction enforced by select_best_grantor, except that * roles don't have owners, so we regard the bootstrap superuser as the @@ -1901,8 +1901,8 @@ DelRoleMems(const char *rolename, Oid roleid, * be passed as InvalidOid, and this function will infer the user to be * recorded as the grantor. In many cases, this will be the current user, but * things get more complicated when the current user doesn't possess ADMIN - * OPTION on the role but rather relies on having CREATEROLE privileges, or - * on inheriting the privileges of a role which does have ADMIN OPTION. See + * option on the role but rather relies on having CREATEROLE privileges, or + * on inheriting the privileges of a role which does have ADMIN option. See * below for details. * * If the grantor was specified by the user, then it must be a user that @@ -1931,7 +1931,7 @@ check_role_grantor(Oid currentUserId, Oid roleid, Oid grantorId, bool is_grant) return BOOTSTRAP_SUPERUSERID; /* - * Otherwise, the grantor must either have ADMIN OPTION on the role or + * Otherwise, the grantor must either have ADMIN option on the role or * inherit the privileges of a role which does. In the former case, * record the grantor as the current user; in the latter, pick one of * the roles that is "most directly" inherited by the current role @@ -1951,7 +1951,7 @@ check_role_grantor(Oid currentUserId, Oid roleid, Oid grantorId, bool is_grant) * If an explicit grantor is specified, it must be a role whose privileges * the current user possesses. * - * It should also be a role that has ADMIN OPTION on the target role, but + * It should also be a role that has ADMIN option on the target role, but * we check this condition only in case of GRANT. For REVOKE, no matching * grant should exist anyway, but if it somehow does, let the user get rid * of it. @@ -1968,7 +1968,7 @@ check_role_grantor(Oid currentUserId, Oid roleid, Oid grantorId, bool is_grant) select_best_admin(grantorId, roleid) != grantorId) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("grantor must have ADMIN OPTION on \"%s\"", + errmsg("grantor must have ADMIN option on \"%s\"", GetUserNameFromId(roleid, false)))); } else @@ -2012,7 +2012,7 @@ initialize_revoke_actions(CatCList *memlist) /* * Figure out what we would need to do in order to revoke a grant, or just the - * admin option on a grant, given that there might be dependent privileges. + * ADMIN option on a grant, given that there might be dependent privileges. * * 'memlist' should be a list of all grants for the target role. * @@ -2126,7 +2126,7 @@ plan_recursive_revoke(CatCList *memlist, RevokeRoleGrantAction *actions, actions[index] = RRG_REMOVE_ADMIN_OPTION; } - /* Determine whether the member would still have ADMIN OPTION. */ + /* Determine whether the member would still have ADMIN option. */ for (i = 0; i < memlist->n_members; ++i) { HeapTuple am_cascade_tuple; @@ -2143,7 +2143,7 @@ plan_recursive_revoke(CatCList *memlist, RevokeRoleGrantAction *actions, } } - /* If the member would still have ADMIN OPTION, we need not recurse. */ + /* If the member would still have ADMIN option, we need not recurse. */ if (would_still_have_admin_option) return; diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 3e045da31f..02f4744acb 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -4802,7 +4802,7 @@ has_rolinherit(Oid roleid) * * If admin_of is not InvalidOid, this function sets *admin_role, either * to the OID of the first role in the result list that directly possesses - * ADMIN OPTION on the role corresponding to admin_of, or to InvalidOid if + * ADMIN option on the role corresponding to admin_of, or to InvalidOid if * there is no such role. */ static List * @@ -4819,7 +4819,7 @@ roles_is_member_of(Oid roleid, enum RoleRecurseType type, if (admin_role != NULL) *admin_role = InvalidOid; - /* If cache is valid and ADMIN OPTION not sought, just return the list */ + /* If cache is valid and ADMIN option not sought, just return the list */ if (cached_role[type] == roleid && !OidIsValid(admin_of) && OidIsValid(cached_role[type])) return cached_roles[type]; @@ -5013,7 +5013,7 @@ is_member_of_role_nosuper(Oid member, Oid role) /* * Is member an admin of role? That is, is member the role itself (subject to - * restrictions below), a member (directly or indirectly) WITH ADMIN OPTION, + * restrictions below), a member (directly or indirectly) with ADMIN option, * or a superuser? */ bool @@ -5024,7 +5024,7 @@ is_admin_of_role(Oid member, Oid role) if (superuser_arg(member)) return true; - /* By policy, a role cannot have WITH ADMIN OPTION on itself. */ + /* By policy, a role cannot have ADMIN option on itself. */ if (member == role) return false; @@ -5033,11 +5033,11 @@ is_admin_of_role(Oid member, Oid role) } /* - * Find a role whose privileges "member" inherits which has ADMIN OPTION + * Find a role whose privileges "member" inherits which has ADMIN option * on "role", ignoring super-userness. * * There might be more than one such role; prefer one which involves fewer - * hops. That is, if member has ADMIN OPTION, prefer that over all other + * hops. That is, if member has ADMIN option, prefer that over all other * options; if not, prefer a role from which member inherits more directly * over more indirect inheritance. */ @@ -5046,7 +5046,7 @@ select_best_admin(Oid member, Oid role) { Oid admin_role; - /* By policy, a role cannot have WITH ADMIN OPTION on itself. */ + /* By policy, a role cannot have ADMIN option on itself. */ if (member == role) return InvalidOid; diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index e8a2bfa6bd..27ef96941a 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -956,7 +956,7 @@ dumpRoleMembership(PGconn *conn) /* * Previous versions of PostgreSQL didn't used to track the grantor very * carefully in the backend, and the grantor could be any user even if - * they didn't have ADMIN OPTION on the role, or a user that no longer + * they didn't have ADMIN option on the role, or a user that no longer * existed. To avoid dump and restore failures, don't dump the grantor * when talking to an old server version. */ @@ -981,13 +981,13 @@ dumpRoleMembership(PGconn *conn) /* * We can't dump these GRANT commands in arbitary order, because a role - * that is named as a grantor must already have ADMIN OPTION on the + * that is named as a grantor must already have ADMIN option on the * role for which it is granting permissions, except for the boostrap * superuser, who can always be named as the grantor. * * We handle this by considering these grants role by role. For each role, * we initially consider the only allowable grantor to be the boostrap - * superuser. Every time we grant ADMIN OPTION on the role to some user, + * superuser. Every time we grant ADMIN option on the role to some user, * that user also becomes an allowable grantor. We make repeated passes * over the grants for the role, each time dumping those whose grantors * are allowable and which we haven't done yet. Eventually this should @@ -1072,7 +1072,7 @@ dumpRoleMembership(PGconn *conn) --remaining; /* - * If ADMIN OPTION is being granted, remember that grants + * If ADMIN option is being granted, remember that grants * listing this member as the grantor can now be dumped. */ if (*admin_option == 't') diff --git a/src/bin/scripts/t/040_createuser.pl b/src/bin/scripts/t/040_createuser.pl index 834d258bf8..a9de57f3b7 100644 --- a/src/bin/scripts/t/040_createuser.pl +++ b/src/bin/scripts/t/040_createuser.pl @@ -39,7 +39,7 @@ $node->issues_sql_like( 'regress user2', 'regress user #4' ], qr/statement: CREATE ROLE "regress user #4" NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN ADMIN regress_user1,"regress user2";/, - 'add a role as a member with admin option of the newly created role'); + 'add a role as a member with ADMIN option of the newly created role'); $node->issues_sql_like( [ 'createuser', '-m', diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h index e57ec4f810..f0e04baadd 100644 --- a/src/include/catalog/pg_auth_members.h +++ b/src/include/catalog/pg_auth_members.h @@ -33,7 +33,7 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_ Oid roleid BKI_LOOKUP(pg_authid); /* ID of a role */ Oid member BKI_LOOKUP(pg_authid); /* ID of a member of that role */ Oid grantor BKI_LOOKUP(pg_authid); /* who granted the membership */ - bool admin_option; /* granted with admin option? */ + bool admin_option; /* granted with ADMIN option? */ } FormData_pg_auth_members; /* ---------------- diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 0154a09262..56981c85c8 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -37,7 +37,7 @@ CREATE ROLE regress_priv_role; GRANT regress_priv_user1 TO regress_priv_user2 WITH ADMIN OPTION; GRANT regress_priv_user1 TO regress_priv_user3 WITH ADMIN OPTION GRANTED BY regress_priv_user2; GRANT regress_priv_user1 TO regress_priv_user2 WITH ADMIN OPTION GRANTED BY regress_priv_user3; -ERROR: admin option cannot be granted back to your own grantor +ERROR: ADMIN option cannot be granted back to your own grantor -- need CASCADE to revoke grant or admin option if dependent grants exist REVOKE ADMIN OPTION FOR regress_priv_user1 FROM regress_priv_user2; -- fail ERROR: dependent privileges exist @@ -159,7 +159,7 @@ CREATE FUNCTION leak(integer,integer) RETURNS boolean ALTER FUNCTION leak(integer,integer) OWNER TO regress_priv_user1; -- test owner privileges GRANT regress_priv_role TO regress_priv_user1 WITH ADMIN OPTION GRANTED BY regress_priv_role; -- error, doesn't have ADMIN OPTION -ERROR: grantor must have ADMIN OPTION on "regress_priv_role" +ERROR: grantor must have ADMIN option on "regress_priv_role" GRANT regress_priv_role TO regress_priv_user1 WITH ADMIN OPTION GRANTED BY CURRENT_ROLE; REVOKE ADMIN OPTION FOR regress_priv_role FROM regress_priv_user1 GRANTED BY foo; -- error ERROR: role "foo" does not exist @@ -1774,7 +1774,7 @@ REFRESH MATERIALIZED VIEW sro_mv; ERROR: cannot fire deferred trigger within security-restricted operation CONTEXT: SQL function "mv_action" statement 1 BEGIN; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT; -ERROR: must have admin option on role "regress_priv_group2" +ERROR: must have ADMIN option on role "regress_priv_group2" CONTEXT: SQL function "unwanted_grant" statement 1 SQL statement "SELECT unwanted_grant()" PL/pgSQL function sro_trojan() line 1 at PERFORM @@ -1804,10 +1804,10 @@ CREATE FUNCTION dogrant_ok() RETURNS void LANGUAGE sql SECURITY DEFINER AS GRANT regress_priv_group2 TO regress_priv_user5; -- ok: had ADMIN OPTION SET ROLE regress_priv_group2; GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE suspended privilege -ERROR: must have admin option on role "regress_priv_group2" +ERROR: must have ADMIN option on role "regress_priv_group2" SET SESSION AUTHORIZATION regress_priv_user1; GRANT regress_priv_group2 TO regress_priv_user5; -- fails: no ADMIN OPTION -ERROR: must have admin option on role "regress_priv_group2" +ERROR: must have ADMIN option on role "regress_priv_group2" SELECT dogrant_ok(); -- ok: SECURITY DEFINER conveys ADMIN NOTICE: role "regress_priv_user5" has already been granted membership in role "regress_priv_group2" by role "regress_priv_user4" dogrant_ok @@ -1817,10 +1817,10 @@ NOTICE: role "regress_priv_user5" has already been granted membership in role " SET ROLE regress_priv_group2; GRANT regress_priv_group2 TO regress_priv_user5; -- fails: SET ROLE did not help -ERROR: must have admin option on role "regress_priv_group2" +ERROR: must have ADMIN option on role "regress_priv_group2" SET SESSION AUTHORIZATION regress_priv_group2; GRANT regress_priv_group2 TO regress_priv_user5; -- fails: no self-admin -ERROR: must have admin option on role "regress_priv_group2" +ERROR: must have ADMIN option on role "regress_priv_group2" SET SESSION AUTHORIZATION regress_priv_user4; DROP FUNCTION dogrant_ok(); REVOKE regress_priv_group2 FROM regress_priv_user5;