nbtree: Make BTMaxItemSize into object-like macro.
authorPeter Geoghegan <pg@bowt.ie>
Tue, 11 Mar 2025 14:35:56 +0000 (10:35 -0400)
committerPeter Geoghegan <pg@bowt.ie>
Tue, 11 Mar 2025 14:35:56 +0000 (10:35 -0400)
Make nbtree's "1/3 of a page limit" BTMaxItemSize function-like macro
(which accepts a "page" argument) into an object-like macro that can be
used from code that doesn't have convenient access to an nbtree page.

Preparation for an upcoming patch that adds skip scan to nbtree.
Parallel index scans that use skip scan will serialize datums (not just
SAOP array subscripts) when scheduling primitive scans.  BTMaxItemSize
will be used by btestimateparallelscan to determine how much DSM to
request.

Author: Peter Geoghegan <pg@bowt.ie>
Discussion: https://postgr.es/m/CAH2-Wz=H_RG5weNGeUG_TkK87tRBnH9mGCQj6WpM4V4FNWKv2g@mail.gmail.com

contrib/amcheck/verify_nbtree.c
src/backend/access/nbtree/nbtdedup.c
src/backend/access/nbtree/nbtinsert.c
src/backend/access/nbtree/nbtsort.c
src/backend/access/nbtree/nbtutils.c
src/backend/access/nbtree/nbtxlog.c
src/include/access/nbtree.h

index aac8c74f546e200b7711bbc3c91b74d7dc87fc19..825b677c47c407f254b38f22cfd7eb37fc14bd4b 100644 (file)
@@ -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,
index cbe73675f86e5c9a1a756de8e7934d876ca57516..08884116aecbef674f552f48e870d62890e71746 100644 (file)
@@ -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");
index 31fe1c3adece0e52edea0f8e879448cd33bcd224..aa82cede30aa411052732ab1cf91efae5634e7fb 100644 (file)
@@ -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);
 
index 7aba852db908fc7cc6bb031323376517e031312f..fa336ba00963808e06e69ad26480d2c340bd2282 100644 (file)
@@ -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);
 
index 693e43c674b3069d506a9a928d9584a05e1f211d..efe58beaaadbf3477f5a880fa6527cd8059ce590 100644 (file)
@@ -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)),
index fadd06179558187d6c484ab791b5858f61c2c577..d31dd56732d2f3a7e32e1f63dc85c06c6855892a 100644 (file)
@@ -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;
index e4fdeca3402e6d94139acd2d08924c798d512063..0c43767f8c3b141a874279a4e7215ddae7aed27d 100644 (file)
@@ -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)