some Page/PageData const stuff

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2024-12-09T15:44:14Z
Lists: pgsql-hackers

Attachments

In [0] I wrote:

"""
I was fiddling a bit with making some Page-related APIs const-proof, 
which might involve changing something like "Page p" to "const PageData 
*p", but I was surprised that a type PageData exists but it's an 
unrelated type local to generic_xlog.c.

This patch renames that type to a more specific name 
[GenericXLogPageData].  This makes room for possibly adding another 
PageData type with the earlier meaning, but that's not done here.

"""

[0]: 
https://www.postgresql.org/message-id/flat/001d457e-c118-4219-8132-e1846c2ae3c9%40eisentraut.org

This is now the follow-up that adds back PageData with the earlier 
meaning and updates a few of the Page-related APIs to be const-proof. 
That is all pretty straightforward, except one inline function that had 
to be changed back to 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.  (We might be able to do that kind of thing 
better with C23 in N years. ;-) )

Just a thought, I've been thinking it might be neat if PageData were 
actually defined something like this:

typedef struct PageData
{
     union
     {
         PageHeaderData phdr;
         PGAlignedBlock data;
     };
} PageData;

Then you could write all those (PageHeader) casts in a more elegant way, 
and you don't get to randomly mix char * and Page, which has very weak 
type safety.  But this currently totally breaks, because many places 
assume you can do char-based pointer arithmetic with Page values.  So 
this would need further analysis.

Commits

  1. Remove bogus const qualifier on PageGetItem() argument

  2. Add some more use of Page/PageData rather than char *

  3. Add const qualifiers to bufpage.h

  4. Add PageData C type