1/*
2 * brin_page.h
3 * Prototypes and definitions for BRIN page layouts
4 *
5 * Portions Copyright (c) 1996-2019, 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 */
29typedef struct BrinSpecialSpace
30{
31 uint16 vector[MAXALIGN(1) / sizeof(uint16)];
32} BrinSpecialSpace;
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 */
64typedef struct BrinMetaPageData
65{
66 uint32 brinMagic;
67 uint32 brinVersion;
68 BlockNumber pagesPerRange;
69 BlockNumber lastRevmapPage;
70} BrinMetaPageData;
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 */
78typedef 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 */
85 ItemPointerData rm_tids[1];
86} RevmapContents;
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 */
97