Commit 426d0158 authored by Tom Lane's avatar Tom Lane

Marginal performance improvement in aclmask(): don't bother with

testing ownership if the caller isn't interested in any GOPTION bits
(which is the common case).  It did not matter in 8.0 where the ownership
test was just a trivial equality test, but it matters now.
parent b888ab82
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.123 2005/07/28 22:27:02 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.124 2005/10/07 19:59:34 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1013,10 +1013,11 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId, ...@@ -1013,10 +1013,11 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId,
result = 0; result = 0;
/* Owner always implicitly has all grant options */ /* Owner always implicitly has all grant options */
if (has_privs_of_role(roleid, ownerId)) if ((mask & ACLITEM_ALL_GOPTION_BITS) &&
has_privs_of_role(roleid, ownerId))
{ {
result = mask & ACLITEM_ALL_GOPTION_BITS; result = mask & ACLITEM_ALL_GOPTION_BITS;
if (result == mask) if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
return result; return result;
} }
...@@ -1024,7 +1025,7 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId, ...@@ -1024,7 +1025,7 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId,
aidat = ACL_DAT(acl); aidat = ACL_DAT(acl);
/* /*
* Check privileges granted directly to user or to public * Check privileges granted directly to roleid or to public
*/ */
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
{ {
...@@ -1040,11 +1041,11 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId, ...@@ -1040,11 +1041,11 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId,
} }
/* /*
* Check privileges granted indirectly via roles. * Check privileges granted indirectly via role memberships.
* We do this in a separate pass to minimize expensive indirect * We do this in a separate pass to minimize expensive indirect
* membership tests. In particular, it's worth testing whether * membership tests. In particular, it's worth testing whether
* a given ACL entry grants any privileges still of interest before * a given ACL entry grants any privileges still of interest before
* we perform the is_member test. * we perform the has_privs_of_role test.
*/ */
remaining = mask & ~result; remaining = mask & ~result;
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment