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