1 | /* |
2 | * brin_tuple.h |
3 | * Declarations for dealing with BRIN-specific tuples. |
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_tuple.h |
10 | */ |
11 | #ifndef BRIN_TUPLE_H |
12 | #define BRIN_TUPLE_H |
13 | |
14 | #include "access/brin_internal.h" |
15 | #include "access/tupdesc.h" |
16 | |
17 | |
18 | /* |
19 | * A BRIN index stores one index tuple per page range. Each index tuple |
20 | * has one BrinValues struct for each indexed column; in turn, each BrinValues |
21 | * has (besides the null flags) an array of Datum whose size is determined by |
22 | * the opclass. |
23 | */ |
24 | typedef struct BrinValues |
25 | { |
26 | AttrNumber bv_attno; /* index attribute number */ |
27 | bool bv_hasnulls; /* are there any nulls in the page range? */ |
28 | bool bv_allnulls; /* are all values nulls in the page range? */ |
29 | Datum *bv_values; /* current accumulated values */ |
30 | } BrinValues; |
31 | |
32 | /* |
33 | * This struct is used to represent an in-memory index tuple. The values can |
34 | * only be meaningfully decoded with an appropriate BrinDesc. |
35 | */ |
36 | typedef struct BrinMemTuple |
37 | { |
38 | bool bt_placeholder; /* this is a placeholder tuple */ |
39 | BlockNumber bt_blkno; /* heap blkno that the tuple is for */ |
40 | MemoryContext bt_context; /* memcxt holding the bt_columns values */ |
41 | /* output arrays for brin_deform_tuple: */ |
42 | Datum *bt_values; /* values array */ |
43 | bool *bt_allnulls; /* allnulls array */ |
44 | bool *bt_hasnulls; /* hasnulls array */ |
45 | /* not an output array, but must be last */ |
46 | BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER]; |
47 | } BrinMemTuple; |
48 | |
49 | /* |
50 | * An on-disk BRIN tuple. This is possibly followed by a nulls bitmask, with |
51 | * room for 2 null bits (two bits for each indexed column); an opclass-defined |
52 | * number of Datum values for each column follow. |
53 | */ |
54 | typedef struct BrinTuple |
55 | { |
56 | /* heap block number that the tuple is for */ |
57 | BlockNumber bt_blkno; |
58 | |
59 | /* --------------- |
60 | * bt_info is laid out in the following fashion: |
61 | * |
62 | * 7th (high) bit: has nulls |
63 | * 6th bit: is placeholder tuple |
64 | * 5th bit: unused |
65 | * 4-0 bit: offset of data |
66 | * --------------- |
67 | */ |
68 | uint8 bt_info; |
69 | } BrinTuple; |
70 | |
71 | #define SizeOfBrinTuple (offsetof(BrinTuple, bt_info) + sizeof(uint8)) |
72 | |
73 | /* |
74 | * bt_info manipulation macros |
75 | */ |
76 | #define BRIN_OFFSET_MASK 0x1F |
77 | /* bit 0x20 is not used at present */ |
78 | #define BRIN_PLACEHOLDER_MASK 0x40 |
79 | #define BRIN_NULLS_MASK 0x80 |
80 | |
81 | #define BrinTupleDataOffset(tup) ((Size) (((BrinTuple *) (tup))->bt_info & BRIN_OFFSET_MASK)) |
82 | #define BrinTupleHasNulls(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_NULLS_MASK)) != 0) |
83 | #define BrinTupleIsPlaceholder(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_PLACEHOLDER_MASK)) != 0) |
84 | |
85 | |
86 | extern BrinTuple *brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, |
87 | BrinMemTuple *tuple, Size *size); |
88 | extern BrinTuple *brin_form_placeholder_tuple(BrinDesc *brdesc, |
89 | BlockNumber blkno, Size *size); |
90 | extern void brin_free_tuple(BrinTuple *tuple); |
91 | extern BrinTuple *brin_copy_tuple(BrinTuple *tuple, Size len, |
92 | BrinTuple *dest, Size *destsz); |
93 | extern bool brin_tuples_equal(const BrinTuple *a, Size alen, |
94 | const BrinTuple *b, Size blen); |
95 | |
96 | extern BrinMemTuple *brin_new_memtuple(BrinDesc *brdesc); |
97 | extern BrinMemTuple *brin_memtuple_initialize(BrinMemTuple *dtuple, |
98 | BrinDesc *brdesc); |
99 | extern BrinMemTuple *brin_deform_tuple(BrinDesc *brdesc, |
100 | BrinTuple *tuple, BrinMemTuple *dMemtuple); |
101 | |
102 | #endif /* BRIN_TUPLE_H */ |
103 | |