123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /*
- * brin_page.h
- * Prototypes and definitions for BRIN page layouts
- *
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * IDENTIFICATION
- * src/include/access/brin_page.h
- *
- * NOTES
- *
- * These structs should really be private to specific BRIN files, but it's
- * useful to have them here so that they can be used by pageinspect and similar
- * tools.
- */
- #ifndef BRIN_PAGE_H
- #define BRIN_PAGE_H
- #include "storage/block.h"
- #include "storage/itemptr.h"
- /*
- * Special area of BRIN pages.
- *
- * We define it in this odd way so that it always occupies the last
- * MAXALIGN-sized element of each page.
- */
- typedef struct BrinSpecialSpace
- {
- uint16 vector[MAXALIGN(1) / sizeof(uint16)];
- } BrinSpecialSpace;
- /*
- * Make the page type be the last half-word in the page, for consumption by
- * pg_filedump and similar utilities. We don't really care much about the
- * position of the "flags" half-word, but it's simpler to apply a consistent
- * rule to both.
- *
- * See comments above GinPageOpaqueData.
- */
- #define BrinPageType(page) \
- (((BrinSpecialSpace *) \
- PageGetSpecialPointer(page))->vector[MAXALIGN(1) / sizeof(uint16) - 1])
- #define BrinPageFlags(page) \
- (((BrinSpecialSpace *) \
- PageGetSpecialPointer(page))->vector[MAXALIGN(1) / sizeof(uint16) - 2])
- /* special space on all BRIN pages stores a "type" identifier */
- #define BRIN_PAGETYPE_META 0xF091
- #define BRIN_PAGETYPE_REVMAP 0xF092
- #define BRIN_PAGETYPE_REGULAR 0xF093
- #define BRIN_IS_META_PAGE(page) (BrinPageType(page) == BRIN_PAGETYPE_META)
- #define BRIN_IS_REVMAP_PAGE(page) (BrinPageType(page) == BRIN_PAGETYPE_REVMAP)
- #define BRIN_IS_REGULAR_PAGE(page) (BrinPageType(page) == BRIN_PAGETYPE_REGULAR)
- /* flags for BrinSpecialSpace */
- #define BRIN_EVACUATE_PAGE (1 << 0)
- /* Metapage definitions */
- typedef struct BrinMetaPageData
- {
- uint32 brinMagic;
- uint32 brinVersion;
- BlockNumber pagesPerRange;
- BlockNumber lastRevmapPage;
- } BrinMetaPageData;
- #define BRIN_CURRENT_VERSION 1
- #define BRIN_META_MAGIC 0xA8109CFA
- #define BRIN_METAPAGE_BLKNO 0
- /* Definitions for revmap pages */
- typedef struct RevmapContents
- {
- /*
- * This array will fill all available space on the page. It should be
- * declared [FLEXIBLE_ARRAY_MEMBER], but for some reason you can't do that
- * in an otherwise-empty struct.
- */
- ItemPointerData rm_tids[1];
- } RevmapContents;
- #define REVMAP_CONTENT_SIZE \
- (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) - \
- offsetof(RevmapContents, rm_tids) - \
- MAXALIGN(sizeof(BrinSpecialSpace)))
- /* max num of items in the array */
- #define REVMAP_PAGE_MAXITEMS \
- (REVMAP_CONTENT_SIZE / sizeof(ItemPointerData))
- #endif /* BRIN_PAGE_H */
|