mirror of
https://github.com/postgres/postgres.git
synced 2025-10-25 13:17:41 +03:00
Set pd_lower on internal GIN posting tree pages.
This allows squeezing out the unused space in full-page writes. And more importantly, it can be a useful debugging aid. In hindsight we should've done this back when GIN was added - we wouldn't need the 'maxoff' field in the page opaque struct if we had used pd_lower and pd_upper like on normal pages. But as long as there can be pages in the index that have been binary-upgraded from pre-9.4 versions, we can't rely on that, and have to continue using 'maxoff'. Most of the code churn comes from renaming some macros, now that they're used on internal pages, too. This change is completely backwards-compatible, no effect on pg_upgrade.
This commit is contained in:
@@ -257,11 +257,6 @@ typedef signed char GinNullCategory;
|
||||
(GinPostingList *) ((PageGetContents(page) + MAXALIGN(sizeof(ItemPointerData))))
|
||||
#define GinDataLeafPageGetPostingListSize(page) \
|
||||
(((PageHeader) page)->pd_lower - MAXALIGN(SizeOfPageHeaderData) - MAXALIGN(sizeof(ItemPointerData)))
|
||||
#define GinDataLeafPageSetPostingListSize(page, size) \
|
||||
{ \
|
||||
Assert(size <= GinDataLeafMaxContentSize); \
|
||||
((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \
|
||||
}
|
||||
|
||||
#define GinDataLeafPageIsEmpty(page) \
|
||||
(GinPageIsCompressed(page) ? (GinDataLeafPageGetPostingListSize(page) == 0) : (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber))
|
||||
@@ -281,13 +276,25 @@ typedef signed char GinNullCategory;
|
||||
#define GinDataPageGetPostingItem(page, i) \
|
||||
((PostingItem *) (GinDataPageGetData(page) + ((i)-1) * sizeof(PostingItem)))
|
||||
|
||||
#define GinNonLeafDataPageGetFreeSpace(page) \
|
||||
(BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
|
||||
- MAXALIGN(sizeof(ItemPointerData)) \
|
||||
- GinPageGetOpaque(page)->maxoff * sizeof(PostingItem) \
|
||||
- MAXALIGN(sizeof(GinPageOpaqueData)))
|
||||
/*
|
||||
* Note: there is no GinDataPageGetDataSize macro, because before version
|
||||
* 9.4, we didn't set pd_lower on data pages. There can be pages in the index
|
||||
* that were binary-upgraded from earlier versions and still have an invalid
|
||||
* pd_lower, so we cannot trust it in general. Compressed posting tree leaf
|
||||
* pages are new in 9.4, however, so we can trust them; see
|
||||
* GinDataLeafPageGetPostingListSize.
|
||||
*/
|
||||
#define GinDataPageSetDataSize(page, size) \
|
||||
{ \
|
||||
Assert(size <= GinDataPageMaxDataSize); \
|
||||
((PageHeader) page)->pd_lower = (size) + MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(ItemPointerData)); \
|
||||
}
|
||||
|
||||
#define GinDataLeafMaxContentSize \
|
||||
#define GinNonLeafDataPageGetFreeSpace(page) \
|
||||
(GinDataPageMaxDataSize - \
|
||||
GinPageGetOpaque(page)->maxoff * sizeof(PostingItem))
|
||||
|
||||
#define GinDataPageMaxDataSize \
|
||||
(BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
|
||||
- MAXALIGN(sizeof(ItemPointerData)) \
|
||||
- MAXALIGN(sizeof(GinPageOpaqueData)))
|
||||
|
||||
Reference in New Issue
Block a user