1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-27 00:12:01 +03:00

Add const qualifiers to bufpage.h

This makes use of the new PageData type.

PageGetSpecialPointer() had to be turned back into a macro, because it
is used in a way that sometimes it takes const and returns const and
sometimes takes non-const and returns non-const.

Discussion: https://www.postgresql.org/message-id/flat/692ee0da-49da-4d32-8dca-da224cc2800e@eisentraut.org
This commit is contained in:
Peter Eisentraut
2025-01-20 10:53:47 +01:00
parent 6e4df237fb
commit 4f4a1d853a
2 changed files with 53 additions and 54 deletions

View File

@@ -85,9 +85,9 @@ PageInit(Page page, Size pageSize, Size specialSize)
* to pgstat. * to pgstat.
*/ */
bool bool
PageIsVerifiedExtended(Page page, BlockNumber blkno, int flags) PageIsVerifiedExtended(const PageData *page, BlockNumber blkno, int flags)
{ {
PageHeader p = (PageHeader) page; const PageHeaderData *p = (const PageHeaderData *) page;
size_t *pagebytes; size_t *pagebytes;
bool checksum_failure = false; bool checksum_failure = false;
bool header_sane = false; bool header_sane = false;
@@ -351,7 +351,7 @@ PageAddItemExtended(Page page,
* The returned page is not initialized at all; caller must do that. * The returned page is not initialized at all; caller must do that.
*/ */
Page Page
PageGetTempPage(Page page) PageGetTempPage(const PageData *page)
{ {
Size pageSize; Size pageSize;
Page temp; Page temp;
@@ -368,7 +368,7 @@ PageGetTempPage(Page page)
* The page is initialized by copying the contents of the given page. * The page is initialized by copying the contents of the given page.
*/ */
Page Page
PageGetTempPageCopy(Page page) PageGetTempPageCopy(const PageData *page)
{ {
Size pageSize; Size pageSize;
Page temp; Page temp;
@@ -388,7 +388,7 @@ PageGetTempPageCopy(Page page)
* given page, and the special space is copied from the given page. * given page, and the special space is copied from the given page.
*/ */
Page Page
PageGetTempPageCopySpecial(Page page) PageGetTempPageCopySpecial(const PageData *page)
{ {
Size pageSize; Size pageSize;
Page temp; Page temp;
@@ -893,16 +893,16 @@ PageTruncateLinePointerArray(Page page)
* PageGetHeapFreeSpace on heap pages. * PageGetHeapFreeSpace on heap pages.
*/ */
Size Size
PageGetFreeSpace(Page page) PageGetFreeSpace(const PageData *page)
{ {
const PageHeaderData *phdr = (const PageHeaderData *) page;
int space; int space;
/* /*
* Use signed arithmetic here so that we behave sensibly if pd_lower > * Use signed arithmetic here so that we behave sensibly if pd_lower >
* pd_upper. * pd_upper.
*/ */
space = (int) ((PageHeader) page)->pd_upper - space = (int) phdr->pd_upper - (int) phdr->pd_lower;
(int) ((PageHeader) page)->pd_lower;
if (space < (int) sizeof(ItemIdData)) if (space < (int) sizeof(ItemIdData))
return 0; return 0;
@@ -920,16 +920,16 @@ PageGetFreeSpace(Page page)
* PageGetHeapFreeSpace on heap pages. * PageGetHeapFreeSpace on heap pages.
*/ */
Size Size
PageGetFreeSpaceForMultipleTuples(Page page, int ntups) PageGetFreeSpaceForMultipleTuples(const PageData *page, int ntups)
{ {
const PageHeaderData *phdr = (const PageHeaderData *) page;
int space; int space;
/* /*
* Use signed arithmetic here so that we behave sensibly if pd_lower > * Use signed arithmetic here so that we behave sensibly if pd_lower >
* pd_upper. * pd_upper.
*/ */
space = (int) ((PageHeader) page)->pd_upper - space = (int) phdr->pd_upper - (int) phdr->pd_lower;
(int) ((PageHeader) page)->pd_lower;
if (space < (int) (ntups * sizeof(ItemIdData))) if (space < (int) (ntups * sizeof(ItemIdData)))
return 0; return 0;
@@ -944,16 +944,16 @@ PageGetFreeSpaceForMultipleTuples(Page page, int ntups)
* without any consideration for adding/removing line pointers. * without any consideration for adding/removing line pointers.
*/ */
Size Size
PageGetExactFreeSpace(Page page) PageGetExactFreeSpace(const PageData *page)
{ {
const PageHeaderData *phdr = (const PageHeaderData *) page;
int space; int space;
/* /*
* Use signed arithmetic here so that we behave sensibly if pd_lower > * Use signed arithmetic here so that we behave sensibly if pd_lower >
* pd_upper. * pd_upper.
*/ */
space = (int) ((PageHeader) page)->pd_upper - space = (int) phdr->pd_upper - (int) phdr->pd_lower;
(int) ((PageHeader) page)->pd_lower;
if (space < 0) if (space < 0)
return 0; return 0;
@@ -977,7 +977,7 @@ PageGetExactFreeSpace(Page page)
* on the number of line pointers, we make this extra check.) * on the number of line pointers, we make this extra check.)
*/ */
Size Size
PageGetHeapFreeSpace(Page page) PageGetHeapFreeSpace(const PageData *page)
{ {
Size space; Size space;
@@ -1001,7 +1001,7 @@ PageGetHeapFreeSpace(Page page)
*/ */
for (offnum = FirstOffsetNumber; offnum <= nline; offnum = OffsetNumberNext(offnum)) for (offnum = FirstOffsetNumber; offnum <= nline; offnum = OffsetNumberNext(offnum))
{ {
ItemId lp = PageGetItemId(page, offnum); ItemId lp = PageGetItemId(unconstify(PageData *, page), offnum);
if (!ItemIdIsUsed(lp)) if (!ItemIdIsUsed(lp))
break; break;

View File

@@ -222,9 +222,9 @@ typedef PageHeaderData *PageHeader;
* returns true iff no itemid has been allocated on the page * returns true iff no itemid has been allocated on the page
*/ */
static inline bool static inline bool
PageIsEmpty(Page page) PageIsEmpty(const PageData *page)
{ {
return ((PageHeader) page)->pd_lower <= SizeOfPageHeaderData; return ((const PageHeaderData *) page)->pd_lower <= SizeOfPageHeaderData;
} }
/* /*
@@ -232,9 +232,9 @@ PageIsEmpty(Page page)
* returns true iff page has not been initialized (by PageInit) * returns true iff page has not been initialized (by PageInit)
*/ */
static inline bool static inline bool
PageIsNew(Page page) PageIsNew(const PageData *page)
{ {
return ((PageHeader) page)->pd_upper == 0; return ((const PageHeaderData *) page)->pd_upper == 0;
} }
/* /*
@@ -275,9 +275,9 @@ PageGetContents(Page page)
* however, it can be called on a page that is not stored in a buffer. * however, it can be called on a page that is not stored in a buffer.
*/ */
static inline Size static inline Size
PageGetPageSize(Page page) PageGetPageSize(const PageData *page)
{ {
return (Size) (((PageHeader) page)->pd_pagesize_version & (uint16) 0xFF00); return (Size) (((const PageHeaderData *) page)->pd_pagesize_version & (uint16) 0xFF00);
} }
/* /*
@@ -285,9 +285,9 @@ PageGetPageSize(Page page)
* Returns the page layout version of a page. * Returns the page layout version of a page.
*/ */
static inline uint8 static inline uint8
PageGetPageLayoutVersion(Page page) PageGetPageLayoutVersion(const PageData *page)
{ {
return (((PageHeader) page)->pd_pagesize_version & 0x00FF); return (((const PageHeaderData *) page)->pd_pagesize_version & 0x00FF);
} }
/* /*
@@ -315,9 +315,9 @@ PageSetPageSizeAndVersion(Page page, Size size, uint8 version)
* Returns size of special space on a page. * Returns size of special space on a page.
*/ */
static inline uint16 static inline uint16
PageGetSpecialSize(Page page) PageGetSpecialSize(const PageData *page)
{ {
return (PageGetPageSize(page) - ((PageHeader) page)->pd_special); return (PageGetPageSize(page) - ((const PageHeaderData *) page)->pd_special);
} }
/* /*
@@ -326,23 +326,22 @@ PageGetSpecialSize(Page page)
* This is intended to catch use of the pointer before page initialization. * This is intended to catch use of the pointer before page initialization.
*/ */
static inline void static inline void
PageValidateSpecialPointer(Page page) PageValidateSpecialPointer(const PageData *page)
{ {
Assert(page); Assert(page);
Assert(((PageHeader) page)->pd_special <= BLCKSZ); Assert(((const PageHeaderData *) page)->pd_special <= BLCKSZ);
Assert(((PageHeader) page)->pd_special >= SizeOfPageHeaderData); Assert(((const PageHeaderData *) page)->pd_special >= SizeOfPageHeaderData);
} }
/* /*
* PageGetSpecialPointer * PageGetSpecialPointer
* Returns pointer to special space on a page. * Returns pointer to special space on a page.
*/ */
static inline char * #define PageGetSpecialPointer(page) \
PageGetSpecialPointer(Page page) ( \
{ PageValidateSpecialPointer(page), \
PageValidateSpecialPointer(page); ((page) + ((PageHeader) (page))->pd_special) \
return (char *) page + ((PageHeader) page)->pd_special; )
}
/* /*
* PageGetItem * PageGetItem
@@ -353,12 +352,12 @@ PageGetSpecialPointer(Page page)
* The semantics may change in the future. * The semantics may change in the future.
*/ */
static inline Item static inline Item
PageGetItem(Page page, ItemId itemId) PageGetItem(const PageData *page, const ItemIdData *itemId)
{ {
Assert(page); Assert(page);
Assert(ItemIdHasStorage(itemId)); Assert(ItemIdHasStorage(itemId));
return (Item) (((char *) page) + ItemIdGetOffset(itemId)); return (Item) (((const char *) page) + ItemIdGetOffset(itemId));
} }
/* /*
@@ -371,9 +370,9 @@ PageGetItem(Page page, ItemId itemId)
* return zero to ensure sane behavior. * return zero to ensure sane behavior.
*/ */
static inline OffsetNumber static inline OffsetNumber
PageGetMaxOffsetNumber(Page page) PageGetMaxOffsetNumber(const PageData *page)
{ {
PageHeader pageheader = (PageHeader) page; const PageHeaderData *pageheader = (const PageHeaderData *) page;
if (pageheader->pd_lower <= SizeOfPageHeaderData) if (pageheader->pd_lower <= SizeOfPageHeaderData)
return 0; return 0;
@@ -385,7 +384,7 @@ PageGetMaxOffsetNumber(Page page)
* Additional functions for access to page headers. * Additional functions for access to page headers.
*/ */
static inline XLogRecPtr static inline XLogRecPtr
PageGetLSN(const char *page) PageGetLSN(const PageData *page)
{ {
return PageXLogRecPtrGet(((const PageHeaderData *) page)->pd_lsn); return PageXLogRecPtrGet(((const PageHeaderData *) page)->pd_lsn);
} }
@@ -396,9 +395,9 @@ PageSetLSN(Page page, XLogRecPtr lsn)
} }
static inline bool static inline bool
PageHasFreeLinePointers(Page page) PageHasFreeLinePointers(const PageData *page)
{ {
return ((PageHeader) page)->pd_flags & PD_HAS_FREE_LINES; return ((const PageHeaderData *) page)->pd_flags & PD_HAS_FREE_LINES;
} }
static inline void static inline void
PageSetHasFreeLinePointers(Page page) PageSetHasFreeLinePointers(Page page)
@@ -412,9 +411,9 @@ PageClearHasFreeLinePointers(Page page)
} }
static inline bool static inline bool
PageIsFull(Page page) PageIsFull(const PageData *page)
{ {
return ((PageHeader) page)->pd_flags & PD_PAGE_FULL; return ((const PageHeaderData *) page)->pd_flags & PD_PAGE_FULL;
} }
static inline void static inline void
PageSetFull(Page page) PageSetFull(Page page)
@@ -428,9 +427,9 @@ PageClearFull(Page page)
} }
static inline bool static inline bool
PageIsAllVisible(Page page) PageIsAllVisible(const PageData *page)
{ {
return ((PageHeader) page)->pd_flags & PD_ALL_VISIBLE; return ((const PageHeaderData *) page)->pd_flags & PD_ALL_VISIBLE;
} }
static inline void static inline void
PageSetAllVisible(Page page) PageSetAllVisible(Page page)
@@ -490,19 +489,19 @@ StaticAssertDecl(BLCKSZ == ((BLCKSZ / sizeof(size_t)) * sizeof(size_t)),
"BLCKSZ has to be a multiple of sizeof(size_t)"); "BLCKSZ has to be a multiple of sizeof(size_t)");
extern void PageInit(Page page, Size pageSize, Size specialSize); extern void PageInit(Page page, Size pageSize, Size specialSize);
extern bool PageIsVerifiedExtended(Page page, BlockNumber blkno, int flags); extern bool PageIsVerifiedExtended(const PageData *page, BlockNumber blkno, int flags);
extern OffsetNumber PageAddItemExtended(Page page, Item item, Size size, extern OffsetNumber PageAddItemExtended(Page page, Item item, Size size,
OffsetNumber offsetNumber, int flags); OffsetNumber offsetNumber, int flags);
extern Page PageGetTempPage(Page page); extern Page PageGetTempPage(const PageData *page);
extern Page PageGetTempPageCopy(Page page); extern Page PageGetTempPageCopy(const PageData *page);
extern Page PageGetTempPageCopySpecial(Page page); extern Page PageGetTempPageCopySpecial(const PageData *page);
extern void PageRestoreTempPage(Page tempPage, Page oldPage); extern void PageRestoreTempPage(Page tempPage, Page oldPage);
extern void PageRepairFragmentation(Page page); extern void PageRepairFragmentation(Page page);
extern void PageTruncateLinePointerArray(Page page); extern void PageTruncateLinePointerArray(Page page);
extern Size PageGetFreeSpace(Page page); extern Size PageGetFreeSpace(const PageData *page);
extern Size PageGetFreeSpaceForMultipleTuples(Page page, int ntups); extern Size PageGetFreeSpaceForMultipleTuples(const PageData *page, int ntups);
extern Size PageGetExactFreeSpace(Page page); extern Size PageGetExactFreeSpace(const PageData *page);
extern Size PageGetHeapFreeSpace(Page page); extern Size PageGetHeapFreeSpace(const PageData *page);
extern void PageIndexTupleDelete(Page page, OffsetNumber offnum); extern void PageIndexTupleDelete(Page page, OffsetNumber offnum);
extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems); extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems);
extern void PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum); extern void PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum);