]> granicus.if.org Git - postgresql/blob - src/include/access/brin_tuple.h
Update copyright via script for 2017
[postgresql] / src / include / access / brin_tuple.h
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 */
52         BlockNumber bt_blkno;
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          */
63         uint8           bt_info;
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);
83 extern BrinTuple *brin_form_placeholder_tuple(BrinDesc *brdesc,
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);
93 extern BrinMemTuple *brin_deform_tuple(BrinDesc *brdesc,
94                                   BrinTuple *tuple);
95
96 #endif   /* BRIN_TUPLE_H */