Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tsQfn-001oqA-6M for pgsql-hackers@arkaria.postgresql.org; Wed, 12 Mar 2025 18:19:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tsQfl-00AZeA-To for pgsql-hackers@arkaria.postgresql.org; Wed, 12 Mar 2025 18:19:17 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tsQfl-00AZe2-I4 for pgsql-hackers@lists.postgresql.org; Wed, 12 Mar 2025 18:19:17 +0000 Received: from mail-ot1-x334.google.com ([2607:f8b0:4864:20::334]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tsQfh-002Ul4-1V for pgsql-hackers@postgresql.org; Wed, 12 Mar 2025 18:19:16 +0000 Received: by mail-ot1-x334.google.com with SMTP id 46e09a7af769-7273b0d4409so39788a34.1 for ; Wed, 12 Mar 2025 11:19:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741803552; x=1742408352; darn=postgresql.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=c48aginPjQRibsg/di9X6i8vL1DFZfleYngphhSN1Uk=; b=SBRWOZ2QqytTHVMpY+sjXJufZy1lJFtsPGva3yIM7YeidQQ0QnIUMcniWQgOYShHOa M2SuXPqY6tYmDh8H97t7/VA21Ry/ILwJ2DfJ2mT4RwBYya+DnyEpGWeUe6jcbN02Iuos GxC0GRipG2b+DAGwixmcFdjlmq9CDsVRXoOnxbOBF2/0chH3j7j1xlkzwFOiQd5GgyZR t7gp29UZcNuZ5mKx5gmPdjodaerE4pRlxVLeJQh8k5s4JO/LvSXjBzUMwumUDzTpI+iU pbMSQd9y/O40IdShPt9oMm3t5l9wUF7nPNqmtLK8kFrOKdt3Oqlp7HYBExLGubl69V5U O+aA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741803552; x=1742408352; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=c48aginPjQRibsg/di9X6i8vL1DFZfleYngphhSN1Uk=; b=PV7e4Oo6XG6808UG8/P2q+sncNHB4QINEGRKFHFuMyKaBcwi6ZZoml6lWvkb4vliJD bG6Q6d/vnFK72HgazPUhatONlmdMqd/5x9vkOb8caPo39Vu99U4u0IZiRsJ2g7s8nZDb 0ezM+0rMpOEluixANtiGxuuTleTcyzsKe0I52jfZFGoAisbqn3IvsFAm3iiPP/z4IZdB /Rbv/fbJkAfbcaypIRl4KKAKDwov20Ri5jkPNVPajjxAkLm+WJCZtvCtNMDiUqq9ce3w uTiexvLfBXXQ1RweY+u6vIAOA0FEV4tBj5w/o9u/d4MzQ3WrfnW5vCym4LtCJw/4Geqs 38Ww== X-Gm-Message-State: AOJu0YzXUdszfTzl0+vsKjEBYcKcb93WGe/G8+wui2tRyOSgtwyzLtfN DoBLtjwFXYwrPc+8J4RuGFUpiCc+R0JWB/HsJq0+fNIVFpIezVt7 X-Gm-Gg: ASbGncuY7o7SEzhZo1LLwHorVp96Pf/mB66QTip/l9St/S0TURn0QFZFnmRj+TygAa3 CK8wwDC4fbn5jbRXfTe8TOA4sP76TsTSnzglSdizZLfNeAivBC1V2kyQV0jBhvFg+CSR+Qnz2yV aWUXyZ09QmiqAwKeL5cg1XFFxZ5xyToE5O3yK9dArikwdPYIIx2WxMOW8NWdYgpvlwVW+e7H60R hOtnKH3NYE+82kSSthDQqZf+NBnHDgqbFMroPGIYVQIpJtjJT1gmzjd0XQqFAFQPxzp5op2EaWX X/ddPMkyqEcliCB03Nl/K9pQ+JTZttlr2UvU1VUUyTt8Bt1b2sC++buPhfrb7Ehv6R6RGe6ImLB XfNPpIhL1oBWxB8BUm2rS/j4DT+ywMixXYMM= X-Google-Smtp-Source: AGHT+IFIWGPQw374R6fqfgSYEYvYjcSl337zCuir1at7cLrBZpkSggtsFn80eqHagPS2iigno0qSzg== X-Received: by 2002:a05:6830:2b29:b0:72b:9965:d9a7 with SMTP id 46e09a7af769-72b9965e696mr5291672a34.18.1741803552225; Wed, 12 Mar 2025 11:19:12 -0700 (PDT) Received: from nathan (162-195-168-172.lightspeed.stlsmo.sbcglobal.net. [162.195.168.172]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72b7f1d2a15sm1703120a34.1.2025.03.12.11.19.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Mar 2025 11:19:11 -0700 (PDT) Date: Wed, 12 Mar 2025 13:19:09 -0500 From: Nathan Bossart To: =?iso-8859-1?Q?=C1lvaro?= Herrera Cc: pgsql-hackers@postgresql.org Subject: Re: remove open-coded popcount in acl.c Message-ID: References: <202503121623.i4enp6airsfl@alvherre.pgsql> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="1vQ1UQFsHousOb+M" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <202503121623.i4enp6airsfl@alvherre.pgsql> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --1vQ1UQFsHousOb+M Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Wed, Mar 12, 2025 at 05:23:25PM +0100, Álvaro Herrera wrote: > Strange: this code is not covered by any tests. > > https://coverage.postgresql.org/src/backend/utils/adt/acl.c.gcov.html#5533 > https://coverage.postgresql.org/src/backend/utils/adt/acl.c.gcov.html#5438 Huh. Well, it's easy enough to add some basic tests for the grantor selection machinery. Here's a first try. -- nathan --1vQ1UQFsHousOb+M Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="v2-0001-Remove-open-coded-popcount-in-acl.c.patch" From d3cf9ca237f647ebcca20c55c8302f00f716c459 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 12 Mar 2025 10:45:12 -0500 Subject: [PATCH v2 1/1] Remove open-coded popcount in acl.c. --- src/backend/utils/adt/acl.c | 20 +----------------- src/test/regress/expected/privileges.out | 27 ++++++++++++++++++++++++ src/test/regress/sql/privileges.sql | 22 +++++++++++++++++++ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 6a76550a5e2..ba14713fef2 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -5432,24 +5432,6 @@ select_best_admin(Oid member, Oid role) return admin_role; } - -/* does what it says ... */ -static int -count_one_bits(AclMode mask) -{ - int nbits = 0; - - /* this code relies on AclMode being an unsigned type */ - while (mask) - { - if (mask & 1) - nbits++; - mask >>= 1; - } - return nbits; -} - - /* * Select the effective grantor ID for a GRANT or REVOKE operation. * @@ -5532,7 +5514,7 @@ select_best_grantor(Oid roleId, AclMode privileges, */ if (otherprivs != ACL_NO_RIGHTS) { - int nnewrights = count_one_bits(otherprivs); + int nnewrights = pg_popcount64(otherprivs); if (nnewrights > nrights) { diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index a76256405fe..954f549555e 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -3293,3 +3293,30 @@ DROP SCHEMA reindex_test; DROP ROLE regress_no_maintain; DROP ROLE regress_maintain; DROP ROLE regress_maintain_all; +-- grantor selection +CREATE ROLE regress_grantor1; +CREATE ROLE regress_grantor2 ROLE regress_grantor1; +CREATE ROLE regress_grantor3; +CREATE TABLE grantor_test1 (); +CREATE TABLE grantor_test2 (); +CREATE TABLE grantor_test3 (); +GRANT SELECT ON grantor_test2 TO regress_grantor1 WITH GRANT OPTION; +GRANT SELECT, UPDATE ON grantor_test3 TO regress_grantor2 WITH GRANT OPTION; +SET ROLE regress_grantor1; +GRANT SELECT, UPDATE ON grantor_test1 TO regress_grantor3; +ERROR: permission denied for table grantor_test1 +GRANT SELECT, UPDATE ON grantor_test2 TO regress_grantor3; +WARNING: not all privileges were granted for "grantor_test2" +GRANT SELECT, UPDATE ON grantor_test3 TO regress_grantor3; +RESET ROLE; +SELECT * FROM information_schema.table_privileges t + WHERE grantor LIKE 'regress_grantor%' ORDER BY ROW(t.*); + grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy +------------------+------------------+---------------+--------------+---------------+----------------+--------------+---------------- + regress_grantor1 | regress_grantor3 | regression | public | grantor_test2 | SELECT | NO | YES + regress_grantor2 | regress_grantor3 | regression | public | grantor_test3 | SELECT | NO | YES + regress_grantor2 | regress_grantor3 | regression | public | grantor_test3 | UPDATE | NO | NO +(3 rows) + +DROP TABLE grantor_test1, grantor_test2, grantor_test3; +DROP ROLE regress_grantor1, regress_grantor2, regress_grantor3; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index d195aaf1377..b81694c24f2 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -2042,3 +2042,25 @@ DROP SCHEMA reindex_test; DROP ROLE regress_no_maintain; DROP ROLE regress_maintain; DROP ROLE regress_maintain_all; + +-- grantor selection +CREATE ROLE regress_grantor1; +CREATE ROLE regress_grantor2 ROLE regress_grantor1; +CREATE ROLE regress_grantor3; +CREATE TABLE grantor_test1 (); +CREATE TABLE grantor_test2 (); +CREATE TABLE grantor_test3 (); +GRANT SELECT ON grantor_test2 TO regress_grantor1 WITH GRANT OPTION; +GRANT SELECT, UPDATE ON grantor_test3 TO regress_grantor2 WITH GRANT OPTION; + +SET ROLE regress_grantor1; +GRANT SELECT, UPDATE ON grantor_test1 TO regress_grantor3; +GRANT SELECT, UPDATE ON grantor_test2 TO regress_grantor3; +GRANT SELECT, UPDATE ON grantor_test3 TO regress_grantor3; +RESET ROLE; + +SELECT * FROM information_schema.table_privileges t + WHERE grantor LIKE 'regress_grantor%' ORDER BY ROW(t.*); + +DROP TABLE grantor_test1, grantor_test2, grantor_test3; +DROP ROLE regress_grantor1, regress_grantor2, regress_grantor3; -- 2.39.5 (Apple Git-154) --1vQ1UQFsHousOb+M--