1 /*
2  * brin_tuple.h
3  *		Declarations for dealing with BRIN-specific tuples.
4  *
5  * Portions Copyright (c) 1996-2020, 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 {
Column__anon496dc4b30111::Column38 	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 */
set__anon496dc4b30111::Column41 	/* 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 */
set__anon496dc4b30111::Column46 	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
render__anon496dc4b30111::Column51  * 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
operator <<(raw_ostream & OS,const Column & Value)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);
adjustColumnWidths(ArrayRef<StringRef> Files,ArrayRef<StringRef> Functions)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