v27-0002-Make-BTMaxItemSize-macro-not-require-a-Page-arg.patch
application/x-patch
Filename: v27-0002-Make-BTMaxItemSize-macro-not-require-a-Page-arg.patch
Type: application/x-patch
Part: 6
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v27-0002
Subject: Make BTMaxItemSize macro not require a Page arg.
| File | + | − |
|---|---|---|
| contrib/amcheck/verify_nbtree.c | 1 | 2 |
| src/backend/access/nbtree/nbtdedup.c | 3 | 3 |
| src/backend/access/nbtree/nbtinsert.c | 1 | 1 |
| src/backend/access/nbtree/nbtsort.c | 2 | 2 |
| src/backend/access/nbtree/nbtutils.c | 3 | 4 |
| src/backend/access/nbtree/nbtxlog.c | 1 | 1 |
| src/include/access/nbtree.h | 4 | 4 |
From 5b7cee86b7b996a6dbc5b5c3901960963f037a0d Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Mon, 3 Mar 2025 10:56:18 -0500
Subject: [PATCH v27 2/7] Make BTMaxItemSize macro not require a Page arg.
---
src/include/access/nbtree.h | 8 ++++----
src/backend/access/nbtree/nbtdedup.c | 6 +++---
src/backend/access/nbtree/nbtinsert.c | 2 +-
src/backend/access/nbtree/nbtsort.c | 4 ++--
src/backend/access/nbtree/nbtutils.c | 7 +++----
src/backend/access/nbtree/nbtxlog.c | 2 +-
contrib/amcheck/verify_nbtree.c | 3 +--
7 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h
index e4fdeca34..0c43767f8 100644
--- a/src/include/access/nbtree.h
+++ b/src/include/access/nbtree.h
@@ -161,13 +161,13 @@ typedef struct BTMetaPageData
* a heap index tuple to make space for a tiebreaker heap TID
* attribute, which we account for here.
*/
-#define BTMaxItemSize(page) \
- (MAXALIGN_DOWN((PageGetPageSize(page) - \
+#define BTMaxItemSize \
+ (MAXALIGN_DOWN((BLCKSZ - \
MAXALIGN(SizeOfPageHeaderData + 3*sizeof(ItemIdData)) - \
MAXALIGN(sizeof(BTPageOpaqueData))) / 3) - \
MAXALIGN(sizeof(ItemPointerData)))
-#define BTMaxItemSizeNoHeapTid(page) \
- MAXALIGN_DOWN((PageGetPageSize(page) - \
+#define BTMaxItemSizeNoHeapTid \
+ MAXALIGN_DOWN((BLCKSZ - \
MAXALIGN(SizeOfPageHeaderData + 3*sizeof(ItemIdData)) - \
MAXALIGN(sizeof(BTPageOpaqueData))) / 3)
diff --git a/src/backend/access/nbtree/nbtdedup.c b/src/backend/access/nbtree/nbtdedup.c
index cbe73675f..08884116a 100644
--- a/src/backend/access/nbtree/nbtdedup.c
+++ b/src/backend/access/nbtree/nbtdedup.c
@@ -84,7 +84,7 @@ _bt_dedup_pass(Relation rel, Buffer buf, IndexTuple newitem, Size newitemsz,
state = (BTDedupState) palloc(sizeof(BTDedupStateData));
state->deduplicate = true;
state->nmaxitems = 0;
- state->maxpostingsize = Min(BTMaxItemSize(page) / 2, INDEX_SIZE_MASK);
+ state->maxpostingsize = Min(BTMaxItemSize / 2, INDEX_SIZE_MASK);
/* Metadata about base tuple of current pending posting list */
state->base = NULL;
state->baseoff = InvalidOffsetNumber;
@@ -568,7 +568,7 @@ _bt_dedup_finish_pending(Page newpage, BTDedupState state)
/* Use original, unchanged base tuple */
tuplesz = IndexTupleSize(state->base);
Assert(tuplesz == MAXALIGN(IndexTupleSize(state->base)));
- Assert(tuplesz <= BTMaxItemSize(newpage));
+ Assert(tuplesz <= BTMaxItemSize);
if (PageAddItem(newpage, (Item) state->base, tuplesz, tupoff,
false, false) == InvalidOffsetNumber)
elog(ERROR, "deduplication failed to add tuple to page");
@@ -588,7 +588,7 @@ _bt_dedup_finish_pending(Page newpage, BTDedupState state)
state->intervals[state->nintervals].nitems = state->nitems;
Assert(tuplesz == MAXALIGN(IndexTupleSize(final)));
- Assert(tuplesz <= BTMaxItemSize(newpage));
+ Assert(tuplesz <= BTMaxItemSize);
if (PageAddItem(newpage, (Item) final, tuplesz, tupoff, false,
false) == InvalidOffsetNumber)
elog(ERROR, "deduplication failed to add tuple to page");
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index 31fe1c3ad..aa82cede3 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -827,7 +827,7 @@ _bt_findinsertloc(Relation rel,
opaque = BTPageGetOpaque(page);
/* Check 1/3 of a page restriction */
- if (unlikely(insertstate->itemsz > BTMaxItemSize(page)))
+ if (unlikely(insertstate->itemsz > BTMaxItemSize))
_bt_check_third_page(rel, heapRel, itup_key->heapkeyspace, page,
insertstate->itup);
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index 7aba852db..fa336ba00 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -829,7 +829,7 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup,
* make use of the reserved space. This should never fail on internal
* pages.
*/
- if (unlikely(itupsz > BTMaxItemSize(npage)))
+ if (unlikely(itupsz > BTMaxItemSize))
_bt_check_third_page(wstate->index, wstate->heap, isleaf, npage,
itup);
@@ -1305,7 +1305,7 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2)
*/
dstate->maxpostingsize = MAXALIGN_DOWN((BLCKSZ * 10 / 100)) -
sizeof(ItemIdData);
- Assert(dstate->maxpostingsize <= BTMaxItemSize((Page) state->btps_buf) &&
+ Assert(dstate->maxpostingsize <= BTMaxItemSize &&
dstate->maxpostingsize <= INDEX_SIZE_MASK);
dstate->htids = palloc(dstate->maxpostingsize);
diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c
index 693e43c67..efe58beaa 100644
--- a/src/backend/access/nbtree/nbtutils.c
+++ b/src/backend/access/nbtree/nbtutils.c
@@ -3245,7 +3245,7 @@ _bt_check_third_page(Relation rel, Relation heap, bool needheaptidspace,
itemsz = MAXALIGN(IndexTupleSize(newtup));
/* Double check item size against limit */
- if (itemsz <= BTMaxItemSize(page))
+ if (itemsz <= BTMaxItemSize)
return;
/*
@@ -3253,7 +3253,7 @@ _bt_check_third_page(Relation rel, Relation heap, bool needheaptidspace,
* index uses version 2 or version 3, or that page is an internal page, in
* which case a slightly higher limit applies.
*/
- if (!needheaptidspace && itemsz <= BTMaxItemSizeNoHeapTid(page))
+ if (!needheaptidspace && itemsz <= BTMaxItemSizeNoHeapTid)
return;
/*
@@ -3270,8 +3270,7 @@ _bt_check_third_page(Relation rel, Relation heap, bool needheaptidspace,
errmsg("index row size %zu exceeds btree version %u maximum %zu for index \"%s\"",
itemsz,
needheaptidspace ? BTREE_VERSION : BTREE_NOVAC_VERSION,
- needheaptidspace ? BTMaxItemSize(page) :
- BTMaxItemSizeNoHeapTid(page),
+ needheaptidspace ? BTMaxItemSize : BTMaxItemSizeNoHeapTid,
RelationGetRelationName(rel)),
errdetail("Index row references tuple (%u,%u) in relation \"%s\".",
ItemPointerGetBlockNumber(BTreeTupleGetHeapTID(newtup)),
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c
index fadd06179..d31dd5673 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -483,7 +483,7 @@ btree_xlog_dedup(XLogReaderState *record)
state->deduplicate = true; /* unused */
state->nmaxitems = 0; /* unused */
/* Conservatively use larger maxpostingsize than primary */
- state->maxpostingsize = BTMaxItemSize(page);
+ state->maxpostingsize = BTMaxItemSize;
state->base = NULL;
state->baseoff = InvalidOffsetNumber;
state->basetupsize = 0;
diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index aac8c74f5..825b677c4 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -1597,8 +1597,7 @@ bt_target_page_check(BtreeCheckState *state)
*/
lowersizelimit = skey->heapkeyspace &&
(P_ISLEAF(topaque) || BTreeTupleGetHeapTID(itup) == NULL);
- if (tupsize > (lowersizelimit ? BTMaxItemSize(state->target) :
- BTMaxItemSizeNoHeapTid(state->target)))
+ if (tupsize > (lowersizelimit ? BTMaxItemSize : BTMaxItemSizeNoHeapTid))
{
ItemPointer tid = BTreeTupleGetPointsToTID(itup);
char *itid,
--
2.47.2