]> granicus.if.org Git - postgresql/commitdiff
Minimize calls of pg_class_aclcheck to minimum necessary
authorPeter Eisentraut <peter_e@gmx.net>
Thu, 23 Oct 2014 01:41:43 +0000 (21:41 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 23 Oct 2014 01:41:43 +0000 (21:41 -0400)
In a couple of code paths, pg_class_aclcheck is called in succession
with multiple different modes set.  This patch combines those modes to
have a single call of this function and reduce a bit process overhead
for permission checking.

Author: Michael Paquier <michael@otacoo.com>
Reviewed-by: Fabrízio de Royes Mello <fabriziomello@gmail.com>
src/backend/commands/sequence.c

index 3b89dd009bcbec95f7689f3e7af494fa8a69b881..6d5f65b8bd430e1939b95f7d83641c43de1c0178 100644 (file)
@@ -546,8 +546,8 @@ nextval_internal(Oid relid)
        /* open and AccessShareLock sequence */
        init_sequence(relid, &elm, &seqrel);
 
-       if (pg_class_aclcheck(elm->relid, GetUserId(), ACL_USAGE) != ACLCHECK_OK &&
-               pg_class_aclcheck(elm->relid, GetUserId(), ACL_UPDATE) != ACLCHECK_OK)
+       if (pg_class_aclcheck(elm->relid, GetUserId(),
+                                                 ACL_USAGE | ACL_UPDATE) != ACLCHECK_OK)
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("permission denied for sequence %s",
@@ -759,8 +759,8 @@ currval_oid(PG_FUNCTION_ARGS)
        /* open and AccessShareLock sequence */
        init_sequence(relid, &elm, &seqrel);
 
-       if (pg_class_aclcheck(elm->relid, GetUserId(), ACL_SELECT) != ACLCHECK_OK &&
-               pg_class_aclcheck(elm->relid, GetUserId(), ACL_USAGE) != ACLCHECK_OK)
+       if (pg_class_aclcheck(elm->relid, GetUserId(),
+                                                 ACL_SELECT | ACL_USAGE) != ACLCHECK_OK)
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("permission denied for sequence %s",
@@ -801,8 +801,8 @@ lastval(PG_FUNCTION_ARGS)
        /* nextval() must have already been called for this sequence */
        Assert(last_used_seq->last_valid);
 
-       if (pg_class_aclcheck(last_used_seq->relid, GetUserId(), ACL_SELECT) != ACLCHECK_OK &&
-               pg_class_aclcheck(last_used_seq->relid, GetUserId(), ACL_USAGE) != ACLCHECK_OK)
+       if (pg_class_aclcheck(last_used_seq->relid, GetUserId(),
+                                                 ACL_SELECT | ACL_USAGE) != ACLCHECK_OK)
                ereport(ERROR,
                                (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                                 errmsg("permission denied for sequence %s",