PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
brin_tuple.h
Go to the documentation of this file.
1 /*
2  * brin_tuple.h
3  * Declarations for dealing with BRIN-specific tuples.
4  *
5  * Portions Copyright (c) 1996-2017, 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  BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER];
42 } BrinMemTuple;
43 
44 /*
45  * An on-disk BRIN tuple. This is possibly followed by a nulls bitmask, with
46  * room for 2 null bits (two bits for each indexed column); an opclass-defined
47  * number of Datum values for each column follow.
48  */
49 typedef struct BrinTuple
50 {
51  /* heap block number that the tuple is for */
53 
54  /* ---------------
55  * bt_info is laid out in the following fashion:
56  *
57  * 7th (high) bit: has nulls
58  * 6th bit: is placeholder tuple
59  * 5th bit: unused
60  * 4-0 bit: offset of data
61  * ---------------
62  */
64 } BrinTuple;
65 
66 #define SizeOfBrinTuple (offsetof(BrinTuple, bt_info) + sizeof(uint8))
67 
68 /*
69  * bt_info manipulation macros
70  */
71 #define BRIN_OFFSET_MASK 0x1F
72 /* bit 0x20 is not used at present */
73 #define BRIN_PLACEHOLDER_MASK 0x40
74 #define BRIN_NULLS_MASK 0x80
75 
76 #define BrinTupleDataOffset(tup) ((Size) (((BrinTuple *) (tup))->bt_info & BRIN_OFFSET_MASK))
77 #define BrinTupleHasNulls(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_NULLS_MASK)) != 0)
78 #define BrinTupleIsPlaceholder(tup) (((((BrinTuple *) (tup))->bt_info & BRIN_PLACEHOLDER_MASK)) != 0)
79 
80 
81 extern BrinTuple *brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno,
82  BrinMemTuple *tuple, Size *size);
84  BlockNumber blkno, Size *size);
85 extern void brin_free_tuple(BrinTuple *tuple);
86 extern BrinTuple *brin_copy_tuple(BrinTuple *tuple, Size len);
87 extern bool brin_tuples_equal(const BrinTuple *a, Size alen,
88  const BrinTuple *b, Size blen);
89 
90 extern BrinMemTuple *brin_new_memtuple(BrinDesc *brdesc);
91 extern void brin_memtuple_initialize(BrinMemTuple *dtuple,
92  BrinDesc *brdesc);
94  BrinTuple *tuple);
95 
96 #endif /* BRIN_TUPLE_H */
struct BrinValues BrinValues
BlockNumber bt_blkno
Definition: brin_tuple.h:39
bool bv_allnulls
Definition: brin_tuple.h:28
unsigned char uint8
Definition: c.h:263
struct BrinMemTuple BrinMemTuple
uint32 BlockNumber
Definition: block.h:31
BrinTuple * brin_copy_tuple(BrinTuple *tuple, Size len)
Definition: brin_tuple.c:317
BrinMemTuple * brin_deform_tuple(BrinDesc *brdesc, BrinTuple *tuple)
Definition: brin_tuple.c:398
bool bt_placeholder
Definition: brin_tuple.h:38
bool bv_hasnulls
Definition: brin_tuple.h:27
BrinMemTuple * brin_new_memtuple(BrinDesc *brdesc)
Definition: brin_tuple.c:348
AttrNumber bv_attno
Definition: brin_tuple.h:26
BrinValues bt_columns[FLEXIBLE_ARRAY_MEMBER]
Definition: brin_tuple.h:41
void brin_memtuple_initialize(BrinMemTuple *dtuple, BrinDesc *brdesc)
Definition: brin_tuple.c:378
uintptr_t Datum
Definition: postgres.h:374
BlockNumber bt_blkno
Definition: brin_tuple.h:52
size_t Size
Definition: c.h:353
uint8 bt_info
Definition: brin_tuple.h:63
void brin_free_tuple(BrinTuple *tuple)
Definition: brin_tuple.c:308
struct BrinTuple BrinTuple
bool brin_tuples_equal(const BrinTuple *a, Size alen, const BrinTuple *b, Size blen)
Definition: brin_tuple.c:331
BrinTuple * brin_form_placeholder_tuple(BrinDesc *brdesc, BlockNumber blkno, Size *size)
Definition: brin_tuple.c:263
BrinTuple * brin_form_tuple(BrinDesc *brdesc, BlockNumber blkno, BrinMemTuple *tuple, Size *size)
Definition: brin_tuple.c:89
Datum * bv_values
Definition: brin_tuple.h:29
int16 AttrNumber
Definition: attnum.h:21
MemoryContext bt_context
Definition: brin_tuple.h:40