v1-0002-Use-pg_lfind8_nonzero.patch
application/octet-stream
Filename: v1-0002-Use-pg_lfind8_nonzero.patch
Type: application/octet-stream
Part: 1
Message:
[PATCH] Add pg_lfind8_nonzero()
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