From f465c2609f5be4500145293d42a5704fa6e61dec Mon Sep 17 00:00:00 2001 From: ChangAo Chen Date: Sun, 14 Dec 2025 18:43:40 +0800 Subject: [PATCH v1 2/3] Use pg_lfind8_nonzero(). --- src/backend/access/common/heaptuple.c | 23 +++++------------------ src/backend/access/common/indextuple.c | 11 +++-------- src/backend/utils/adt/expandedrecord.c | 11 +++-------- 3 files changed, 11 insertions(+), 34 deletions(-) diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index b7820d692e2..77d2a6f9751 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -61,6 +61,7 @@ #include "access/sysattr.h" #include "access/tupdesc_details.h" #include "common/hashfn.h" +#include "port/pg_lfind.h" #include "utils/datum.h" #include "utils/expandeddatum.h" #include "utils/hsearch.h" @@ -1125,7 +1126,6 @@ heap_form_tuple(TupleDesc tupleDescriptor, int hoff; bool hasnull = false; int numberOfAttributes = tupleDescriptor->natts; - int i; if (numberOfAttributes > MaxTupleAttributeNumber) ereport(ERROR, @@ -1136,14 +1136,8 @@ heap_form_tuple(TupleDesc tupleDescriptor, /* * Check for nulls */ - for (i = 0; i < numberOfAttributes; i++) - { - if (isnull[i]) - { - hasnull = true; - break; - } - } + if (likely(numberOfAttributes > 0)) + hasnull = pg_lfind8_nonzero((uint8 *) isnull, numberOfAttributes); /* * Determine total space needed @@ -1462,7 +1456,6 @@ heap_form_minimal_tuple(TupleDesc tupleDescriptor, int hoff; bool hasnull = false; int numberOfAttributes = tupleDescriptor->natts; - int i; Assert(extra == MAXALIGN(extra)); @@ -1475,14 +1468,8 @@ heap_form_minimal_tuple(TupleDesc tupleDescriptor, /* * Check for nulls */ - for (i = 0; i < numberOfAttributes; i++) - { - if (isnull[i]) - { - hasnull = true; - break; - } - } + if (likely(numberOfAttributes > 0)) + hasnull = pg_lfind8_nonzero((uint8 *) isnull, numberOfAttributes); /* * Determine total space needed diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c index 3efa3889c6f..eac509fd580 100644 --- a/src/backend/access/common/indextuple.c +++ b/src/backend/access/common/indextuple.c @@ -21,6 +21,7 @@ #include "access/htup_details.h" #include "access/itup.h" #include "access/toast_internals.h" +#include "port/pg_lfind.h" /* * This enables de-toasting of index entries. Needed until VACUUM is @@ -139,14 +140,8 @@ index_form_tuple_context(TupleDesc tupleDescriptor, } #endif - for (i = 0; i < numberOfAttributes; i++) - { - if (isnull[i]) - { - hasnull = true; - break; - } - } + if (likely(numberOfAttributes > 0)) + hasnull = pg_lfind8_nonzero((uint8 *) isnull, numberOfAttributes); if (hasnull) infomask |= INDEX_NULL_MASK; diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c index 495d48fb581..13709e204a6 100644 --- a/src/backend/utils/adt/expandedrecord.c +++ b/src/backend/utils/adt/expandedrecord.c @@ -23,6 +23,7 @@ #include "access/htup_details.h" #include "catalog/heap.h" #include "catalog/pg_type.h" +#include "port/pg_lfind.h" #include "utils/builtins.h" #include "utils/datum.h" #include "utils/expandedrecord.h" @@ -727,14 +728,8 @@ ER_get_flat_size(ExpandedObjectHeader *eohptr) /* Test if we currently have any null values */ hasnull = false; - for (i = 0; i < erh->nfields; i++) - { - if (erh->dnulls[i]) - { - hasnull = true; - break; - } - } + if (likely(erh->nfields > 0)) + hasnull = pg_lfind8_nonzero((uint8 *) erh->dnulls, erh->nfields); /* Determine total space needed */ len = offsetof(HeapTupleHeaderData, t_bits); -- 2.52.0