Continuing the theme of cleaning up old and weird stuff in the code, I propose to remove the Item type. It's defined as

    typedef Pointer Item;

(note that Pointer is char *), and its almost only use is as part of PageAddItem*():

extern OffsetNumber PageAddItemExtended(Page page, Item item, Size size,
                                  OffsetNumber offsetNumber, int flags);

The actual thing passed to PageAddItem*() is of some AM-specific type, and so that forces casts in all calls, like

  offnum = PageAddItem(page, (Item) tuple, tuplen, offnum, true, false);

So this type doesn't promote any type safety, but in fact sort of forces the opposite.

And then we have the usual problem that this is a type that hides pointerness, and so we can't add any qualifiers, which leads to some unconstify nonsense.

(Also, Item is unrelated to ItemPointer, which seems confusing.)

Initially I considered creating some underlying type to point to like ItemData, but that didn't seem useful. Ultimately, PageAddItem*() is just a fancy memcpy(), and using void * is an idiomatic way to refer to a generic chunk of memory. So I'm proposing to remove the Item type, replace it with void * in function prototypes, and remove all the casts.

Extension authors can make their code backward compatible by replacing

    PageAddItem(page, (Item) tuple, ...)

with

    PageAddItem(page, (void *) tuple, ...)
From c681a747c79e9607b041b6d29f44735de49e07aa Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 Sep 2025 10:49:28 +0200
Subject: [PATCH 1/2] Remove Item type

This type is just char * underneath, it provides no real value, no
type safety, and just makes the code one level more mysterious.  It is
more idiomatic to refer to blobs of memory by a combination of void *
and size_t, so change it to that.

Also, since this type hides the pointerness, we can't apply qualifiers
to what is pointed to, which requires some unconstify nonsense.  This
change allows fixing that.

Extension code that uses the Item type can change its code to use
void * to be backward compatible.
---
 src/backend/access/brin/brin_pageops.c  |  8 ++---
 src/backend/access/brin/brin_xlog.c     |  4 +--
 src/backend/access/gin/ginentrypage.c   |  8 ++---
 src/backend/access/gin/ginfast.c        |  4 +--
 src/backend/access/gin/ginvacuum.c      |  2 +-
 src/backend/access/gin/ginxlog.c        |  7 ++--
 src/backend/access/gist/gist.c          |  5 ++-
 src/backend/access/gist/gistbuild.c     |  2 +-
 src/backend/access/gist/gistutil.c      |  2 +-
 src/backend/access/gist/gistxlog.c      |  4 +--
 src/backend/access/hash/hash_xlog.c     |  7 ++--
 src/backend/access/hash/hashinsert.c    | 12 +++----
 src/backend/access/heap/heapam_xlog.c   |  7 ++--
 src/backend/access/heap/hio.c           |  4 +--
 src/backend/access/heap/rewriteheap.c   |  3 +-
 src/backend/access/nbtree/nbtdedup.c    |  9 ++---
 src/backend/access/nbtree/nbtinsert.c   | 18 ++++------
 src/backend/access/nbtree/nbtpage.c     |  9 ++---
 src/backend/access/nbtree/nbtsort.c     |  6 ++--
 src/backend/access/nbtree/nbtxlog.c     | 48 +++++++++----------------
 src/backend/access/spgist/spgdoinsert.c | 36 +++++++++----------
 src/backend/access/spgist/spgutils.c    |  2 +-
 src/backend/access/spgist/spgxlog.c     | 32 +++++++----------
 src/backend/commands/sequence.c         |  6 ++--
 src/backend/storage/page/bufpage.c      |  4 +--
 src/include/access/spgist_private.h     |  2 +-
 src/include/storage/bufpage.h           |  9 +++--
 src/include/storage/item.h              | 19 ----------
 28 files changed, 102 insertions(+), 177 deletions(-)
 delete mode 100644 src/include/storage/item.h

diff --git a/src/backend/access/brin/brin_pageops.c 
b/src/backend/access/brin/brin_pageops.c
index 6d8dd1512d6..b19c843132c 100644
--- a/src/backend/access/brin/brin_pageops.c
+++ b/src/backend/access/brin/brin_pageops.c
@@ -176,7 +176,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
                brin_can_do_samepage_update(oldbuf, origsz, newsz))
        {
                START_CRIT_SECTION();
-               if (!PageIndexTupleOverwrite(oldpage, oldoff, (Item) 
unconstify(BrinTuple *, newtup), newsz))
+               if (!PageIndexTupleOverwrite(oldpage, oldoff, newtup, newsz))
                        elog(ERROR, "failed to replace BRIN tuple");
                MarkBufferDirty(oldbuf);
 
@@ -250,8 +250,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
                        brin_page_init(newpage, BRIN_PAGETYPE_REGULAR);
 
                PageIndexTupleDeleteNoCompact(oldpage, oldoff);
-               newoff = PageAddItem(newpage, (Item) unconstify(BrinTuple *, 
newtup), newsz,
-                                                        InvalidOffsetNumber, 
false, false);
+               newoff = PageAddItem(newpage, newtup, newsz, 
InvalidOffsetNumber, false, false);
                if (newoff == InvalidOffsetNumber)
                        elog(ERROR, "failed to add BRIN tuple to new page");
                MarkBufferDirty(oldbuf);
@@ -408,8 +407,7 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
        START_CRIT_SECTION();
        if (extended)
                brin_page_init(page, BRIN_PAGETYPE_REGULAR);
-       off = PageAddItem(page, (Item) tup, itemsz, InvalidOffsetNumber,
-                                         false, false);
+       off = PageAddItem(page, tup, itemsz, InvalidOffsetNumber, false, false);
        if (off == InvalidOffsetNumber)
                elog(ERROR, "failed to add BRIN tuple to new page");
        MarkBufferDirty(*buffer);
diff --git a/src/backend/access/brin/brin_xlog.c 
b/src/backend/access/brin/brin_xlog.c
index 55348140fad..c8b4decb3ec 100644
--- a/src/backend/access/brin/brin_xlog.c
+++ b/src/backend/access/brin/brin_xlog.c
@@ -87,7 +87,7 @@ brin_xlog_insert_update(XLogReaderState *record,
                if (PageGetMaxOffsetNumber(page) + 1 < offnum)
                        elog(PANIC, "brin_xlog_insert_update: invalid max 
offset number");
 
-               offnum = PageAddItem(page, (Item) tuple, tuplen, offnum, true, 
false);
+               offnum = PageAddItem(page, tuple, tuplen, offnum, true, false);
                if (offnum == InvalidOffsetNumber)
                        elog(PANIC, "brin_xlog_insert_update: failed to add 
tuple");
 
@@ -189,7 +189,7 @@ brin_xlog_samepage_update(XLogReaderState *record)
 
                offnum = xlrec->offnum;
 
-               if (!PageIndexTupleOverwrite(page, offnum, (Item) brintuple, 
tuplen))
+               if (!PageIndexTupleOverwrite(page, offnum, brintuple, tuplen))
                        elog(PANIC, "brin_xlog_samepage_update: failed to 
replace tuple");
 
                PageSetLSN(page, lsn);
diff --git a/src/backend/access/gin/ginentrypage.c 
b/src/backend/access/gin/ginentrypage.c
index ba6bbd562df..c0592367700 100644
--- a/src/backend/access/gin/ginentrypage.c
+++ b/src/backend/access/gin/ginentrypage.c
@@ -563,7 +563,7 @@ entryExecPlaceToPage(GinBtree btree, Buffer buf, 
GinBtreeStack *stack,
        entryPreparePage(btree, page, off, insertData, updateblkno);
 
        placed = PageAddItem(page,
-                                                (Item) insertData->entry,
+                                                insertData->entry,
                                                 
IndexTupleSize(insertData->entry),
                                                 off, false, false);
        if (placed != off)
@@ -684,7 +684,7 @@ entrySplitPage(GinBtree btree, Buffer origbuf,
                        lsize += MAXALIGN(IndexTupleSize(itup)) + 
sizeof(ItemIdData);
                }
 
-               if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), 
InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
+               if (PageAddItem(page, itup, IndexTupleSize(itup), 
InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
                        elog(ERROR, "failed to add item to index page in 
\"%s\"",
                                 RelationGetRelationName(btree->index));
                ptr += MAXALIGN(IndexTupleSize(itup));
@@ -727,12 +727,12 @@ ginEntryFillRoot(GinBtree btree, Page root,
        IndexTuple      itup;
 
        itup = GinFormInteriorTuple(getRightMostTuple(lpage), lpage, lblkno);
-       if (PageAddItem(root, (Item) itup, IndexTupleSize(itup), 
InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
+       if (PageAddItem(root, itup, IndexTupleSize(itup), InvalidOffsetNumber, 
false, false) == InvalidOffsetNumber)
                elog(ERROR, "failed to add item to index root page");
        pfree(itup);
 
        itup = GinFormInteriorTuple(getRightMostTuple(rpage), rpage, rblkno);
-       if (PageAddItem(root, (Item) itup, IndexTupleSize(itup), 
InvalidOffsetNumber, false, false) == InvalidOffsetNumber)
+       if (PageAddItem(root, itup, IndexTupleSize(itup), InvalidOffsetNumber, 
false, false) == InvalidOffsetNumber)
                elog(ERROR, "failed to add item to index root page");
        pfree(itup);
 }
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
index a6d88572cc2..5b28dde7541 100644
--- a/src/backend/access/gin/ginfast.c
+++ b/src/backend/access/gin/ginfast.c
@@ -83,7 +83,7 @@ writeListPage(Relation index, Buffer buffer,
                ptr += this_size;
                size += this_size;
 
-               l = PageAddItem(page, (Item) tuples[i], this_size, off, false, 
false);
+               l = PageAddItem(page, tuples[i], this_size, off, false, false);
 
                if (l == InvalidOffsetNumber)
                        elog(ERROR, "failed to add item to index page in 
\"%s\"",
@@ -384,7 +384,7 @@ ginHeapTupleFastInsert(GinState *ginstate, 
GinTupleCollector *collector)
                for (i = 0; i < collector->ntuples; i++)
                {
                        tupsize = IndexTupleSize(collector->tuples[i]);
-                       l = PageAddItem(page, (Item) collector->tuples[i], 
tupsize, off, false, false);
+                       l = PageAddItem(page, collector->tuples[i], tupsize, 
off, false, false);
 
                        if (l == InvalidOffsetNumber)
                                elog(ERROR, "failed to add item to index page 
in \"%s\"",
diff --git a/src/backend/access/gin/ginvacuum.c 
b/src/backend/access/gin/ginvacuum.c
index 2d833d6d618..2237efa50bb 100644
--- a/src/backend/access/gin/ginvacuum.c
+++ b/src/backend/access/gin/ginvacuum.c
@@ -547,7 +547,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, 
BlockNumber *roots, uint3
                                        pfree(plist);
                                PageIndexTupleDelete(tmppage, i);
 
-                               if (PageAddItem(tmppage, (Item) itup, 
IndexTupleSize(itup), i, false, false) != i)
+                               if (PageAddItem(tmppage, itup, 
IndexTupleSize(itup), i, false, false) != i)
                                        elog(ERROR, "failed to add item to 
index page in \"%s\"",
                                                 
RelationGetRelationName(gvs->index));
 
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 4478e928204..1c1ef8ddc46 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -93,7 +93,7 @@ ginRedoInsertEntry(Buffer buffer, bool isLeaf, BlockNumber 
rightblkno, void *rda
 
        itup = &data->tuple;
 
-       if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), offset, false, 
false) == InvalidOffsetNumber)
+       if (PageAddItem(page, itup, IndexTupleSize(itup), offset, false, false) 
== InvalidOffsetNumber)
        {
                RelFileLocator locator;
                ForkNumber      forknum;
@@ -574,8 +574,7 @@ ginRedoUpdateMetapage(XLogReaderState *record)
                        {
                                tupsize = IndexTupleSize(tuples);
 
-                               if (PageAddItem(page, (Item) tuples, tupsize, 
off,
-                                                               false, false) 
== InvalidOffsetNumber)
+                               if (PageAddItem(page, tuples, tupsize, off, 
false, false) == InvalidOffsetNumber)
                                        elog(ERROR, "failed to add item to 
index page");
 
                                tuples = (IndexTuple) (((char *) tuples) + 
tupsize);
@@ -655,7 +654,7 @@ ginRedoInsertListPage(XLogReaderState *record)
        {
                tupsize = IndexTupleSize(tuples);
 
-               l = PageAddItem(page, (Item) tuples, tupsize, off, false, 
false);
+               l = PageAddItem(page, tuples, tupsize, off, false, false);
 
                if (l == InvalidOffsetNumber)
                        elog(ERROR, "failed to add item to index page");
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index a96796d5c7d..5213cd71e97 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -430,7 +430,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE 
*giststate,
                        {
                                IndexTuple      thistup = (IndexTuple) data;
 
-                               if (PageAddItem(ptr->page, (Item) data, 
IndexTupleSize(thistup), i + FirstOffsetNumber, false, false) == 
InvalidOffsetNumber)
+                               if (PageAddItem(ptr->page, data, 
IndexTupleSize(thistup), i + FirstOffsetNumber, false, false) == 
InvalidOffsetNumber)
                                        elog(ERROR, "failed to add item to 
index page in \"%s\"", RelationGetRelationName(rel));
 
                                /*
@@ -551,8 +551,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE 
*giststate,
                        if (ntup == 1)
                        {
                                /* One-for-one replacement, so use 
PageIndexTupleOverwrite */
-                               if (!PageIndexTupleOverwrite(page, oldoffnum, 
(Item) *itup,
-                                                                               
         IndexTupleSize(*itup)))
+                               if (!PageIndexTupleOverwrite(page, oldoffnum, 
*itup, IndexTupleSize(*itup)))
                                        elog(ERROR, "failed to add item to 
index page in \"%s\"",
                                                 RelationGetRelationName(rel));
                        }
diff --git a/src/backend/access/gist/gistbuild.c 
b/src/backend/access/gist/gistbuild.c
index 9b2ec9815f1..be0fd5b753d 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -558,7 +558,7 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state,
                {
                        IndexTuple      thistup = (IndexTuple) data;
 
-                       if (PageAddItem(target, (Item) data, 
IndexTupleSize(thistup), i + FirstOffsetNumber, false, false) == 
InvalidOffsetNumber)
+                       if (PageAddItem(target, data, IndexTupleSize(thistup), 
i + FirstOffsetNumber, false, false) == InvalidOffsetNumber)
                                elog(ERROR, "failed to add item to index page 
in \"%s\"", RelationGetRelationName(state->indexrel));
 
                        data += IndexTupleSize(thistup);
diff --git a/src/backend/access/gist/gistutil.c 
b/src/backend/access/gist/gistutil.c
index cdc4ab3151b..98b79608341 100644
--- a/src/backend/access/gist/gistutil.c
+++ b/src/backend/access/gist/gistutil.c
@@ -44,7 +44,7 @@ gistfillbuffer(Page page, IndexTuple *itup, int len, 
OffsetNumber off)
                Size            sz = IndexTupleSize(itup[i]);
                OffsetNumber l;
 
-               l = PageAddItem(page, (Item) itup[i], sz, off, false, false);
+               l = PageAddItem(page, itup[i], sz, off, false, false);
                if (l == InvalidOffsetNumber)
                        elog(ERROR, "failed to add item to GiST index page, 
item %d out of %d, size %d bytes",
                                 i, len, (int) sz);
diff --git a/src/backend/access/gist/gistxlog.c 
b/src/backend/access/gist/gistxlog.c
index 42fee1f0764..3f5340b9206 100644
--- a/src/backend/access/gist/gistxlog.c
+++ b/src/backend/access/gist/gistxlog.c
@@ -98,7 +98,7 @@ gistRedoPageUpdateRecord(XLogReaderState *record)
                        data += sizeof(OffsetNumber);
                        itup = (IndexTuple) data;
                        itupsize = IndexTupleSize(itup);
-                       if (!PageIndexTupleOverwrite(page, offnum, (Item) itup, 
itupsize))
+                       if (!PageIndexTupleOverwrite(page, offnum, itup, 
itupsize))
                                elog(ERROR, "failed to add item to GiST index 
page, size %d bytes",
                                         (int) itupsize);
                        data += itupsize;
@@ -133,7 +133,7 @@ gistRedoPageUpdateRecord(XLogReaderState *record)
 
                                data += sz;
 
-                               l = PageAddItem(page, (Item) itup, sz, off, 
false, false);
+                               l = PageAddItem(page, itup, sz, off, false, 
false);
                                if (l == InvalidOffsetNumber)
                                        elog(ERROR, "failed to add item to GiST 
index page, size %d bytes",
                                                 (int) sz);
diff --git a/src/backend/access/hash/hash_xlog.c 
b/src/backend/access/hash/hash_xlog.c
index d963a0c3702..2a0145f3c9b 100644
--- a/src/backend/access/hash/hash_xlog.c
+++ b/src/backend/access/hash/hash_xlog.c
@@ -137,8 +137,7 @@ hash_xlog_insert(XLogReaderState *record)
 
                page = BufferGetPage(buffer);
 
-               if (PageAddItem(page, (Item) datapos, datalen, xlrec->offnum,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(page, datapos, datalen, xlrec->offnum, false, 
false) == InvalidOffsetNumber)
                        elog(PANIC, "hash_xlog_insert: failed to add item");
 
                PageSetLSN(page, lsn);
@@ -557,7 +556,7 @@ hash_xlog_move_page_contents(XLogReaderState *record)
 
                                data += itemsz;
 
-                               l = PageAddItem(writepage, (Item) itup, itemsz, 
towrite[ninserted], false, false);
+                               l = PageAddItem(writepage, itup, itemsz, 
towrite[ninserted], false, false);
                                if (l == InvalidOffsetNumber)
                                        elog(ERROR, 
"hash_xlog_move_page_contents: failed to add item to hash index page, size %d 
bytes",
                                                 (int) itemsz);
@@ -689,7 +688,7 @@ hash_xlog_squeeze_page(XLogReaderState *record)
 
                                data += itemsz;
 
-                               l = PageAddItem(writepage, (Item) itup, itemsz, 
towrite[ninserted], false, false);
+                               l = PageAddItem(writepage, itup, itemsz, 
towrite[ninserted], false, false);
                                if (l == InvalidOffsetNumber)
                                        elog(ERROR, "hash_xlog_squeeze_page: 
failed to add item to hash index page, size %d bytes",
                                                 (int) itemsz);
diff --git a/src/backend/access/hash/hashinsert.c 
b/src/backend/access/hash/hashinsert.c
index 10de1580dc2..0f9f97f7e3d 100644
--- a/src/backend/access/hash/hashinsert.c
+++ b/src/backend/access/hash/hashinsert.c
@@ -310,10 +310,8 @@ _hash_pgaddtup(Relation rel, Buffer buf, Size itemsize, 
IndexTuple itup,
                itup_off = _hash_binsearch(page, hashkey);
        }
 
-       if (PageAddItem(page, (Item) itup, itemsize, itup_off, false, false)
-               == InvalidOffsetNumber)
-               elog(ERROR, "failed to add index item to \"%s\"",
-                        RelationGetRelationName(rel));
+       if (PageAddItem(page, itup, itemsize, itup_off, false, false) == 
InvalidOffsetNumber)
+               elog(ERROR, "failed to add index item to \"%s\"", 
RelationGetRelationName(rel));
 
        return itup_off;
 }
@@ -352,10 +350,8 @@ _hash_pgaddmultitup(Relation rel, Buffer buf, IndexTuple 
*itups,
 
                itup_offsets[i] = itup_off;
 
-               if (PageAddItem(page, (Item) itups[i], itemsize, itup_off, 
false, false)
-                       == InvalidOffsetNumber)
-                       elog(ERROR, "failed to add index item to \"%s\"",
-                                RelationGetRelationName(rel));
+               if (PageAddItem(page, itups[i], itemsize, itup_off, false, 
false) == InvalidOffsetNumber)
+                       elog(ERROR, "failed to add index item to \"%s\"", 
RelationGetRelationName(rel));
        }
 }
 
diff --git a/src/backend/access/heap/heapam_xlog.c 
b/src/backend/access/heap/heapam_xlog.c
index cf843277938..c01233e1588 100644
--- a/src/backend/access/heap/heapam_xlog.c
+++ b/src/backend/access/heap/heapam_xlog.c
@@ -499,8 +499,7 @@ heap_xlog_insert(XLogReaderState *record)
                HeapTupleHeaderSetCmin(htup, FirstCommandId);
                htup->t_ctid = target_tid;
 
-               if (PageAddItem(page, (Item) htup, newlen, xlrec->offnum,
-                                               true, true) == 
InvalidOffsetNumber)
+               if (PageAddItem(page, htup, newlen, xlrec->offnum, true, true) 
== InvalidOffsetNumber)
                        elog(PANIC, "failed to add tuple");
 
                freespace = PageGetHeapFreeSpace(page); /* needed to update FSM 
below */
@@ -639,7 +638,7 @@ heap_xlog_multi_insert(XLogReaderState *record)
                        ItemPointerSetBlockNumber(&htup->t_ctid, blkno);
                        ItemPointerSetOffsetNumber(&htup->t_ctid, offnum);
 
-                       offnum = PageAddItem(page, (Item) htup, newlen, offnum, 
true, true);
+                       offnum = PageAddItem(page, htup, newlen, offnum, true, 
true);
                        if (offnum == InvalidOffsetNumber)
                                elog(PANIC, "failed to add tuple");
                }
@@ -913,7 +912,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update)
                /* Make sure there is no forward chain link in t_ctid */
                htup->t_ctid = newtid;
 
-               offnum = PageAddItem(page, (Item) htup, newlen, offnum, true, 
true);
+               offnum = PageAddItem(page, htup, newlen, offnum, true, true);
                if (offnum == InvalidOffsetNumber)
                        elog(PANIC, "failed to add tuple");
 
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c
index c482c9d61b2..24c83e349c6 100644
--- a/src/backend/access/heap/hio.c
+++ b/src/backend/access/heap/hio.c
@@ -58,9 +58,7 @@ RelationPutHeapTuple(Relation relation,
        /* Add the tuple to the page */
        pageHeader = BufferGetPage(buffer);
 
-       offnum = PageAddItem(pageHeader, (Item) tuple->t_data,
-                                                tuple->t_len, 
InvalidOffsetNumber, false, true);
-
+       offnum = PageAddItem(pageHeader, tuple->t_data, tuple->t_len, 
InvalidOffsetNumber, false, true);
        if (offnum == InvalidOffsetNumber)
                elog(PANIC, "failed to add tuple to page");
 
diff --git a/src/backend/access/heap/rewriteheap.c 
b/src/backend/access/heap/rewriteheap.c
index e6d2b5fced1..8061e92f044 100644
--- a/src/backend/access/heap/rewriteheap.c
+++ b/src/backend/access/heap/rewriteheap.c
@@ -673,8 +673,7 @@ raw_heap_insert(RewriteState state, HeapTuple tup)
        }
 
        /* And now we can insert the tuple into the page */
-       newoff = PageAddItem(page, (Item) heaptup->t_data, heaptup->t_len,
-                                                InvalidOffsetNumber, false, 
true);
+       newoff = PageAddItem(page, heaptup->t_data, heaptup->t_len, 
InvalidOffsetNumber, false, true);
        if (newoff == InvalidOffsetNumber)
                elog(ERROR, "failed to add tuple");
 
diff --git a/src/backend/access/nbtree/nbtdedup.c 
b/src/backend/access/nbtree/nbtdedup.c
index ab0b6946cb0..07e63962f81 100644
--- a/src/backend/access/nbtree/nbtdedup.c
+++ b/src/backend/access/nbtree/nbtdedup.c
@@ -126,8 +126,7 @@ _bt_dedup_pass(Relation rel, Buffer buf, IndexTuple 
newitem, Size newitemsz,
                Size            hitemsz = ItemIdGetLength(hitemid);
                IndexTuple      hitem = (IndexTuple) PageGetItem(page, hitemid);
 
-               if (PageAddItem(newpage, (Item) hitem, hitemsz, P_HIKEY,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(newpage, hitem, hitemsz, P_HIKEY, false, false) 
== InvalidOffsetNumber)
                        elog(ERROR, "deduplication failed to add highkey");
        }
 
@@ -570,8 +569,7 @@ _bt_dedup_finish_pending(Page newpage, BTDedupState state)
                tuplesz = IndexTupleSize(state->base);
                Assert(tuplesz == MAXALIGN(IndexTupleSize(state->base)));
                Assert(tuplesz <= BTMaxItemSize);
-               if (PageAddItem(newpage, (Item) state->base, tuplesz, tupoff,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(newpage, state->base, tuplesz, tupoff, false, 
false) == InvalidOffsetNumber)
                        elog(ERROR, "deduplication failed to add tuple to 
page");
 
                spacesaving = 0;
@@ -590,8 +588,7 @@ _bt_dedup_finish_pending(Page newpage, BTDedupState state)
 
                Assert(tuplesz == MAXALIGN(IndexTupleSize(final)));
                Assert(tuplesz <= BTMaxItemSize);
-               if (PageAddItem(newpage, (Item) final, tuplesz, tupoff, false,
-                                               false) == InvalidOffsetNumber)
+               if (PageAddItem(newpage, final, tuplesz, tupoff, false, false) 
== InvalidOffsetNumber)
                        elog(ERROR, "deduplication failed to add tuple to 
page");
 
                pfree(final);
diff --git a/src/backend/access/nbtree/nbtinsert.c 
b/src/backend/access/nbtree/nbtinsert.c
index 85d97a970ac..42727e80c30 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -1278,8 +1278,7 @@ _bt_insertonpg(Relation rel,
                if (postingoff != 0)
                        memcpy(oposting, nposting, 
MAXALIGN(IndexTupleSize(nposting)));
 
-               if (PageAddItem(page, (Item) itup, itemsz, newitemoff, false,
-                                               false) == InvalidOffsetNumber)
+               if (PageAddItem(page, itup, itemsz, newitemoff, false, false) 
== InvalidOffsetNumber)
                        elog(PANIC, "failed to add new item to block %u in 
index \"%s\"",
                                 BufferGetBlockNumber(buf), 
RelationGetRelationName(rel));
 
@@ -1700,8 +1699,7 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert 
itup_key, Buffer buf,
        Assert(BTreeTupleGetNAtts(lefthighkey, rel) <=
                   IndexRelationGetNumberOfKeyAttributes(rel));
        Assert(itemsz == MAXALIGN(IndexTupleSize(lefthighkey)));
-       if (PageAddItem(leftpage, (Item) lefthighkey, itemsz, afterleftoff, 
false,
-                                       false) == InvalidOffsetNumber)
+       if (PageAddItem(leftpage, lefthighkey, itemsz, afterleftoff, false, 
false) == InvalidOffsetNumber)
                elog(ERROR, "failed to add high key to the left sibling"
                         " while splitting block %u of index \"%s\"",
                         origpagenumber, RelationGetRelationName(rel));
@@ -1771,8 +1769,7 @@ _bt_split(Relation rel, Relation heaprel, BTScanInsert 
itup_key, Buffer buf,
                Assert(BTreeTupleGetNAtts(righthighkey, rel) > 0);
                Assert(BTreeTupleGetNAtts(righthighkey, rel) <=
                           IndexRelationGetNumberOfKeyAttributes(rel));
-               if (PageAddItem(rightpage, (Item) righthighkey, itemsz, 
afterrightoff,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(rightpage, righthighkey, itemsz, afterrightoff, 
false, false) == InvalidOffsetNumber)
                {
                        elog(ERROR, "failed to add high key to the right 
sibling"
                                 " while splitting block %u of index \"%s\"",
@@ -2537,8 +2534,7 @@ _bt_newlevel(Relation rel, Relation heaprel, Buffer lbuf, 
Buffer rbuf)
         * benefit of _bt_restore_page().
         */
        Assert(BTreeTupleGetNAtts(left_item, rel) == 0);
-       if (PageAddItem(rootpage, (Item) left_item, left_item_sz, P_HIKEY,
-                                       false, false) == InvalidOffsetNumber)
+       if (PageAddItem(rootpage, left_item, left_item_sz, P_HIKEY, false, 
false) == InvalidOffsetNumber)
                elog(PANIC, "failed to add leftkey to new root page"
                         " while splitting block %u of index \"%s\"",
                         BufferGetBlockNumber(lbuf), 
RelationGetRelationName(rel));
@@ -2549,8 +2545,7 @@ _bt_newlevel(Relation rel, Relation heaprel, Buffer lbuf, 
Buffer rbuf)
        Assert(BTreeTupleGetNAtts(right_item, rel) > 0);
        Assert(BTreeTupleGetNAtts(right_item, rel) <=
                   IndexRelationGetNumberOfKeyAttributes(rel));
-       if (PageAddItem(rootpage, (Item) right_item, right_item_sz, P_FIRSTKEY,
-                                       false, false) == InvalidOffsetNumber)
+       if (PageAddItem(rootpage, right_item, right_item_sz, P_FIRSTKEY, false, 
false) == InvalidOffsetNumber)
                elog(PANIC, "failed to add rightkey to new root page"
                         " while splitting block %u of index \"%s\"",
                         BufferGetBlockNumber(lbuf), 
RelationGetRelationName(rel));
@@ -2654,8 +2649,7 @@ _bt_pgaddtup(Page page,
                itemsize = sizeof(IndexTupleData);
        }
 
-       if (unlikely(PageAddItem(page, (Item) itup, itemsize, itup_off, false,
-                                                        false) == 
InvalidOffsetNumber))
+       if (unlikely(PageAddItem(page, itup, itemsize, itup_off, false, false) 
== InvalidOffsetNumber))
                return false;
 
        return true;
diff --git a/src/backend/access/nbtree/nbtpage.c 
b/src/backend/access/nbtree/nbtpage.c
index c79dd38ee18..30b43a4dd18 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -1194,8 +1194,7 @@ _bt_delitems_vacuum(Relation rel, Buffer buf,
 
                itup = updatable[i]->itup;
                itemsz = MAXALIGN(IndexTupleSize(itup));
-               if (!PageIndexTupleOverwrite(page, updatedoffset, (Item) itup,
-                                                                        
itemsz))
+               if (!PageIndexTupleOverwrite(page, updatedoffset, itup, itemsz))
                        elog(PANIC, "failed to update partially dead item in 
block %u of index \"%s\"",
                                 BufferGetBlockNumber(buf), 
RelationGetRelationName(rel));
        }
@@ -1314,8 +1313,7 @@ _bt_delitems_delete(Relation rel, Buffer buf,
 
                itup = updatable[i]->itup;
                itemsz = MAXALIGN(IndexTupleSize(itup));
-               if (!PageIndexTupleOverwrite(page, updatedoffset, (Item) itup,
-                                                                        
itemsz))
+               if (!PageIndexTupleOverwrite(page, updatedoffset, itup, itemsz))
                        elog(PANIC, "failed to update partially dead item in 
block %u of index \"%s\"",
                                 BufferGetBlockNumber(buf), 
RelationGetRelationName(rel));
        }
@@ -2239,8 +2237,7 @@ _bt_mark_page_halfdead(Relation rel, Relation heaprel, 
Buffer leafbuf,
        else
                BTreeTupleSetTopParent(&trunctuple, InvalidBlockNumber);
 
-       if (!PageIndexTupleOverwrite(page, P_HIKEY, (Item) &trunctuple,
-                                                                
IndexTupleSize(&trunctuple)))
+       if (!PageIndexTupleOverwrite(page, P_HIKEY, &trunctuple, 
IndexTupleSize(&trunctuple)))
                elog(ERROR, "could not overwrite high key in half-dead page");
 
        /* Must mark buffers dirty before XLogInsert */
diff --git a/src/backend/access/nbtree/nbtsort.c 
b/src/backend/access/nbtree/nbtsort.c
index 8828a7a8f89..6b618266a7f 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -731,8 +731,7 @@ _bt_sortaddtup(Page page,
                itemsize = sizeof(IndexTupleData);
        }
 
-       if (PageAddItem(page, (Item) itup, itemsize, itup_off,
-                                       false, false) == InvalidOffsetNumber)
+       if (PageAddItem(page, itup, itemsize, itup_off, false, false) == 
InvalidOffsetNumber)
                elog(ERROR, "failed to add item to the index page");
 }
 
@@ -934,8 +933,7 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, 
IndexTuple itup,
                        Assert(IndexTupleSize(oitup) > last_truncextra);
                        truncated = _bt_truncate(wstate->index, lastleft, oitup,
                                                                         
wstate->inskey);
-                       if (!PageIndexTupleOverwrite(opage, P_HIKEY, (Item) 
truncated,
-                                                                               
 IndexTupleSize(truncated)))
+                       if (!PageIndexTupleOverwrite(opage, P_HIKEY, truncated, 
IndexTupleSize(truncated)))
                                elog(ERROR, "failed to add high key to the 
index page");
                        pfree(truncated);
 
diff --git a/src/backend/access/nbtree/nbtxlog.c 
b/src/backend/access/nbtree/nbtxlog.c
index 69ea668bb0d..d4a26de06a3 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -38,7 +38,7 @@ _bt_restore_page(Page page, char *from, int len)
        IndexTupleData itupdata;
        Size            itemsz;
        char       *end = from + len;
-       Item            items[MaxIndexTuplesPerPage];
+       void       *items[MaxIndexTuplesPerPage];
        uint16          itemsizes[MaxIndexTuplesPerPage];
        int                     i;
        int                     nitems;
@@ -53,16 +53,15 @@ _bt_restore_page(Page page, char *from, int len)
        {
                /*
                 * As we step through the items, 'from' won't always be properly
-                * aligned, so we need to use memcpy().  Further, we use Item 
(which
-                * is just a char*) here for our items array for the same 
reason;
-                * wouldn't want the compiler or anyone thinking that an item is
-                * aligned when it isn't.
+                * aligned, so we need to use memcpy().  Further, we use void * 
here
+                * for our items array for the same reason; wouldn't want the 
compiler
+                * or anyone thinking that an item is aligned when it isn't.
                 */
                memcpy(&itupdata, from, sizeof(IndexTupleData));
                itemsz = IndexTupleSize(&itupdata);
                itemsz = MAXALIGN(itemsz);
 
-               items[i] = (Item) from;
+               items[i] = from;
                itemsizes[i] = itemsz;
                i++;
 
@@ -72,8 +71,7 @@ _bt_restore_page(Page page, char *from, int len)
 
        for (i = nitems - 1; i >= 0; i--)
        {
-               if (PageAddItem(page, items[i], itemsizes[i], nitems - i,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(page, items[i], itemsizes[i], nitems - i, 
false, false) == InvalidOffsetNumber)
                        elog(PANIC, "_bt_restore_page: cannot add item to 
page");
        }
 }
@@ -186,8 +184,7 @@ btree_xlog_insert(bool isleaf, bool ismeta, bool posting,
                if (!posting)
                {
                        /* Simple retail insertion */
-                       if (PageAddItem(page, (Item) datapos, datalen, 
xlrec->offnum,
-                                                       false, false) == 
InvalidOffsetNumber)
+                       if (PageAddItem(page, datapos, datalen, xlrec->offnum, 
false, false) == InvalidOffsetNumber)
                                elog(PANIC, "failed to add new item");
                }
                else
@@ -225,8 +222,7 @@ btree_xlog_insert(bool isleaf, bool ismeta, bool posting,
 
                        /* Insert "final" new item (not orignewitem from WAL 
stream) */
                        Assert(IndexTupleSize(newitem) == datalen);
-                       if (PageAddItem(page, (Item) newitem, datalen, 
xlrec->offnum,
-                                                       false, false) == 
InvalidOffsetNumber)
+                       if (PageAddItem(page, newitem, datalen, xlrec->offnum, 
false, false) == InvalidOffsetNumber)
                                elog(PANIC, "failed to add posting split new 
item");
                }
 
@@ -368,8 +364,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState 
*record)
 
                /* Add high key tuple from WAL record to temp page */
                leftoff = P_HIKEY;
-               if (PageAddItem(leftpage, (Item) left_hikey, left_hikeysz, 
P_HIKEY,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(leftpage, left_hikey, left_hikeysz, P_HIKEY, 
false, false) == InvalidOffsetNumber)
                        elog(ERROR, "failed to add high key to left page after 
split");
                leftoff = OffsetNumberNext(leftoff);
 
@@ -384,9 +379,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState 
*record)
                        {
                                Assert(newitemonleft ||
                                           xlrec->firstrightoff == 
xlrec->newitemoff);
-                               if (PageAddItem(leftpage, (Item) nposting,
-                                                               
MAXALIGN(IndexTupleSize(nposting)), leftoff,
-                                                               false, false) 
== InvalidOffsetNumber)
+                               if (PageAddItem(leftpage, nposting, 
MAXALIGN(IndexTupleSize(nposting)), leftoff, false, false) == 
InvalidOffsetNumber)
                                        elog(ERROR, "failed to add new posting 
list item to left page after split");
                                leftoff = OffsetNumberNext(leftoff);
                                continue;               /* don't insert 
oposting */
@@ -395,8 +388,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState 
*record)
                        /* add the new item if it was inserted on left page */
                        else if (newitemonleft && off == xlrec->newitemoff)
                        {
-                               if (PageAddItem(leftpage, (Item) newitem, 
newitemsz, leftoff,
-                                                               false, false) 
== InvalidOffsetNumber)
+                               if (PageAddItem(leftpage, newitem, newitemsz, 
leftoff, false, false) == InvalidOffsetNumber)
                                        elog(ERROR, "failed to add new item to 
left page after split");
                                leftoff = OffsetNumberNext(leftoff);
                        }
@@ -404,8 +396,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState 
*record)
                        itemid = PageGetItemId(origpage, off);
                        itemsz = ItemIdGetLength(itemid);
                        item = (IndexTuple) PageGetItem(origpage, itemid);
-                       if (PageAddItem(leftpage, (Item) item, itemsz, leftoff,
-                                                       false, false) == 
InvalidOffsetNumber)
+                       if (PageAddItem(leftpage, item, itemsz, leftoff, false, 
false) == InvalidOffsetNumber)
                                elog(ERROR, "failed to add old item to left 
page after split");
                        leftoff = OffsetNumberNext(leftoff);
                }
@@ -413,8 +404,7 @@ btree_xlog_split(bool newitemonleft, XLogReaderState 
*record)
                /* cope with possibility that newitem goes at the end */
                if (newitemonleft && off == xlrec->newitemoff)
                {
-                       if (PageAddItem(leftpage, (Item) newitem, newitemsz, 
leftoff,
-                                                       false, false) == 
InvalidOffsetNumber)
+                       if (PageAddItem(leftpage, newitem, newitemsz, leftoff, 
false, false) == InvalidOffsetNumber)
                                elog(ERROR, "failed to add new item to left 
page after split");
                        leftoff = OffsetNumberNext(leftoff);
                }
@@ -503,8 +493,7 @@ btree_xlog_dedup(XLogReaderState *record)
                        Size            itemsz = ItemIdGetLength(itemid);
                        IndexTuple      item = (IndexTuple) PageGetItem(page, 
itemid);
 
-                       if (PageAddItem(newpage, (Item) item, itemsz, P_HIKEY,
-                                                       false, false) == 
InvalidOffsetNumber)
+                       if (PageAddItem(newpage, item, itemsz, P_HIKEY, false, 
false) == InvalidOffsetNumber)
                                elog(ERROR, "deduplication failed to add 
highkey");
                }
 
@@ -580,8 +569,7 @@ btree_xlog_updates(Page page, OffsetNumber *updatedoffsets,
 
                /* Overwrite updated version of tuple */
                itemsz = MAXALIGN(IndexTupleSize(vacposting->itup));
-               if (!PageIndexTupleOverwrite(page, updatedoffsets[i],
-                                                                        (Item) 
vacposting->itup, itemsz))
+               if (!PageIndexTupleOverwrite(page, updatedoffsets[i], 
vacposting->itup, itemsz))
                        elog(PANIC, "failed to update partially dead item");
 
                pfree(vacposting->itup);
@@ -788,8 +776,7 @@ btree_xlog_mark_page_halfdead(uint8 info, XLogReaderState 
*record)
        trunctuple.t_info = sizeof(IndexTupleData);
        BTreeTupleSetTopParent(&trunctuple, xlrec->topparent);
 
-       if (PageAddItem(page, (Item) &trunctuple, sizeof(IndexTupleData), 
P_HIKEY,
-                                       false, false) == InvalidOffsetNumber)
+       if (PageAddItem(page, &trunctuple, sizeof(IndexTupleData), P_HIKEY, 
false, false) == InvalidOffsetNumber)
                elog(ERROR, "could not add dummy high key to half-dead page");
 
        PageSetLSN(page, lsn);
@@ -923,8 +910,7 @@ btree_xlog_unlink_page(uint8 info, XLogReaderState *record)
                trunctuple.t_info = sizeof(IndexTupleData);
                BTreeTupleSetTopParent(&trunctuple, xlrec->leaftopparent);
 
-               if (PageAddItem(page, (Item) &trunctuple, 
sizeof(IndexTupleData), P_HIKEY,
-                                               false, false) == 
InvalidOffsetNumber)
+               if (PageAddItem(page, &trunctuple, sizeof(IndexTupleData), 
P_HIKEY, false, false) == InvalidOffsetNumber)
                        elog(ERROR, "could not add dummy high key to half-dead 
page");
 
                PageSetLSN(page, lsn);
diff --git a/src/backend/access/spgist/spgdoinsert.c 
b/src/backend/access/spgist/spgdoinsert.c
index af6b27b2135..e00bd0e2636 100644
--- a/src/backend/access/spgist/spgdoinsert.c
+++ b/src/backend/access/spgist/spgdoinsert.c
@@ -165,8 +165,7 @@ spgPageIndexMultiDelete(SpGistState *state, Page page,
                if (tuple == NULL || tuple->tupstate != tupstate)
                        tuple = spgFormDeadTuple(state, tupstate, blkno, 
offnum);
 
-               if (PageAddItem(page, (Item) tuple, tuple->size,
-                                               itemno, false, false) != itemno)
+               if (PageAddItem(page, tuple, tuple->size, itemno, false, false) 
!= itemno)
                        elog(ERROR, "failed to add item of size %u to SPGiST 
index page",
                                 tuple->size);
 
@@ -222,7 +221,7 @@ addLeafTuple(Relation index, SpGistState *state, 
SpGistLeafTuple leafTuple,
                /* Tuple is not part of a chain */
                SGLT_SET_NEXTOFFSET(leafTuple, InvalidOffsetNumber);
                current->offnum = SpGistPageAddNewItem(state, current->page,
-                                                                               
           (Item) leafTuple, leafTuple->size,
+                                                                               
           leafTuple, leafTuple->size,
                                                                                
           NULL, false);
 
                xlrec.offnumLeaf = current->offnum;
@@ -255,7 +254,7 @@ addLeafTuple(Relation index, SpGistState *state, 
SpGistLeafTuple leafTuple,
                {
                        SGLT_SET_NEXTOFFSET(leafTuple, 
SGLT_GET_NEXTOFFSET(head));
                        offnum = SpGistPageAddNewItem(state, current->page,
-                                                                               
  (Item) leafTuple, leafTuple->size,
+                                                                               
  leafTuple, leafTuple->size,
                                                                                
  NULL, false);
 
                        /*
@@ -274,7 +273,7 @@ addLeafTuple(Relation index, SpGistState *state, 
SpGistLeafTuple leafTuple,
                        SGLT_SET_NEXTOFFSET(leafTuple, InvalidOffsetNumber);
                        PageIndexTupleDelete(current->page, current->offnum);
                        if (PageAddItem(current->page,
-                                                       (Item) leafTuple, 
leafTuple->size,
+                                                       leafTuple, 
leafTuple->size,
                                                        current->offnum, false, 
false) != current->offnum)
                                elog(ERROR, "failed to add item of size %u to 
SPGiST index page",
                                         leafTuple->size);
@@ -478,8 +477,7 @@ moveLeafs(Relation index, SpGistState *state,
                         */
                        SGLT_SET_NEXTOFFSET(it, r);
 
-                       r = SpGistPageAddNewItem(state, npage, (Item) it, 
it->size,
-                                                                        
&startOffset, false);
+                       r = SpGistPageAddNewItem(state, npage, it, it->size, 
&startOffset, false);
 
                        toInsert[nInsert] = r;
                        nInsert++;
@@ -492,9 +490,7 @@ moveLeafs(Relation index, SpGistState *state,
 
        /* add the new tuple as well */
        SGLT_SET_NEXTOFFSET(newLeafTuple, r);
-       r = SpGistPageAddNewItem(state, npage,
-                                                        (Item) newLeafTuple, 
newLeafTuple->size,
-                                                        &startOffset, false);
+       r = SpGistPageAddNewItem(state, npage, newLeafTuple, 
newLeafTuple->size, &startOffset, false);
        toInsert[nInsert] = r;
        nInsert++;
        memcpy(leafptr, newLeafTuple, newLeafTuple->size);
@@ -1226,7 +1222,7 @@ doPickSplit(Relation index, SpGistState *state,
 
                /* Insert it on page */
                newoffset = SpGistPageAddNewItem(state, 
BufferGetPage(leafBuffer),
-                                                                               
 (Item) it, it->size,
+                                                                               
 it, it->size,
                                                                                
 &startOffsets[leafPageSelect[i]],
                                                                                
 false);
                toInsert[i] = newoffset;
@@ -1268,7 +1264,7 @@ doPickSplit(Relation index, SpGistState *state,
                current->page = parent->page;
                xlrec.offnumInner = current->offnum =
                        SpGistPageAddNewItem(state, current->page,
-                                                                (Item) 
innerTuple, innerTuple->size,
+                                                                innerTuple, 
innerTuple->size,
                                                                 NULL, false);
 
                /*
@@ -1302,7 +1298,7 @@ doPickSplit(Relation index, SpGistState *state,
                current->page = BufferGetPage(current->buffer);
                xlrec.offnumInner = current->offnum =
                        SpGistPageAddNewItem(state, current->page,
-                                                                (Item) 
innerTuple, innerTuple->size,
+                                                                innerTuple, 
innerTuple->size,
                                                                 NULL, false);
 
                /* Done modifying new current buffer, mark it dirty */
@@ -1340,7 +1336,7 @@ doPickSplit(Relation index, SpGistState *state,
                xlrec.innerIsParent = false;
 
                xlrec.offnumInner = current->offnum =
-                       PageAddItem(current->page, (Item) innerTuple, 
innerTuple->size,
+                       PageAddItem(current->page, innerTuple, innerTuple->size,
                                                InvalidOffsetNumber, false, 
false);
                if (current->offnum != FirstOffsetNumber)
                        elog(ERROR, "failed to add item of size %u to SPGiST 
index page",
@@ -1547,7 +1543,7 @@ spgAddNodeAction(Relation index, SpGistState *state,
 
                PageIndexTupleDelete(current->page, current->offnum);
                if (PageAddItem(current->page,
-                                               (Item) newInnerTuple, 
newInnerTuple->size,
+                                               newInnerTuple, 
newInnerTuple->size,
                                                current->offnum, false, false) 
!= current->offnum)
                        elog(ERROR, "failed to add item of size %u to SPGiST 
index page",
                                 newInnerTuple->size);
@@ -1631,7 +1627,7 @@ spgAddNodeAction(Relation index, SpGistState *state,
                /* insert new ... */
                xlrec.offnumNew = current->offnum =
                        SpGistPageAddNewItem(state, current->page,
-                                                                (Item) 
newInnerTuple, newInnerTuple->size,
+                                                                newInnerTuple, 
newInnerTuple->size,
                                                                 NULL, false);
 
                MarkBufferDirty(current->buffer);
@@ -1654,7 +1650,7 @@ spgAddNodeAction(Relation index, SpGistState *state,
                                                                  
current->blkno, current->offnum);
 
                PageIndexTupleDelete(saveCurrent.page, saveCurrent.offnum);
-               if (PageAddItem(saveCurrent.page, (Item) dt, dt->size,
+               if (PageAddItem(saveCurrent.page, dt, dt->size,
                                                saveCurrent.offnum,
                                                false, false) != 
saveCurrent.offnum)
                        elog(ERROR, "failed to add item of size %u to SPGiST 
index page",
@@ -1818,7 +1814,7 @@ spgSplitNodeAction(Relation index, SpGistState *state,
         */
        PageIndexTupleDelete(current->page, current->offnum);
        xlrec.offnumPrefix = PageAddItem(current->page,
-                                                                        (Item) 
prefixTuple, prefixTuple->size,
+                                                                        
prefixTuple, prefixTuple->size,
                                                                         
current->offnum, false, false);
        if (xlrec.offnumPrefix != current->offnum)
                elog(ERROR, "failed to add item of size %u to SPGiST index 
page",
@@ -1832,7 +1828,7 @@ spgSplitNodeAction(Relation index, SpGistState *state,
                postfixBlkno = current->blkno;
                xlrec.offnumPostfix = postfixOffset =
                        SpGistPageAddNewItem(state, current->page,
-                                                                (Item) 
postfixTuple, postfixTuple->size,
+                                                                postfixTuple, 
postfixTuple->size,
                                                                 NULL, false);
                xlrec.postfixBlkSame = true;
        }
@@ -1841,7 +1837,7 @@ spgSplitNodeAction(Relation index, SpGistState *state,
                postfixBlkno = BufferGetBlockNumber(newBuffer);
                xlrec.offnumPostfix = postfixOffset =
                        SpGistPageAddNewItem(state, BufferGetPage(newBuffer),
-                                                                (Item) 
postfixTuple, postfixTuple->size,
+                                                                postfixTuple, 
postfixTuple->size,
                                                                 NULL, false);
                MarkBufferDirty(newBuffer);
                xlrec.postfixBlkSame = false;
diff --git a/src/backend/access/spgist/spgutils.c 
b/src/backend/access/spgist/spgutils.c
index 9b86c016acb..245ec05e4bb 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -1200,7 +1200,7 @@ spgExtractNodeLabels(SpGistState *state, SpGistInnerTuple 
innerTuple)
  * rather than returning InvalidOffsetNumber.
  */
 OffsetNumber
-SpGistPageAddNewItem(SpGistState *state, Page page, Item item, Size size,
+SpGistPageAddNewItem(SpGistState *state, Page page, const void *item, Size 
size,
                                         OffsetNumber *startOffset, bool 
errorOK)
 {
        SpGistPageOpaque opaque = SpGistPageGetOpaque(page);
diff --git a/src/backend/access/spgist/spgxlog.c 
b/src/backend/access/spgist/spgxlog.c
index d4620c915d0..b7110302b98 100644
--- a/src/backend/access/spgist/spgxlog.c
+++ b/src/backend/access/spgist/spgxlog.c
@@ -47,7 +47,7 @@ fillFakeState(SpGistState *state, spgxlogState stateSrc)
  * existing tuple, it had better be a placeholder tuple.
  */
 static void
-addOrReplaceTuple(Page page, Item tuple, int size, OffsetNumber offset)
+addOrReplaceTuple(Page page, const void *tuple, int size, OffsetNumber offset)
 {
        if (offset <= PageGetMaxOffsetNumber(page))
        {
@@ -110,8 +110,7 @@ spgRedoAddLeaf(XLogReaderState *record)
                if (xldata->offnumLeaf != xldata->offnumHeadLeaf)
                {
                        /* normal cases, tuple was added by 
SpGistPageAddNewItem */
-                       addOrReplaceTuple(page, (Item) leafTuple, 
leafTupleHdr.size,
-                                                         xldata->offnumLeaf);
+                       addOrReplaceTuple(page, leafTuple, leafTupleHdr.size, 
xldata->offnumLeaf);
 
                        /* update head tuple's chain link if needed */
                        if (xldata->offnumHeadLeaf != InvalidOffsetNumber)
@@ -129,7 +128,7 @@ spgRedoAddLeaf(XLogReaderState *record)
                        /* replacing a DEAD tuple */
                        PageIndexTupleDelete(page, xldata->offnumLeaf);
                        if (PageAddItem(page,
-                                                       (Item) leafTuple, 
leafTupleHdr.size,
+                                                       leafTuple, 
leafTupleHdr.size,
                                                        xldata->offnumLeaf, 
false, false) != xldata->offnumLeaf)
                                elog(ERROR, "failed to add item of size %u to 
SPGiST index page",
                                         leafTupleHdr.size);
@@ -232,8 +231,7 @@ spgRedoMoveLeafs(XLogReaderState *record)
                        memcpy(&leafTupleHdr, leafTuple,
                                   sizeof(SpGistLeafTupleData));
 
-                       addOrReplaceTuple(page, (Item) leafTuple,
-                                                         leafTupleHdr.size, 
toInsert[i]);
+                       addOrReplaceTuple(page, leafTuple, leafTupleHdr.size, 
toInsert[i]);
                        ptr += leafTupleHdr.size;
                }
 
@@ -309,7 +307,7 @@ spgRedoAddNode(XLogReaderState *record)
                        page = BufferGetPage(buffer);
 
                        PageIndexTupleDelete(page, xldata->offnum);
-                       if (PageAddItem(page, (Item) innerTuple, 
innerTupleHdr.size,
+                       if (PageAddItem(page, innerTuple, innerTupleHdr.size,
                                                        xldata->offnum,
                                                        false, false) != 
xldata->offnum)
                                elog(ERROR, "failed to add item of size %u to 
SPGiST index page",
@@ -351,8 +349,7 @@ spgRedoAddNode(XLogReaderState *record)
                {
                        page = BufferGetPage(buffer);
 
-                       addOrReplaceTuple(page, (Item) innerTuple,
-                                                         innerTupleHdr.size, 
xldata->offnumNew);
+                       addOrReplaceTuple(page, innerTuple, innerTupleHdr.size, 
xldata->offnumNew);
 
                        /*
                         * If parent is in this same page, update it now.
@@ -390,7 +387,7 @@ spgRedoAddNode(XLogReaderState *record)
                                                                          
xldata->offnumNew);
 
                        PageIndexTupleDelete(page, xldata->offnum);
-                       if (PageAddItem(page, (Item) dt, dt->size,
+                       if (PageAddItem(page, dt, dt->size,
                                                        xldata->offnum,
                                                        false, false) != 
xldata->offnum)
                                elog(ERROR, "failed to add item of size %u to 
SPGiST index page",
@@ -492,8 +489,7 @@ spgRedoSplitTuple(XLogReaderState *record)
                {
                        page = BufferGetPage(buffer);
 
-                       addOrReplaceTuple(page, (Item) postfixTuple,
-                                                         postfixTupleHdr.size, 
xldata->offnumPostfix);
+                       addOrReplaceTuple(page, postfixTuple, 
postfixTupleHdr.size, xldata->offnumPostfix);
 
                        PageSetLSN(page, lsn);
                        MarkBufferDirty(buffer);
@@ -508,15 +504,13 @@ spgRedoSplitTuple(XLogReaderState *record)
                page = BufferGetPage(buffer);
 
                PageIndexTupleDelete(page, xldata->offnumPrefix);
-               if (PageAddItem(page, (Item) prefixTuple, prefixTupleHdr.size,
+               if (PageAddItem(page, prefixTuple, prefixTupleHdr.size,
                                                xldata->offnumPrefix, false, 
false) != xldata->offnumPrefix)
                        elog(ERROR, "failed to add item of size %u to SPGiST 
index page",
                                 prefixTupleHdr.size);
 
                if (xldata->postfixBlkSame)
-                       addOrReplaceTuple(page, (Item) postfixTuple,
-                                                         postfixTupleHdr.size,
-                                                         
xldata->offnumPostfix);
+                       addOrReplaceTuple(page, postfixTuple, 
postfixTupleHdr.size, xldata->offnumPostfix);
 
                PageSetLSN(page, lsn);
                MarkBufferDirty(buffer);
@@ -662,8 +656,7 @@ spgRedoPickSplit(XLogReaderState *record)
                if (page == NULL)
                        continue;                       /* no need to touch 
this page */
 
-               addOrReplaceTuple(page, (Item) leafTuple, leafTupleHdr.size,
-                                                 toInsert[i]);
+               addOrReplaceTuple(page, leafTuple, leafTupleHdr.size, 
toInsert[i]);
        }
 
        /* Now update src and dest page LSNs if needed */
@@ -692,8 +685,7 @@ spgRedoPickSplit(XLogReaderState *record)
        {
                page = BufferGetPage(innerBuffer);
 
-               addOrReplaceTuple(page, (Item) innerTuple, innerTupleHdr.size,
-                                                 xldata->offnumInner);
+               addOrReplaceTuple(page, innerTuple, innerTupleHdr.size, 
xldata->offnumInner);
 
                /* if inner is also parent, update link while we're here */
                if (xldata->innerIsParent)
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index 636d3c3ec73..9107680ecfb 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -403,8 +403,7 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, 
ForkNumber forkNum)
 
        MarkBufferDirty(buf);
 
-       offnum = PageAddItem(page, (Item) tuple->t_data, tuple->t_len,
-                                                InvalidOffsetNumber, false, 
false);
+       offnum = PageAddItem(page, tuple->t_data, tuple->t_len, 
InvalidOffsetNumber, false, false);
        if (offnum != FirstOffsetNumber)
                elog(ERROR, "failed to add sequence tuple to page");
 
@@ -1940,8 +1939,7 @@ seq_redo(XLogReaderState *record)
        item = (char *) xlrec + sizeof(xl_seq_rec);
        itemsz = XLogRecGetDataLen(record) - sizeof(xl_seq_rec);
 
-       if (PageAddItem(localpage, (Item) item, itemsz,
-                                       FirstOffsetNumber, false, false) == 
InvalidOffsetNumber)
+       if (PageAddItem(localpage, item, itemsz, FirstOffsetNumber, false, 
false) == InvalidOffsetNumber)
                elog(PANIC, "seq_redo: failed to add item to page");
 
        PageSetLSN(localpage, lsn);
diff --git a/src/backend/storage/page/bufpage.c 
b/src/backend/storage/page/bufpage.c
index dbb49ed9197..aac6e695954 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -191,7 +191,7 @@ PageIsVerified(PageData *page, BlockNumber blkno, int 
flags, bool *checksum_fail
  */
 OffsetNumber
 PageAddItemExtended(Page page,
-                                       Item item,
+                                       const void *item,
                                        Size size,
                                        OffsetNumber offsetNumber,
                                        int flags)
@@ -1402,7 +1402,7 @@ PageIndexTupleDeleteNoCompact(Page page, OffsetNumber 
offnum)
  */
 bool
 PageIndexTupleOverwrite(Page page, OffsetNumber offnum,
-                                               Item newtup, Size newsize)
+                                               const void *newtup, Size 
newsize)
 {
        PageHeader      phdr = (PageHeader) page;
        ItemId          tupid;
diff --git a/src/include/access/spgist_private.h 
b/src/include/access/spgist_private.h
index 56ac64f0597..781e1e12e55 100644
--- a/src/include/access/spgist_private.h
+++ b/src/include/access/spgist_private.h
@@ -526,7 +526,7 @@ extern void spgDeformLeafTuple(SpGistLeafTuple tup, 
TupleDesc tupleDescriptor,
 extern Datum *spgExtractNodeLabels(SpGistState *state,
                                                                   
SpGistInnerTuple innerTuple);
 extern OffsetNumber SpGistPageAddNewItem(SpGistState *state, Page page,
-                                                                               
 Item item, Size size,
+                                                                               
 const void *item, Size size,
                                                                                
 OffsetNumber *startOffset,
                                                                                
 bool errorOK);
 extern bool spgproperty(Oid index_oid, int attno,
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index aeb67c498c5..abc2cf2a020 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -16,7 +16,6 @@
 
 #include "access/xlogdefs.h"
 #include "storage/block.h"
-#include "storage/item.h"
 #include "storage/off.h"
 
 /* GUC variable */
@@ -351,13 +350,13 @@ PageValidateSpecialPointer(const PageData *page)
  *             This does not change the status of any of the resources passed.
  *             The semantics may change in the future.
  */
-static inline Item
+static inline void *
 PageGetItem(const PageData *page, const ItemIdData *itemId)
 {
        Assert(page);
        Assert(ItemIdHasStorage(itemId));
 
-       return (Item) (((const char *) page) + ItemIdGetOffset(itemId));
+       return (void *) (((const char *) page) + ItemIdGetOffset(itemId));
 }
 
 /*
@@ -488,7 +487,7 @@ StaticAssertDecl(BLCKSZ == ((BLCKSZ / sizeof(size_t)) * 
sizeof(size_t)),
 extern void PageInit(Page page, Size pageSize, Size specialSize);
 extern bool PageIsVerified(PageData *page, BlockNumber blkno, int flags,
                                                   bool *checksum_failure_p);
-extern OffsetNumber PageAddItemExtended(Page page, Item item, Size size,
+extern OffsetNumber PageAddItemExtended(Page page, const void *item, Size size,
                                                                                
OffsetNumber offsetNumber, int flags);
 extern Page PageGetTempPage(const PageData *page);
 extern Page PageGetTempPageCopy(const PageData *page);
@@ -504,7 +503,7 @@ extern void PageIndexTupleDelete(Page page, OffsetNumber 
offnum);
 extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems);
 extern void PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum);
 extern bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum,
-                                                                       Item 
newtup, Size newsize);
+                                                                       const 
void *newtup, Size newsize);
 extern char *PageSetChecksumCopy(Page page, BlockNumber blkno);
 extern void PageSetChecksumInplace(Page page, BlockNumber blkno);
 
diff --git a/src/include/storage/item.h b/src/include/storage/item.h
deleted file mode 100644
index 5a4539cc381..00000000000
--- a/src/include/storage/item.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * item.h
- *       POSTGRES disk item definitions.
- *
- *
- * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * src/include/storage/item.h
- *
- *-------------------------------------------------------------------------
- */
-#ifndef ITEM_H
-#define ITEM_H
-
-typedef Pointer Item;
-
-#endif                                                 /* ITEM_H */

base-commit: 2cb49c609bd9bf44d319591df7bef1eb107cb375
-- 
2.51.0

From fa7a3d0c1ff2d9636e25c0756ad8993b9d943d06 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 Sep 2025 10:54:39 +0200
Subject: [PATCH 2/2] Some const qualifications

Add some const qualifications afforded by the previous change that
added a const qualification to PageAddItemExtended().
---
 src/backend/access/brin/brin_pageops.c | 2 +-
 src/backend/access/gin/ginfast.c       | 2 +-
 src/backend/access/nbtree/nbtinsert.c  | 4 ++--
 src/backend/access/nbtree/nbtsort.c    | 4 ++--
 src/include/access/brin_pageops.h      | 2 +-
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/backend/access/brin/brin_pageops.c 
b/src/backend/access/brin/brin_pageops.c
index b19c843132c..91a5ba163f2 100644
--- a/src/backend/access/brin/brin_pageops.c
+++ b/src/backend/access/brin/brin_pageops.c
@@ -340,7 +340,7 @@ brin_can_do_samepage_update(Buffer buffer, Size origsz, 
Size newsz)
 OffsetNumber
 brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
                          BrinRevmap *revmap, Buffer *buffer, BlockNumber 
heapBlk,
-                         BrinTuple *tup, Size itemsz)
+                         const BrinTuple *tup, Size itemsz)
 {
        Page            page;
        BlockNumber blk;
diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c
index 5b28dde7541..33816f8551f 100644
--- a/src/backend/access/gin/ginfast.c
+++ b/src/backend/access/gin/ginfast.c
@@ -57,7 +57,7 @@ typedef struct KeyArray
  */
 static int32
 writeListPage(Relation index, Buffer buffer,
-                         IndexTuple *tuples, int32 ntuples, BlockNumber 
rightlink)
+                         const IndexTuple *tuples, int32 ntuples, BlockNumber 
rightlink)
 {
        Page            page = BufferGetPage(buffer);
        int32           i,
diff --git a/src/backend/access/nbtree/nbtinsert.c 
b/src/backend/access/nbtree/nbtinsert.c
index 42727e80c30..7c113c007e5 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -61,7 +61,7 @@ static Buffer _bt_split(Relation rel, Relation heaprel, 
BTScanInsert itup_key,
 static void _bt_insert_parent(Relation rel, Relation heaprel, Buffer buf,
                                                          Buffer rbuf, BTStack 
stack, bool isroot, bool isonly);
 static Buffer _bt_newlevel(Relation rel, Relation heaprel, Buffer lbuf, Buffer 
rbuf);
-static inline bool _bt_pgaddtup(Page page, Size itemsize, IndexTuple itup,
+static inline bool _bt_pgaddtup(Page page, Size itemsize, const IndexTupleData 
*itup,
                                                                OffsetNumber 
itup_off, bool newfirstdataitem);
 static void _bt_delete_or_dedup_one_page(Relation rel, Relation heapRel,
                                                                                
 BTInsertState insertstate,
@@ -2634,7 +2634,7 @@ _bt_newlevel(Relation rel, Relation heaprel, Buffer lbuf, 
Buffer rbuf)
 static inline bool
 _bt_pgaddtup(Page page,
                         Size itemsize,
-                        IndexTuple itup,
+                        const IndexTupleData *itup,
                         OffsetNumber itup_off,
                         bool newfirstdataitem)
 {
diff --git a/src/backend/access/nbtree/nbtsort.c 
b/src/backend/access/nbtree/nbtsort.c
index 6b618266a7f..313fe66bc96 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -266,7 +266,7 @@ static BulkWriteBuffer _bt_blnewpage(BTWriteState *wstate, 
uint32 level);
 static BTPageState *_bt_pagestate(BTWriteState *wstate, uint32 level);
 static void _bt_slideleft(Page rightmostpage);
 static void _bt_sortaddtup(Page page, Size itemsize,
-                                                  IndexTuple itup, 
OffsetNumber itup_off,
+                                                  const IndexTupleData *itup, 
OffsetNumber itup_off,
                                                   bool newfirstdataitem);
 static void _bt_buildadd(BTWriteState *wstate, BTPageState *state,
                                                 IndexTuple itup, Size 
truncextra);
@@ -716,7 +716,7 @@ _bt_slideleft(Page rightmostpage)
 static void
 _bt_sortaddtup(Page page,
                           Size itemsize,
-                          IndexTuple itup,
+                          const IndexTupleData *itup,
                           OffsetNumber itup_off,
                           bool newfirstdataitem)
 {
diff --git a/src/include/access/brin_pageops.h 
b/src/include/access/brin_pageops.h
index be343767027..d3f7a11acb1 100644
--- a/src/include/access/brin_pageops.h
+++ b/src/include/access/brin_pageops.h
@@ -23,7 +23,7 @@ extern bool brin_can_do_samepage_update(Buffer buffer, Size 
origsz,
                                                                                
Size newsz);
 extern OffsetNumber brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
                                                                  BrinRevmap 
*revmap, Buffer *buffer, BlockNumber heapBlk,
-                                                                 BrinTuple 
*tup, Size itemsz);
+                                                                 const 
BrinTuple *tup, Size itemsz);
 
 extern void brin_page_init(Page page, uint16 type);
 extern void brin_metapage_init(Page page, BlockNumber pagesPerRange,
-- 
2.51.0

Reply via email to