aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-10-07 19:59:34 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-10-07 19:59:34 +0000
commit426d0158cafe5d138ce15c640134b2db8f37f6dc (patch)
treec2f80364f893b56fb1227ce1dfdc6336037abcd6
parentb888ab82dab90409fd262655b05407403544bbfb (diff)
downloadpostgresql-426d0158cafe5d138ce15c640134b2db8f37f6dc.tar.gz
postgresql-426d0158cafe5d138ce15c640134b2db8f37f6dc.zip
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.
-rw-r--r--src/backend/utils/adt/acl.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index d51162e7eed..bc3a32a0d76 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -8,7 +8,7 @@
*
*
* 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,
result = 0;
/* 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;
- if (result == mask)
+ if ((how == ACLMASK_ALL) ? (result == mask) : (result != 0))
return result;
}
@@ -1024,7 +1025,7 @@ aclmask(const Acl *acl, Oid roleid, Oid ownerId,
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++)
{
@@ -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
* membership tests. In particular, it's worth testing whether
* 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;
for (i = 0; i < num; i++)