From 426d0158cafe5d138ce15c640134b2db8f37f6dc Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 7 Oct 2005 19:59:34 +0000
Subject: [PATCH] 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.

---
 src/backend/utils/adt/acl.c | 13 +++++++------
 1 file 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++)
-- 
GitLab