diff options
Diffstat (limited to 'src/backend/catalog/aclchk.c')
-rw-r--r-- | src/backend/catalog/aclchk.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index 066b7fdb740..9c8711ed050 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -5158,7 +5158,10 @@ get_default_acl_internal(Oid roleId, Oid nsp_oid, char objtype) /* * Get default permissions for newly created object within given schema * - * Returns NULL if built-in system defaults should be used + * Returns NULL if built-in system defaults should be used. + * + * If the result is not NULL, caller must call recordDependencyOnNewAcl + * once the OID of the new object is known. */ Acl * get_user_default_acl(GrantObjectType objtype, Oid ownerId, Oid nsp_oid) @@ -5230,6 +5233,30 @@ get_user_default_acl(GrantObjectType objtype, Oid ownerId, Oid nsp_oid) } /* + * Record dependencies on roles mentioned in a new object's ACL. + */ +void +recordDependencyOnNewAcl(Oid classId, Oid objectId, int32 objsubId, + Oid ownerId, Acl *acl) +{ + int nmembers; + Oid *members; + + /* Nothing to do if ACL is defaulted */ + if (acl == NULL) + return; + + /* Extract roles mentioned in ACL */ + nmembers = aclmembers(acl, &members); + + /* Update the shared dependency ACL info */ + updateAclDependencies(classId, objectId, objsubId, + ownerId, + 0, NULL, + nmembers, members); +} + +/* * Record initial privileges for the top-level object passed in. * * For the object passed in, this will record its ACL (if any) and the ACLs of |