In a previous thread[0], the question was asked, 'Why do we bother with
a "Pointer" type?'. So I looked into get rid of it.
There are two stages to this. One is changing all code that wants to do
pointer arithmetic to use char * instead of relying on Pointer being
char *. Then we can change Pointer to be void * and remove a bunch of
casts.
The second is getting rid of uses of Pointer for variables where you
might as well use void * directly. These are actually not that many.
This gets rid of all uses, except in the GIN code, which is full of
Pointer use, and it's part of the documented API. I'm not touching
that, not least because this kind of code
Pointer **extra_data = (Pointer **) PG_GETARG_POINTER(4);
needs more brain-bending to understand that I'm prepared to spend. So
as far as I'm concerned, the pointer type can continue to exist as a
curiosity of the GIN API, but in all other places, it wasn't really
doing much of anything anyway.
[0]:
https://www.postgresql.org/message-id/CA%2BhUKG%2BNFKnr%3DK4oybwDvT35dW%3DVAjAAfiuLxp%2B5JeZSOV3nBg%40mail.gmail.comFrom d4c4d36810bbfb87d2e20d527c34025ea873de12 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 1/6] Remove useless casts to Pointer
---
contrib/bloom/blutils.c | 2 +-
contrib/bloom/blvacuum.c | 2 +-
src/backend/access/gin/ginxlog.c | 2 +-
src/backend/utils/adt/multirangetypes.c | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index 2c0e71eedc6..bf50037a71a 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -336,7 +336,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple
*tuple)
/* Copy new tuple to the end of page */
opaque = BloomPageGetOpaque(page);
itup = BloomPageGetTuple(state, page, opaque->maxoff + 1);
- memcpy((Pointer) itup, (Pointer) tuple, state->sizeOfBloomTuple);
+ memcpy(itup, tuple, state->sizeOfBloomTuple);
/* Adjust maxoff and pd_lower */
opaque->maxoff++;
diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c
index 9e5f0574fad..044fd85a32a 100644
--- a/contrib/bloom/blvacuum.c
+++ b/contrib/bloom/blvacuum.c
@@ -94,7 +94,7 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult
*stats,
{
/* No; copy it to itupPtr++, but skip copy if
not needed */
if (itupPtr != itup)
- memmove((Pointer) itupPtr, (Pointer)
itup,
+ memmove(itupPtr, itup,
state.sizeOfBloomTuple);
itupPtr = BloomPageGetNextTuple(&state,
itupPtr);
}
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 75df3d7a680..606741fa396 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -212,7 +212,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
if (tailCopy)
{
Assert(writePtr + segsize <
PageGetSpecialPointer(page));
- memcpy(writePtr, (Pointer) oldseg, segsize);
+ memcpy(writePtr, oldseg, segsize);
}
writePtr += segsize;
oldseg = GinNextPostingListSegment(oldseg);
diff --git a/src/backend/utils/adt/multirangetypes.c
b/src/backend/utils/adt/multirangetypes.c
index 5273b97f7fe..55e0b4fdc31 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -629,7 +629,7 @@ write_multirange_data(MultirangeType *multirange,
TypeCacheEntry *rangetyp,
}
flags[i] = *((Pointer) ranges[i] + VARSIZE(ranges[i]) -
sizeof(char));
len = VARSIZE(ranges[i]) - sizeof(RangeType) - sizeof(char);
- memcpy(ptr, (Pointer) (ranges[i] + 1), len);
+ memcpy(ptr, ranges[i] + 1, len);
ptr += att_align_nominal(len, elemalign);
}
}
--
2.52.0
From b58263c3df6dc2eb918bde92eb04f7fd5d2a061b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 2/6] Use better DatumGet* function
Use DatumGetCString() instead of DatumGetPointer() for returning a C
string. Right now, they are the same, but that doesn't always have to
be so.
---
src/test/modules/test_resowner/test_resowner_basic.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/test/modules/test_resowner/test_resowner_basic.c
b/src/test/modules/test_resowner/test_resowner_basic.c
index 8f794996371..b84ec2cb299 100644
--- a/src/test/modules/test_resowner/test_resowner_basic.c
+++ b/src/test/modules/test_resowner/test_resowner_basic.c
@@ -35,13 +35,13 @@ static const ResourceOwnerDesc string_desc = {
static void
ReleaseString(Datum res)
{
- elog(NOTICE, "releasing string: %s", DatumGetPointer(res));
+ elog(NOTICE, "releasing string: %s", DatumGetCString(res));
}
static char *
PrintString(Datum res)
{
- return psprintf("test string \"%s\"", DatumGetPointer(res));
+ return psprintf("test string \"%s\"", DatumGetCString(res));
}
/* demonstrates phases and priorities between a parent and child context */
--
2.52.0
From 08e6993de9f0ab2b75f023789905770b08b0f03b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 3/6] Don't rely on pointer arithmetic with Pointer type
Use char * explicitly where this is needed.
---
contrib/bloom/bloom.h | 2 +-
contrib/bloom/blutils.c | 4 +--
contrib/bloom/blvacuum.c | 2 +-
src/backend/access/gin/gindatapage.c | 18 ++++++-------
src/backend/access/gin/ginxlog.c | 20 +++++++-------
src/backend/access/rmgrdesc/genericdesc.c | 4 +--
src/backend/utils/adt/multirangetypes.c | 32 +++++++++++------------
src/backend/utils/adt/rangetypes.c | 16 ++++++------
8 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h
index 648167045f4..b2966d37077 100644
--- a/contrib/bloom/bloom.h
+++ b/contrib/bloom/bloom.h
@@ -72,7 +72,7 @@ typedef BloomPageOpaqueData *BloomPageOpaque;
((BloomTuple *)(PageGetContents(page) \
+ (state)->sizeOfBloomTuple * ((offset) - 1)))
#define BloomPageGetNextTuple(state, tuple) \
- ((BloomTuple *)((Pointer)(tuple) + (state)->sizeOfBloomTuple))
+ ((BloomTuple *)((char *)(tuple) + (state)->sizeOfBloomTuple))
/* Preserved page numbers */
#define BLOOM_METAPAGE_BLKNO (0)
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index bf50037a71a..bbeefc3a75b 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -324,7 +324,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple
*tuple)
{
BloomTuple *itup;
BloomPageOpaque opaque;
- Pointer ptr;
+ char *ptr;
/* We shouldn't be pointed to an invalid page */
Assert(!PageIsNew(page) && !BloomPageIsDeleted(page));
@@ -340,7 +340,7 @@ BloomPageAddItem(BloomState *state, Page page, BloomTuple
*tuple)
/* Adjust maxoff and pd_lower */
opaque->maxoff++;
- ptr = (Pointer) BloomPageGetTuple(state, page, opaque->maxoff + 1);
+ ptr = (char *) BloomPageGetTuple(state, page, opaque->maxoff + 1);
((PageHeader) page)->pd_lower = ptr - page;
/* Assert we didn't overrun available space */
diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c
index 044fd85a32a..cc0639a3ac4 100644
--- a/contrib/bloom/blvacuum.c
+++ b/contrib/bloom/blvacuum.c
@@ -122,7 +122,7 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult
*stats,
if (BloomPageGetMaxOffset(page) == 0)
BloomPageSetDeleted(page);
/* Adjust pd_lower */
- ((PageHeader) page)->pd_lower = (Pointer) itupPtr -
page;
+ ((PageHeader) page)->pd_lower = (char *) itupPtr - page;
/* Finish WAL-logging */
GenericXLogFinish(gxlogState);
}
diff --git a/src/backend/access/gin/gindatapage.c
b/src/backend/access/gin/gindatapage.c
index 6c2c6194720..e677bdb2dcb 100644
--- a/src/backend/access/gin/gindatapage.c
+++ b/src/backend/access/gin/gindatapage.c
@@ -140,20 +140,20 @@ GinDataLeafPageGetItems(Page page, int *nitems,
ItemPointerData advancePast)
{
GinPostingList *seg = GinDataLeafPageGetPostingList(page);
Size len = GinDataLeafPageGetPostingListSize(page);
- Pointer endptr = ((Pointer) seg) + len;
+ char *endptr = ((char *) seg) + len;
GinPostingList *next;
/* Skip to the segment containing advancePast+1 */
if (ItemPointerIsValid(&advancePast))
{
next = GinNextPostingListSegment(seg);
- while ((Pointer) next < endptr &&
+ while ((char *) next < endptr &&
ginCompareItemPointers(&next->first,
&advancePast) <= 0)
{
seg = next;
next = GinNextPostingListSegment(seg);
}
- len = endptr - (Pointer) seg;
+ len = endptr - (char *) seg;
}
if (len > 0)
@@ -1371,8 +1371,8 @@ disassembleLeaf(Page page)
{
disassembledLeaf *leaf;
GinPostingList *seg;
- Pointer segbegin;
- Pointer segend;
+ char *segbegin;
+ char *segend;
leaf = palloc0(sizeof(disassembledLeaf));
dlist_init(&leaf->segments);
@@ -1383,9 +1383,9 @@ disassembleLeaf(Page page)
* Create a leafSegmentInfo entry for each segment.
*/
seg = GinDataLeafPageGetPostingList(page);
- segbegin = (Pointer) seg;
+ segbegin = (char *) seg;
segend = segbegin + GinDataLeafPageGetPostingListSize(page);
- while ((Pointer) seg < segend)
+ while ((char *) seg < segend)
{
leafSegmentInfo *seginfo =
palloc(sizeof(leafSegmentInfo));
@@ -1779,7 +1779,7 @@ createPostingTree(Relation index, ItemPointerData *items,
uint32 nitems,
Buffer buffer;
Page tmppage;
Page page;
- Pointer ptr;
+ char *ptr;
int nrootitems;
int rootsize;
bool is_build = (buildStats != NULL);
@@ -1795,7 +1795,7 @@ createPostingTree(Relation index, ItemPointerData *items,
uint32 nitems,
*/
nrootitems = 0;
rootsize = 0;
- ptr = (Pointer) GinDataLeafPageGetPostingList(tmppage);
+ ptr = (char *) GinDataLeafPageGetPostingList(tmppage);
while (nrootitems < nitems)
{
GinPostingList *segment;
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 606741fa396..34c01a01165 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -119,12 +119,12 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
int actionno;
int segno;
GinPostingList *oldseg;
- Pointer segmentend;
+ char *segmentend;
char *walbuf;
int totalsize;
- Pointer tailCopy = NULL;
- Pointer writePtr;
- Pointer segptr;
+ void *tailCopy = NULL;
+ char *writePtr;
+ char *segptr;
/*
* If the page is in pre-9.4 format, convert to new format first.
@@ -164,8 +164,8 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
}
oldseg = GinDataLeafPageGetPostingList(page);
- writePtr = (Pointer) oldseg;
- segmentend = (Pointer) oldseg + GinDataLeafPageGetPostingListSize(page);
+ writePtr = (char *) oldseg;
+ segmentend = (char *) oldseg + GinDataLeafPageGetPostingListSize(page);
segno = 0;
walbuf = ((char *) data) + sizeof(ginxlogRecompressDataLeaf);
@@ -243,7 +243,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
a_action = GIN_SEGMENT_REPLACE;
}
- segptr = (Pointer) oldseg;
+ segptr = (char *) oldseg;
if (segptr != segmentend)
segsize = SizeOfGinPostingList(oldseg);
else
@@ -264,7 +264,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
{
int tailSize = segmentend - segptr;
- tailCopy = (Pointer) palloc(tailSize);
+ tailCopy = palloc(tailSize);
memcpy(tailCopy, segptr, tailSize);
segptr = tailCopy;
oldseg = (GinPostingList *) segptr;
@@ -301,7 +301,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
}
/* Copy the rest of unmodified segments if any. */
- segptr = (Pointer) oldseg;
+ segptr = (char *) oldseg;
if (segptr != segmentend && tailCopy)
{
int restSize = segmentend - segptr;
@@ -311,7 +311,7 @@ ginRedoRecompress(Page page, ginxlogRecompressDataLeaf
*data)
writePtr += restSize;
}
- totalsize = writePtr - (Pointer) GinDataLeafPageGetPostingList(page);
+ totalsize = writePtr - (char *) GinDataLeafPageGetPostingList(page);
GinDataPageSetDataSize(page, totalsize);
}
diff --git a/src/backend/access/rmgrdesc/genericdesc.c
b/src/backend/access/rmgrdesc/genericdesc.c
index 75dc4108b9a..29a4c9e894b 100644
--- a/src/backend/access/rmgrdesc/genericdesc.c
+++ b/src/backend/access/rmgrdesc/genericdesc.c
@@ -23,8 +23,8 @@
void
generic_desc(StringInfo buf, XLogReaderState *record)
{
- Pointer ptr = XLogRecGetData(record),
- end = ptr + XLogRecGetDataLen(record);
+ const char *ptr = XLogRecGetData(record);
+ const char *end = ptr + XLogRecGetDataLen(record);
while (ptr < end)
{
diff --git a/src/backend/utils/adt/multirangetypes.c
b/src/backend/utils/adt/multirangetypes.c
index 55e0b4fdc31..e259644c6ca 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -68,11 +68,11 @@ typedef enum
* Macros for accessing past MultirangeType parts of multirange: items, flags
* and boundaries.
*/
-#define MultirangeGetItemsPtr(mr) ((uint32 *) ((Pointer) (mr) + \
+#define MultirangeGetItemsPtr(mr) ((uint32 *) ((char *) (mr) + \
sizeof(MultirangeType)))
-#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((Pointer) (mr) + \
+#define MultirangeGetFlagsPtr(mr) ((uint8 *) ((char *) (mr) + \
sizeof(MultirangeType) + ((mr)->rangeCount - 1) * sizeof(uint32)))
-#define MultirangeGetBoundariesPtr(mr, align) ((Pointer) (mr) + \
+#define MultirangeGetBoundariesPtr(mr, align) ((char *) (mr) + \
att_align_nominal(sizeof(MultirangeType) + \
((mr)->rangeCount - 1) * sizeof(uint32) + \
(mr)->rangeCount * sizeof(uint8), (align)))
@@ -602,13 +602,13 @@ write_multirange_data(MultirangeType *multirange,
TypeCacheEntry *rangetyp,
uint32 prev_offset = 0;
uint8 *flags;
int32 i;
- Pointer begin,
- ptr;
+ const char *begin;
+ char *ptr;
char elemalign = rangetyp->rngelemtype->typalign;
items = MultirangeGetItemsPtr(multirange);
flags = MultirangeGetFlagsPtr(multirange);
- ptr = begin = MultirangeGetBoundariesPtr(multirange, elemalign);
+ begin = ptr = MultirangeGetBoundariesPtr(multirange, elemalign);
for (i = 0; i < range_count; i++)
{
uint32 len;
@@ -627,7 +627,7 @@ write_multirange_data(MultirangeType *multirange,
TypeCacheEntry *rangetyp,
items[i - 1] |= MULTIRANGE_ITEM_OFF_BIT;
prev_offset = ptr - begin;
}
- flags[i] = *((Pointer) ranges[i] + VARSIZE(ranges[i]) -
sizeof(char));
+ flags[i] = *((char *) ranges[i] + VARSIZE(ranges[i]) -
sizeof(char));
len = VARSIZE(ranges[i]) - sizeof(RangeType) - sizeof(char);
memcpy(ptr, ranges[i] + 1, len);
ptr += att_align_nominal(len, elemalign);
@@ -699,8 +699,8 @@ multirange_get_range(TypeCacheEntry *rangetyp,
{
uint32 offset;
uint8 flags;
- Pointer begin,
- ptr;
+ const char *begin;
+ char *ptr;
int16 typlen = rangetyp->rngelemtype->typlen;
char typalign = rangetyp->rngelemtype->typalign;
uint32 len;
@@ -710,7 +710,7 @@ multirange_get_range(TypeCacheEntry *rangetyp,
offset = multirange_get_bounds_offset(multirange, i);
flags = MultirangeGetFlagsPtr(multirange)[i];
- ptr = begin = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
+ begin = ptr = MultirangeGetBoundariesPtr(multirange, typalign) + offset;
/*
* Calculate the size of bound values. In principle, we could get
offset
@@ -719,11 +719,11 @@ multirange_get_range(TypeCacheEntry *rangetyp,
* exact size.
*/
if (RANGE_HAS_LBOUND(flags))
- ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
if (RANGE_HAS_UBOUND(flags))
{
- ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
- ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
+ ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
}
len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8);
@@ -749,7 +749,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
{
uint32 offset;
uint8 flags;
- Pointer ptr;
+ const char *ptr;
int16 typlen = rangetyp->rngelemtype->typlen;
char typalign = rangetyp->rngelemtype->typalign;
bool typbyval = rangetyp->rngelemtype->typbyval;
@@ -770,7 +770,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
{
/* att_align_pointer cannot be necessary here */
lbound = fetch_att(ptr, typbyval, typlen);
- ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
}
else
lbound = (Datum) 0;
@@ -778,7 +778,7 @@ multirange_get_bounds(TypeCacheEntry *rangetyp,
/* fetch upper bound, if any */
if (RANGE_HAS_UBOUND(flags))
{
- ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+ ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
ubound = fetch_att(ptr, typbyval, typlen);
/* no need for att_addlength_pointer */
}
diff --git a/src/backend/utils/adt/rangetypes.c
b/src/backend/utils/adt/rangetypes.c
index 065a8000cf2..b7e9f6dc0a8 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -72,8 +72,8 @@ static char *range_deparse(char flags, const char *lbound_str,
static char *range_bound_escape(const char *value);
static Size datum_compute_size(Size data_length, Datum val, bool typbyval,
char typalign, int16
typlen, char typstorage);
-static Pointer datum_write(Pointer ptr, Datum datum, bool typbyval,
- char typalign, int16 typlen,
char typstorage);
+static char *datum_write(char *ptr, Datum datum, bool typbyval,
+ char typalign, int16 typlen,
char typstorage);
static Node *find_simplified_clause(PlannerInfo *root,
Expr
*rangeExpr, Expr *elemExpr);
static Expr *build_bound_expr(Expr *elemExpr, Datum val,
@@ -2092,7 +2092,7 @@ range_deserialize(TypeCacheEntry *typcache, const
RangeType *range,
int16 typlen;
bool typbyval;
char typalign;
- Pointer ptr;
+ const char *ptr;
Datum lbound;
Datum ubound;
@@ -2108,14 +2108,14 @@ range_deserialize(TypeCacheEntry *typcache, const
RangeType *range,
typalign = typcache->rngelemtype->typalign;
/* initialize data pointer just after the range OID */
- ptr = (Pointer) (range + 1);
+ ptr = (char *) (range + 1);
/* fetch lower bound, if any */
if (RANGE_HAS_LBOUND(flags))
{
/* att_align_pointer cannot be necessary here */
lbound = fetch_att(ptr, typbyval, typlen);
- ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
+ ptr = (char *) att_addlength_pointer(ptr, typlen, ptr);
}
else
lbound = (Datum) 0;
@@ -2123,7 +2123,7 @@ range_deserialize(TypeCacheEntry *typcache, const
RangeType *range,
/* fetch upper bound, if any */
if (RANGE_HAS_UBOUND(flags))
{
- ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
+ ptr = (char *) att_align_pointer(ptr, typalign, typlen, ptr);
ubound = fetch_att(ptr, typbyval, typlen);
/* no need for att_addlength_pointer */
}
@@ -2937,8 +2937,8 @@ datum_compute_size(Size data_length, Datum val, bool
typbyval, char typalign,
* Write the given datum beginning at ptr (after advancing to correct
* alignment, if needed). Return the pointer incremented by space used.
*/
-static Pointer
-datum_write(Pointer ptr, Datum datum, bool typbyval, char typalign,
+static char *
+datum_write(char *ptr, Datum datum, bool typbyval, char typalign,
int16 typlen, char typstorage)
{
Size data_length;
--
2.52.0
From 75027ac5cbe10abc785049c7bcfddc526d5cea54 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 4/6] Change Pointer to void *
---
src/include/c.h | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/include/c.h b/src/include/c.h
index 729eb8a27de..fd9a89fe5f7 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -527,11 +527,9 @@ typedef void (*pg_funcptr_t) (void);
/*
* Pointer
* Variable holding address of any memory resident object.
- *
- * XXX Pointer arithmetic is done with this, so it can't be void *
- * under "true" ANSI compilers.
+ * (obsolescent; use void * or char *)
*/
-typedef char *Pointer;
+typedef void *Pointer;
/* Historical names for types in <stdint.h>. */
typedef int8_t int8;
--
2.52.0
From 573406a6f5deed046a88eae62becc0bae7b4b24a Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 5/6] Remove no longer needed casts to (Pointer)
---
contrib/btree_gist/btree_utils_var.h | 2 +-
src/backend/access/heap/heaptoast.c | 4 ++--
src/backend/catalog/aclchk.c | 18 +++++++++---------
src/backend/catalog/pg_constraint.c | 12 ++++++------
src/backend/utils/adt/arrayfuncs.c | 2 +-
src/backend/utils/adt/datum.c | 6 +++---
src/backend/utils/adt/like_support.c | 4 ++--
src/backend/utils/adt/numeric.c | 6 +++---
src/backend/utils/adt/rangetypes.c | 4 ++--
src/backend/utils/adt/rowtypes.c | 4 ++--
src/backend/utils/cache/evtcache.c | 2 +-
src/include/fmgr.h | 2 +-
12 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/contrib/btree_gist/btree_utils_var.h
b/contrib/btree_gist/btree_utils_var.h
index 75ad33d24fc..6cb3aadf3c3 100644
--- a/contrib/btree_gist/btree_utils_var.h
+++ b/contrib/btree_gist/btree_utils_var.h
@@ -49,7 +49,7 @@ typedef struct
*/
#define GBT_FREE_IF_COPY(ptr1, ptr2) \
do { \
- if ((Pointer) (ptr1) != DatumGetPointer(ptr2)) \
+ if ((ptr1) != DatumGetPointer(ptr2)) \
pfree(ptr1); \
} while (0)
diff --git a/src/backend/access/heap/heaptoast.c
b/src/backend/access/heap/heaptoast.c
index e148c9be482..60e765fbfce 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -569,7 +569,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
int num_to_free;
int i;
Datum new_values[MaxTupleAttributeNumber];
- Pointer freeable_values[MaxTupleAttributeNumber];
+ void *freeable_values[MaxTupleAttributeNumber];
/*
* We can pass the caller's isnull array directly to heap_form_tuple,
but
@@ -593,7 +593,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc,
{
new_value = detoast_external_attr(new_value);
new_values[i] = PointerGetDatum(new_value);
- freeable_values[num_to_free++] = (Pointer)
new_value;
+ freeable_values[num_to_free++] = new_value;
}
}
}
diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index cd139bd65a6..58d006986b8 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -3125,7 +3125,7 @@ object_aclmask_ext(Oid classid, Oid objectid, Oid roleid,
result = aclmask(acl, roleid, ownerId, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(tuple);
@@ -3255,7 +3255,7 @@ pg_attribute_aclmask_ext(Oid table_oid, AttrNumber
attnum, Oid roleid,
result = aclmask(acl, roleid, ownerId, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(attTuple);
@@ -3362,7 +3362,7 @@ pg_class_aclmask_ext(Oid table_oid, Oid roleid, AclMode
mask,
result = aclmask(acl, roleid, ownerId, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(tuple);
@@ -3454,7 +3454,7 @@ pg_parameter_aclmask(const char *name, Oid roleid,
AclMode mask, AclMaskHow how)
result = aclmask(acl, roleid, BOOTSTRAP_SUPERUSERID, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(tuple);
@@ -3509,7 +3509,7 @@ pg_parameter_acl_aclmask(Oid acl_oid, Oid roleid, AclMode
mask, AclMaskHow how)
result = aclmask(acl, roleid, BOOTSTRAP_SUPERUSERID, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(tuple);
@@ -3589,7 +3589,7 @@ pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid,
result = aclmask(acl, roleid, ownerId, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
systable_endscan(scan);
@@ -3683,7 +3683,7 @@ pg_namespace_aclmask_ext(Oid nsp_oid, Oid roleid,
result = aclmask(acl, roleid, ownerId, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(tuple);
@@ -3819,7 +3819,7 @@ pg_type_aclmask_ext(Oid type_oid, Oid roleid, AclMode
mask, AclMaskHow how,
result = aclmask(acl, roleid, ownerId, mask, how);
/* if we have a detoasted copy, free it */
- if (acl && (Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl && acl != DatumGetPointer(aclDatum))
pfree(acl);
ReleaseSysCache(tuple);
@@ -4003,7 +4003,7 @@ pg_attribute_aclcheck_all_ext(Oid table_oid, Oid roleid,
attmask = aclmask(acl, roleid, ownerId, mode,
ACLMASK_ANY);
/* if we have a detoasted copy, free it */
- if ((Pointer) acl != DatumGetPointer(aclDatum))
+ if (acl != DatumGetPointer(aclDatum))
pfree(acl);
}
diff --git a/src/backend/catalog/pg_constraint.c
b/src/backend/catalog/pg_constraint.c
index 9944e4bd2d1..5b2a8132306 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -1544,7 +1544,7 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
if (numkeys <= 0 || numkeys > INDEX_MAX_KEYS)
elog(ERROR, "foreign key constraint cannot have %d columns",
numkeys);
memcpy(conkey, ARR_DATA_PTR(arr), numkeys * sizeof(int16));
- if ((Pointer) arr != DatumGetPointer(adatum))
+ if (arr != DatumGetPointer(adatum))
pfree(arr); /* free de-toasted
copy, if any */
adatum = SysCacheGetAttrNotNull(CONSTROID, tuple,
@@ -1556,7 +1556,7 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
ARR_ELEMTYPE(arr) != INT2OID)
elog(ERROR, "confkey is not a 1-D smallint array");
memcpy(confkey, ARR_DATA_PTR(arr), numkeys * sizeof(int16));
- if ((Pointer) arr != DatumGetPointer(adatum))
+ if (arr != DatumGetPointer(adatum))
pfree(arr); /* free de-toasted
copy, if any */
if (pf_eq_oprs)
@@ -1571,7 +1571,7 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
ARR_ELEMTYPE(arr) != OIDOID)
elog(ERROR, "conpfeqop is not a 1-D Oid array");
memcpy(pf_eq_oprs, ARR_DATA_PTR(arr), numkeys * sizeof(Oid));
- if ((Pointer) arr != DatumGetPointer(adatum))
+ if (arr != DatumGetPointer(adatum))
pfree(arr); /* free de-toasted
copy, if any */
}
@@ -1586,7 +1586,7 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
ARR_ELEMTYPE(arr) != OIDOID)
elog(ERROR, "conppeqop is not a 1-D Oid array");
memcpy(pp_eq_oprs, ARR_DATA_PTR(arr), numkeys * sizeof(Oid));
- if ((Pointer) arr != DatumGetPointer(adatum))
+ if (arr != DatumGetPointer(adatum))
pfree(arr); /* free de-toasted
copy, if any */
}
@@ -1601,7 +1601,7 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
ARR_ELEMTYPE(arr) != OIDOID)
elog(ERROR, "conffeqop is not a 1-D Oid array");
memcpy(ff_eq_oprs, ARR_DATA_PTR(arr), numkeys * sizeof(Oid));
- if ((Pointer) arr != DatumGetPointer(adatum))
+ if (arr != DatumGetPointer(adatum))
pfree(arr); /* free de-toasted
copy, if any */
}
@@ -1624,7 +1624,7 @@ DeconstructFkConstraintRow(HeapTuple tuple, int *numfks,
elog(ERROR, "confdelsetcols is not a 1-D
smallint array");
num_delete_cols = ARR_DIMS(arr)[0];
memcpy(fk_del_set_cols, ARR_DATA_PTR(arr),
num_delete_cols * sizeof(int16));
- if ((Pointer) arr != DatumGetPointer(adatum))
+ if (arr != DatumGetPointer(adatum))
pfree(arr); /* free de-toasted
copy, if any */
*num_fk_del_set_cols = num_delete_cols;
diff --git a/src/backend/utils/adt/arrayfuncs.c
b/src/backend/utils/adt/arrayfuncs.c
index a464349ee33..6dc65d3d4cb 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -5687,7 +5687,7 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
MemoryContextSwitchTo(oldcontext);
/* Release detoasted copy if any */
- if ((Pointer) arg != DatumGetPointer(dvalue))
+ if (arg != DatumGetPointer(dvalue))
pfree(arg);
return astate;
diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c
index c2b111b829e..dabcca6f4c5 100644
--- a/src/backend/utils/adt/datum.c
+++ b/src/backend/utils/adt/datum.c
@@ -299,9 +299,9 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal,
int typLen)
len1 - VARHDRSZ) == 0);
/* Only free memory if it's a copy made here. */
- if ((Pointer) arg1val != DatumGetPointer(value1))
+ if (arg1val != DatumGetPointer(value1))
pfree(arg1val);
- if ((Pointer) arg2val != DatumGetPointer(value2))
+ if (arg2val != DatumGetPointer(value2))
pfree(arg2val);
}
}
@@ -355,7 +355,7 @@ datum_image_hash(Datum value, bool typByVal, int typLen)
result = hash_bytes((unsigned char *) VARDATA_ANY(val), len -
VARHDRSZ);
/* Only free memory if it's a copy made here. */
- if ((Pointer) val != DatumGetPointer(value))
+ if (val != DatumGetPointer(value))
pfree(val);
}
else if (typLen == -2)
diff --git a/src/backend/utils/adt/like_support.c
b/src/backend/utils/adt/like_support.c
index 999f23f86d5..dca1d9be035 100644
--- a/src/backend/utils/adt/like_support.c
+++ b/src/backend/utils/adt/like_support.c
@@ -1035,7 +1035,7 @@ like_fixed_prefix(Const *patt_const, bool
case_insensitive, Oid collation,
pattlen = VARSIZE_ANY_EXHDR(bstr);
patt = (char *) palloc(pattlen);
memcpy(patt, VARDATA_ANY(bstr), pattlen);
- Assert((Pointer) bstr ==
DatumGetPointer(patt_const->constvalue));
+ Assert(bstr == DatumGetPointer(patt_const->constvalue));
}
match = palloc(pattlen + 1);
@@ -1577,7 +1577,7 @@ make_greater_string(const Const *str_const, FmgrInfo
*ltproc, Oid collation)
len = VARSIZE_ANY_EXHDR(bstr);
workstr = (char *) palloc(len);
memcpy(workstr, VARDATA_ANY(bstr), len);
- Assert((Pointer) bstr ==
DatumGetPointer(str_const->constvalue));
+ Assert(bstr == DatumGetPointer(str_const->constvalue));
cmpstr = str_const->constvalue;
}
else
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
index 2501007d981..1d626aecbe7 100644
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -2194,7 +2194,7 @@ numeric_abbrev_convert(Datum original_datum, SortSupport
ssup)
}
/* should happen only for external/compressed toasts */
- if ((Pointer) original_varatt != DatumGetPointer(original_datum))
+ if (original_varatt != DatumGetPointer(original_datum))
pfree(original_varatt);
return result;
@@ -2284,9 +2284,9 @@ numeric_fast_cmp(Datum x, Datum y, SortSupport ssup)
result = cmp_numerics(nx, ny);
- if ((Pointer) nx != DatumGetPointer(x))
+ if (nx != DatumGetPointer(x))
pfree(nx);
- if ((Pointer) ny != DatumGetPointer(y))
+ if (ny != DatumGetPointer(y))
pfree(ny);
return result;
diff --git a/src/backend/utils/adt/rangetypes.c
b/src/backend/utils/adt/rangetypes.c
index b7e9f6dc0a8..d8e5130d642 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -1513,9 +1513,9 @@ range_fast_cmp(Datum a, Datum b, SortSupport ssup)
cmp = range_cmp_bounds(typcache, &upper1, &upper2);
}
- if ((Pointer) range_a != DatumGetPointer(a))
+ if (range_a != DatumGetPointer(a))
pfree(range_a);
- if ((Pointer) range_b != DatumGetPointer(b))
+ if (range_b != DatumGetPointer(b))
pfree(range_b);
return cmp;
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index 9e5449f17d7..38e6fe1c43a 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -1529,9 +1529,9 @@ record_image_cmp(FunctionCallInfo fcinfo)
if ((cmpresult == 0) && (len1 != len2))
cmpresult = (len1 < len2) ? -1 : 1;
- if ((Pointer) arg1val !=
DatumGetPointer(values1[i1]))
+ if (arg1val != DatumGetPointer(values1[i1]))
pfree(arg1val);
- if ((Pointer) arg2val !=
DatumGetPointer(values2[i2]))
+ if (arg2val != DatumGetPointer(values2[i2]))
pfree(arg2val);
}
else
diff --git a/src/backend/utils/cache/evtcache.c
b/src/backend/utils/cache/evtcache.c
index b9d5a5998be..76ba2db5390 100644
--- a/src/backend/utils/cache/evtcache.c
+++ b/src/backend/utils/cache/evtcache.c
@@ -240,7 +240,7 @@ DecodeTextArrayToBitmapset(Datum array)
}
pfree(elems);
- if ((Pointer) arr != DatumGetPointer(array))
+ if (arr != DatumGetPointer(array))
pfree(arr);
return bms;
diff --git a/src/include/fmgr.h b/src/include/fmgr.h
index 74fe3ea0575..c0dbe85ed1c 100644
--- a/src/include/fmgr.h
+++ b/src/include/fmgr.h
@@ -259,7 +259,7 @@ extern struct varlena *pg_detoast_datum_packed(struct
varlena *datum);
*/
#define PG_FREE_IF_COPY(ptr,n) \
do { \
- if ((Pointer) (ptr) != PG_GETARG_POINTER(n)) \
+ if ((ptr) != PG_GETARG_POINTER(n)) \
pfree(ptr); \
} while (0)
--
2.52.0
From 467201808f4537291513c2151ff3266723b64314 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 24 Nov 2025 11:02:35 +0100
Subject: [PATCH 6/6] Remove some uses of the Pointer type
everywhere except GIN
---
contrib/amcheck/verify_heapam.c | 2 +-
src/backend/access/common/heaptuple.c | 2 +-
src/backend/access/common/toast_internals.c | 2 +-
src/backend/access/heap/heaptoast.c | 2 +-
src/backend/nodes/tidbitmap.c | 4 ++--
src/backend/replication/logical/reorderbuffer.c | 4 ++--
src/backend/utils/adt/rangetypes.c | 6 +++---
src/bin/initdb/initdb.c | 4 ++--
src/include/postgres.h | 4 ++--
9 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c
index 4963e9245cb..aa9974a867b 100644
--- a/contrib/amcheck/verify_heapam.c
+++ b/contrib/amcheck/verify_heapam.c
@@ -1557,7 +1557,7 @@ check_toast_tuple(HeapTuple toasttup, HeapCheckContext
*ctx,
{
int32 chunk_seq;
int32 last_chunk_seq = (extsize - 1) / TOAST_MAX_CHUNK_SIZE;
- Pointer chunk;
+ void *chunk;
bool isnull;
int32 chunksize;
int32 expected_size;
diff --git a/src/backend/access/common/heaptuple.c
b/src/backend/access/common/heaptuple.c
index 74a52d87067..36b09ea5bff 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -321,7 +321,7 @@ fill_val(CompactAttribute *att,
else if (att->attlen == -1)
{
/* varlena */
- Pointer val = DatumGetPointer(datum);
+ void *val = DatumGetPointer(datum);
*infomask |= HEAP_HASVARWIDTH;
if (VARATT_IS_EXTERNAL(val))
diff --git a/src/backend/access/common/toast_internals.c
b/src/backend/access/common/toast_internals.c
index 63b848473f8..ba6ef6f4e72 100644
--- a/src/backend/access/common/toast_internals.c
+++ b/src/backend/access/common/toast_internals.c
@@ -128,7 +128,7 @@ toast_save_datum(Relation rel, Datum value,
int32 chunk_seq = 0;
char *data_p;
int32 data_todo;
- Pointer dval = DatumGetPointer(value);
+ void *dval = DatumGetPointer(value);
int num_indexes;
int validIndex;
diff --git a/src/backend/access/heap/heaptoast.c
b/src/backend/access/heap/heaptoast.c
index 60e765fbfce..a049d7c7e81 100644
--- a/src/backend/access/heap/heaptoast.c
+++ b/src/backend/access/heap/heaptoast.c
@@ -696,7 +696,7 @@ heap_fetch_toast_slice(Relation toastrel, Oid valueid,
int32 attrsize,
while ((ttup = systable_getnext_ordered(toastscan,
ForwardScanDirection)) != NULL)
{
int32 curchunk;
- Pointer chunk;
+ void *chunk;
bool isnull;
char *chunkdata;
int32 chunksize;
diff --git a/src/backend/nodes/tidbitmap.c b/src/backend/nodes/tidbitmap.c
index 23d97b3a6c8..425c1177b22 100644
--- a/src/backend/nodes/tidbitmap.c
+++ b/src/backend/nodes/tidbitmap.c
@@ -1550,11 +1550,11 @@ tbm_calculate_entries(Size maxbytes)
/*
* Estimate number of hashtable entries we can have within maxbytes.
This
* estimates the hash cost as sizeof(PagetableEntry), which is good
enough
- * for our purpose. Also count an extra Pointer per entry for the
arrays
+ * for our purpose. Also count an extra pointer per entry for the
arrays
* created during iteration readout.
*/
nbuckets = maxbytes /
- (sizeof(PagetableEntry) + sizeof(Pointer) + sizeof(Pointer));
+ (sizeof(PagetableEntry) + sizeof(void *) + sizeof(void *));
nbuckets = Min(nbuckets, INT_MAX - 1); /* safety limit */
nbuckets = Max(nbuckets, 16); /* sanity limit */
diff --git a/src/backend/replication/logical/reorderbuffer.c
b/src/backend/replication/logical/reorderbuffer.c
index eb6a84554b7..a014ef72aca 100644
--- a/src/backend/replication/logical/reorderbuffer.c
+++ b/src/backend/replication/logical/reorderbuffer.c
@@ -5003,7 +5003,7 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb,
ReorderBufferTXN *txn,
bool found;
int32 chunksize;
bool isnull;
- Pointer chunk;
+ void *chunk;
TupleDesc desc = RelationGetDescr(relation);
Oid chunk_id;
int32 chunk_seq;
@@ -5192,7 +5192,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb,
ReorderBufferTXN *txn,
bool cisnull;
ReorderBufferChange *cchange;
HeapTuple ctup;
- Pointer chunk;
+ void *chunk;
cchange = dlist_container(ReorderBufferChange, node,
it.cur);
ctup = cchange->data.tp.newtuple;
diff --git a/src/backend/utils/adt/rangetypes.c
b/src/backend/utils/adt/rangetypes.c
index d8e5130d642..b887f21f10e 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -1962,7 +1962,7 @@ range_serialize(TypeCacheEntry *typcache, RangeBound
*lower, RangeBound *upper,
RangeType *range;
int cmp;
Size msize;
- Pointer ptr;
+ char *ptr;
int16 typlen;
bool typbyval;
char typalign;
@@ -2070,7 +2070,7 @@ range_serialize(TypeCacheEntry *typcache, RangeBound
*lower, RangeBound *upper,
typstorage);
}
- *((char *) ptr) = flags;
+ *ptr = flags;
return range;
}
@@ -2953,7 +2953,7 @@ datum_write(char *ptr, Datum datum, bool typbyval, char
typalign,
else if (typlen == -1)
{
/* varlena */
- Pointer val = DatumGetPointer(datum);
+ void *val = DatumGetPointer(datum);
if (VARATT_IS_EXTERNAL(val))
{
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 92fe2f531f7..30fce0d5f37 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -1574,11 +1574,11 @@ bootstrap_template1(void)
sprintf(buf, "%d", NAMEDATALEN);
bki_lines = replace_token(bki_lines, "NAMEDATALEN", buf);
- sprintf(buf, "%d", (int) sizeof(Pointer));
+ sprintf(buf, "%d", (int) sizeof(void *));
bki_lines = replace_token(bki_lines, "SIZEOF_POINTER", buf);
bki_lines = replace_token(bki_lines, "ALIGNOF_POINTER",
- (sizeof(Pointer) ==
4) ? "i" : "d");
+ (sizeof(void *) == 4)
? "i" : "d");
bki_lines = replace_token(bki_lines, "POSTGRES",
escape_quotes_bki(username));
diff --git a/src/include/postgres.h b/src/include/postgres.h
index 357cbd6fd96..5f1c6b0a79e 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -318,10 +318,10 @@ CommandIdGetDatum(CommandId X)
* DatumGetPointer
* Returns pointer value of a datum.
*/
-static inline Pointer
+static inline void *
DatumGetPointer(Datum X)
{
- return (Pointer) (uintptr_t) X;
+ return (void *) (uintptr_t) X;
}
/*
--
2.52.0