Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXKaT-0005Fn-Ne for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Mar 2022 10:21:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nXKaS-00069S-Jv for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Mar 2022 10:21:00 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXKaR-000699-Kv for pgsql-hackers@lists.postgresql.org; Thu, 24 Mar 2022 10:21:00 +0000 Received: from out2-smtp.messagingengine.com ([66.111.4.26]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXKaP-0002jX-GV for pgsql-hackers@lists.postgresql.org; Thu, 24 Mar 2022 10:20:59 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id 37C725C011D for ; Thu, 24 Mar 2022 06:20:54 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Thu, 24 Mar 2022 06:20:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:date:from:from:in-reply-to:message-id:mime-version :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=onW3Yh1xM5kl3V/+2 1e7GOVTM2sdmuG6tlJhGKyVp2c=; b=ZWTp1LKl/Qrqt50F3pokKoz6PsyVaIW4Z yRPF0c1aLJaHFvmDlPUeflMnChSuOubHaj0ziQCZ6e97escKyZO24IvPqJDKvaOR NjFUWw503p0qN96DuTFY+QEcsop+Zg31kwuBW+xSe+wY712Ue0wM5q8evAgQxrbm PHk42XH/AYan71rrRDW5o6/ZGqkAlO5Fth6K7rRNefUF3byUJvrIFc467/ZcOYxX LUHYYWS78SsFC3gEFwzXbE3P0OT2FVCFMv+JB/ythgf5zcVTNdlHIDMbkTT5uMgy xLNjlnSErVRMBcEkfbOKwHkX8F7wEK1lGlwXsp0F5HlzYZ2yQZpBQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrudegledgudduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepfffhvffukfggtggugfesmhekreertddtjeenucfhrhhomheptehlvhgrrhho ucfjvghrrhgvrhgruceorghlvhhhvghrrhgvsegrlhhvhhdrnhhoqdhiphdrohhrgheqne cuggftrfgrthhtvghrnhepiefhgfejtdelteekvdekhedtjefgtedvheffueeugedutdej iedtvdfgtdehleeunecuffhomhgrihhnpegtihhrrhhushdqtghirdgtohhmpdgvnhhtvg hrphhrihhsvggusgdrtghomhenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhep mhgrihhlfhhrohhmpegrlhhvhhgvrhhrvgesrghlvhhhrdhnohdqihhprdhorhhg X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Thu, 24 Mar 2022 06:20:53 -0400 (EDT) Received: by perhan.alvh.no-ip.org (Postfix, from userid 1000) id 653022A08E0; Thu, 24 Mar 2022 07:21:07 -0300 (-03) Date: Thu, 24 Mar 2022 11:21:07 +0100 From: Alvaro Herrera To: Pg Hackers Subject: turn fastgetattr and heap_getattr to inline functions Message-ID: <202203241021.uts52sczx3al@alvherre.pgsql> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="5zm5x4bc2wrbhwa7" Content-Disposition: inline Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --5zm5x4bc2wrbhwa7 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit This patch should silence some recent Coverity (false positive) complaints about assertions contained in these macros. Portability testing at: https://cirrus-ci.com/github/alvherre/postgres/macros-to-inlinefuncs Intend to push later today, unless something ugly happens. -- Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/ --5zm5x4bc2wrbhwa7 Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="0001-Change-fastgetattr-and-heap_getattr-to-inline-functi.patch" From 215eb05b368c202fce71efe242b58f0fe7025b38 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Thu, 24 Mar 2022 10:40:21 +0100 Subject: [PATCH] Change fastgetattr and heap_getattr to inline functions They were macros previously, but recent callsite additions made Coverity complain about one of the assertions being always true. This change could have been made a long time ago, but the Coverity complain broke the inertia. --- src/backend/access/heap/heapam.c | 46 --------- src/include/access/htup_details.h | 151 ++++++++++++++---------------- 2 files changed, 69 insertions(+), 128 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 3746336a09..74ad445e59 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -1131,52 +1131,6 @@ heapgettup_pagemode(HeapScanDesc scan, } -#if defined(DISABLE_COMPLEX_MACRO) -/* - * This is formatted so oddly so that the correspondence to the macro - * definition in access/htup_details.h is maintained. - */ -Datum -fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, - bool *isnull) -{ - return ( - (attnum) > 0 ? - ( - (*(isnull) = false), - HeapTupleNoNulls(tup) ? - ( - TupleDescAttr((tupleDesc), (attnum) - 1)->attcacheoff >= 0 ? - ( - fetchatt(TupleDescAttr((tupleDesc), (attnum) - 1), - (char *) (tup)->t_data + (tup)->t_data->t_hoff + - TupleDescAttr((tupleDesc), (attnum) - 1)->attcacheoff) - ) - : - nocachegetattr((tup), (attnum), (tupleDesc)) - ) - : - ( - att_isnull((attnum) - 1, (tup)->t_data->t_bits) ? - ( - (*(isnull) = true), - (Datum) NULL - ) - : - ( - nocachegetattr((tup), (attnum), (tupleDesc)) - ) - ) - ) - : - ( - (Datum) NULL - ) - ); -} -#endif /* defined(DISABLE_COMPLEX_MACRO) */ - - /* ---------------------------------------------------------------- * heap access method interface * ---------------------------------------------------------------- diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h index b2d52ed16c..de0b91e1fa 100644 --- a/src/include/access/htup_details.h +++ b/src/include/access/htup_details.h @@ -690,88 +690,6 @@ struct MinimalTupleData #define HeapTupleClearHeapOnly(tuple) \ HeapTupleHeaderClearHeapOnly((tuple)->t_data) - -/* ---------------- - * fastgetattr - * - * Fetch a user attribute's value as a Datum (might be either a - * value, or a pointer into the data area of the tuple). - * - * This must not be used when a system attribute might be requested. - * Furthermore, the passed attnum MUST be valid. Use heap_getattr() - * instead, if in doubt. - * - * This gets called many times, so we macro the cacheable and NULL - * lookups, and call nocachegetattr() for the rest. - * ---------------- - */ - -#if !defined(DISABLE_COMPLEX_MACRO) - -#define fastgetattr(tup, attnum, tupleDesc, isnull) \ -( \ - AssertMacro((attnum) > 0), \ - (*(isnull) = false), \ - HeapTupleNoNulls(tup) ? \ - ( \ - TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff >= 0 ? \ - ( \ - fetchatt(TupleDescAttr((tupleDesc), (attnum)-1), \ - (char *) (tup)->t_data + (tup)->t_data->t_hoff + \ - TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff)\ - ) \ - : \ - nocachegetattr((tup), (attnum), (tupleDesc)) \ - ) \ - : \ - ( \ - att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \ - ( \ - (*(isnull) = true), \ - (Datum)NULL \ - ) \ - : \ - ( \ - nocachegetattr((tup), (attnum), (tupleDesc)) \ - ) \ - ) \ -) -#else /* defined(DISABLE_COMPLEX_MACRO) */ - -extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, - bool *isnull); -#endif /* defined(DISABLE_COMPLEX_MACRO) */ - - -/* ---------------- - * heap_getattr - * - * Extract an attribute of a heap tuple and return it as a Datum. - * This works for either system or user attributes. The given attnum - * is properly range-checked. - * - * If the field in question has a NULL value, we return a zero Datum - * and set *isnull == true. Otherwise, we set *isnull == false. - * - * is the pointer to the heap tuple. is the attribute - * number of the column (field) caller wants. is a - * pointer to the structure describing the row and all its fields. - * ---------------- - */ -#define heap_getattr(tup, attnum, tupleDesc, isnull) \ - ( \ - ((attnum) > 0) ? \ - ( \ - ((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \ - getmissingattr((tupleDesc), (attnum), (isnull)) \ - : \ - fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \ - ) \ - : \ - heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \ - ) - - /* prototypes for functions in common/heaptuple.c */ extern Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull); @@ -815,4 +733,73 @@ extern size_t varsize_any(void *p); extern HeapTuple heap_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc); extern MinimalTuple minimal_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc); +/* + * fastgetattr + * Fetch a user attribute's value as a Datum (might be either a + * value, or a pointer into the data area of the tuple). + * + * This must not be used when a system attribute might be requested. + * Furthermore, the passed attnum MUST be valid. Use heap_getattr() + * instead, if in doubt. + * + * This gets called many times, so we macro the cacheable and NULL + * lookups, and call nocachegetattr() for the rest. + */ +static inline Datum +fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) +{ + AssertMacro(attnum > 0); + + *isnull = false; + if (HeapTupleNoNulls(tup)) + { + Form_pg_attribute att; + + att = TupleDescAttr(tupleDesc, attnum - 1); + if (att->attcacheoff >= 0) + return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff + + att->attcacheoff); + else + return nocachegetattr(tup, attnum, tupleDesc); + } + else + { + if (att_isnull(attnum - 1, tup->t_data->t_bits)) + { + *isnull = true; + return (Datum) NULL; + } + else + return nocachegetattr(tup, attnum, tupleDesc); + } +} + +/* + * heap_getattr + * Extract an attribute of a heap tuple and return it as a Datum. + * This works for either system or user attributes. The given attnum + * is properly range-checked. + * + * If the field in question has a NULL value, we return a zero Datum + * and set *isnull == true. Otherwise, we set *isnull == false. + * + * is the pointer to the heap tuple. is the attribute + * number of the column (field) caller wants. is a + * pointer to the structure describing the row and all its fields. + * + */ +static inline Datum +heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) +{ + if (attnum > 0) + { + if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data)) + return getmissingattr(tupleDesc, attnum, isnull); + else + return fastgetattr(tup, attnum, tupleDesc, isnull); + } + else + return heap_getsysattr(tup, attnum, tupleDesc, isnull); +} + #endif /* HTUP_DETAILS_H */ -- 2.30.2 --5zm5x4bc2wrbhwa7--