@@ -123,6 +123,24 @@ static void RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue
123123 */
124124char * privileged_role_name = NULL ;
125125
126+ static bool
127+ is_privileged_role_arg_super (Oid roleid , bool nosuper )
128+ {
129+ Oid privileged_role_oid ;
130+
131+ if (privileged_role_name == NULL )
132+ return false;
133+
134+ privileged_role_oid = get_role_oid (privileged_role_name , true /* missing_ok */ );
135+
136+ if (privileged_role_oid == InvalidOid )
137+ return false;
138+
139+ if (nosuper )
140+ return has_privs_of_role_nosuper (roleid , privileged_role_oid );
141+ return has_privs_of_role (roleid , privileged_role_oid );
142+ }
143+
126144bool
127145is_privileged_role (void )
128146{
@@ -132,14 +150,12 @@ is_privileged_role(void)
132150bool
133151is_privileged_role_arg (Oid roleid )
134152{
135- Oid privileged_role_oid ;
136-
137- if (privileged_role_name == NULL )
138- return false;
139-
140- privileged_role_oid = get_role_oid (privileged_role_name , true /* missing_ok */ );
153+ return is_privileged_role_arg_super (roleid , false);
154+ }
141155
142- return privileged_role_oid != InvalidOid && has_privs_of_role (roleid , privileged_role_oid );
156+ bool is_privileged_role_nosuper (void )
157+ {
158+ return is_privileged_role_arg_super (GetUserId (), true);
143159}
144160
145161/*
@@ -5008,6 +5024,23 @@ has_privs_of_role(Oid member, Oid role)
50085024 role );
50095025}
50105026
5027+ /*
5028+ * Same as has_privs_of_role, but ignores checking superuser.
5029+ */
5030+ bool
5031+ has_privs_of_role_nosuper (Oid member , Oid role )
5032+ {
5033+ /* Fast path for simple case */
5034+ if (member == role )
5035+ return true;
5036+ /*
5037+ * Find all the roles that member has the privileges of, including
5038+ * multi-level recursion, then see if target role is any one of them.
5039+ */
5040+ return list_member_oid (roles_is_member_of (member , ROLERECURSE_PRIVS ,
5041+ InvalidOid , NULL ),
5042+ role );
5043+ }
50115044
50125045/*
50135046 * Is member a member of role (directly or indirectly)?
0 commit comments