diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index 2ce3be765c0..bdf7b0d3c58 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -297,15 +297,32 @@ typedef PageHeaderData *PageHeader; #define PageGetSpecialSize(page) \ ((uint16) (PageGetPageSize(page) - ((PageHeader)(page))->pd_special)) +/* + * Using assertions, validate that the page special pointer is OK. + * + * This is intended to catch use of the pointer before page initialization. + * It is implemented as a function do to the limitations of the MSVC compiler, + * which choked on doing all these tests within another macro. We return true + * so that MacroAssert() can be used while still getting the specifics from + * the macro failure within this function. + */ +static inline bool +PageValidateSpecialPointer(Page page) +{ + Assert(PageIsValid(page)); + Assert(((PageHeader) (page))->pd_special <= BLCKSZ); + Assert(((PageHeader) (page))->pd_special >= SizeOfPageHeaderData); + + return true; +} + /* * PageGetSpecialPointer * Returns pointer to special space on a page. */ #define PageGetSpecialPointer(page) \ ( \ - AssertMacro(PageIsValid(page)), \ - AssertMacro(((PageHeader) (page))->pd_special <= BLCKSZ), \ - AssertMacro(((PageHeader) (page))->pd_special >= SizeOfPageHeaderData), \ + AssertMacro(PageValidateSpecialPointer(page)), \ (char *) ((char *) (page) + ((PageHeader) (page))->pd_special) \ )