PostgreSQL Source Code  git master
brin_page.h
Go to the documentation of this file.
1 /*
2  * brin_page.h
3  * Prototypes and definitions for BRIN page layouts
4  *
5  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
6  * Portions Copyright (c) 1994, Regents of the University of California
7  *
8  * IDENTIFICATION
9  * src/include/access/brin_page.h
10  *
11  * NOTES
12  *
13  * These structs should really be private to specific BRIN files, but it's
14  * useful to have them here so that they can be used by pageinspect and similar
15  * tools.
16  */
17 #ifndef BRIN_PAGE_H
18 #define BRIN_PAGE_H
19 
20 #include "storage/block.h"
21 #include "storage/itemptr.h"
22 
23 /*
24  * Special area of BRIN pages.
25  *
26  * We define it in this odd way so that it always occupies the last
27  * MAXALIGN-sized element of each page.
28  */
29 typedef struct BrinSpecialSpace
30 {
31  uint16 vector[MAXALIGN(1) / sizeof(uint16)];
33 
34 /*
35  * Make the page type be the last half-word in the page, for consumption by
36  * pg_filedump and similar utilities. We don't really care much about the
37  * position of the "flags" half-word, but it's simpler to apply a consistent
38  * rule to both.
39  *
40  * See comments above GinPageOpaqueData.
41  */
42 #define BrinPageType(page) \
43  (((BrinSpecialSpace *) \
44  PageGetSpecialPointer(page))->vector[MAXALIGN(1) / sizeof(uint16) - 1])
45 
46 #define BrinPageFlags(page) \
47  (((BrinSpecialSpace *) \
48  PageGetSpecialPointer(page))->vector[MAXALIGN(1) / sizeof(uint16) - 2])
49 
50 /* special space on all BRIN pages stores a "type" identifier */
51 #define BRIN_PAGETYPE_META 0xF091
52 #define BRIN_PAGETYPE_REVMAP 0xF092
53 #define BRIN_PAGETYPE_REGULAR 0xF093
54 
55 #define BRIN_IS_META_PAGE(page) (BrinPageType(page) == BRIN_PAGETYPE_META)
56 #define BRIN_IS_REVMAP_PAGE(page) (BrinPageType(page) == BRIN_PAGETYPE_REVMAP)
57 #define BRIN_IS_REGULAR_PAGE(page) (BrinPageType(page) == BRIN_PAGETYPE_REGULAR)
58 
59 /* flags for BrinSpecialSpace */
60 #define BRIN_EVACUATE_PAGE (1 << 0)
61 
62 
63 /* Metapage definitions */
64 typedef struct BrinMetaPageData
65 {
71 
72 #define BRIN_CURRENT_VERSION 1
73 #define BRIN_META_MAGIC 0xA8109CFA
74 
75 #define BRIN_METAPAGE_BLKNO 0
76 
77 /* Definitions for revmap pages */
78 typedef struct RevmapContents
79 {
80  /*
81  * This array will fill all available space on the page. It should be
82  * declared [FLEXIBLE_ARRAY_MEMBER], but for some reason you can't do that
83  * in an otherwise-empty struct.
84  */
87 
88 #define REVMAP_CONTENT_SIZE \
89  (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) - \
90  offsetof(RevmapContents, rm_tids) - \
91  MAXALIGN(sizeof(BrinSpecialSpace)))
92 /* max num of items in the array */
93 #define REVMAP_PAGE_MAXITEMS \
94  (REVMAP_CONTENT_SIZE / sizeof(ItemPointerData))
95 
96 #endif /* BRIN_PAGE_H */
uint32 BlockNumber
Definition: block.h:31
struct BrinMetaPageData BrinMetaPageData
struct RevmapContents RevmapContents
struct BrinSpecialSpace BrinSpecialSpace
unsigned short uint16
Definition: c.h:508
unsigned int uint32
Definition: c.h:509
#define MAXALIGN(LEN)
Definition: c.h:814
uint32 brinVersion
Definition: brin_page.h:67
uint32 brinMagic
Definition: brin_page.h:66
BlockNumber lastRevmapPage
Definition: brin_page.h:69
BlockNumber pagesPerRange
Definition: brin_page.h:68
uint16 vector[MAXALIGN(1)/sizeof(uint16)]
Definition: brin_page.h:31
ItemPointerData rm_tids[1]
Definition: brin_page.h:85