| 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 | |