From f465c2609f5be4500145293d42a5704fa6e61dec Mon Sep 17 00:00:00 2001
From: ChangAo Chen <cca5507@qq.com>
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

