]> granicus.if.org Git - postgresql/blob - contrib/bloom/bloom.h
Bloom index contrib module
[postgresql] / contrib / bloom / bloom.h
1 /*-------------------------------------------------------------------------
2  *
3  * bloom.h
4  *        Header for bloom index.
5  *
6  * Copyright (c) 2016, PostgreSQL Global Development Group
7  *
8  * IDENTIFICATION
9  *        contrib/bloom/bloom.h
10  *
11  *-------------------------------------------------------------------------
12  */
13 #ifndef _BLOOM_H_
14 #define _BLOOM_H_
15
16 #include "access/amapi.h"
17 #include "access/generic_xlog.h"
18 #include "access/itup.h"
19 #include "access/xlog.h"
20 #include "nodes/relation.h"
21 #include "fmgr.h"
22
23 /* Support procedures numbers */
24 #define BLOOM_HASH_PROC                 1
25 #define BLOOM_NPROC                             1
26
27 /* Scan strategies */
28 #define BLOOM_EQUAL_STRATEGY    1
29 #define BLOOM_NSTRATEGIES               1
30
31 /* Opaque for bloom pages */
32 typedef struct BloomPageOpaqueData
33 {
34         OffsetNumber maxoff;
35         uint16          flags;
36 }       BloomPageOpaqueData;
37
38 typedef BloomPageOpaqueData *BloomPageOpaque;
39
40 /* Bloom page flags */
41 #define BLOOM_META              (1<<0)
42 #define BLOOM_DELETED   (2<<0)
43
44 /* Macros for accessing bloom page structures */
45 #define BloomPageGetOpaque(page) ((BloomPageOpaque) PageGetSpecialPointer(page))
46 #define BloomPageGetMaxOffset(page) (BloomPageGetOpaque(page)->maxoff)
47 #define BloomPageIsMeta(page) (BloomPageGetOpaque(page)->flags & BLOOM_META)
48 #define BloomPageIsDeleted(page) (BloomPageGetOpaque(page)->flags & BLOOM_DELETED)
49 #define BloomPageSetDeleted(page) (BloomPageGetOpaque(page)->flags |= BLOOM_DELETED)
50 #define BloomPageSetNonDeleted(page) (BloomPageGetOpaque(page)->flags &= ~BLOOM_DELETED)
51 #define BloomPageGetData(page)          ((BloomTuple *)PageGetContents(page))
52 #define BloomPageGetTuple(state, page, offset) \
53         ((BloomTuple *)(PageGetContents(page) \
54                 + (state)->sizeOfBloomTuple * ((offset) - 1)))
55 #define BloomPageGetNextTuple(state, tuple) \
56         ((BloomTuple *)((Pointer)(tuple) + (state)->sizeOfBloomTuple))
57
58 /* Preserved page numbers */
59 #define BLOOM_METAPAGE_BLKNO    (0)
60 #define BLOOM_HEAD_BLKNO                (1)             /* first data page */
61
62 /* Bloom index options */
63 typedef struct BloomOptions
64 {
65         int32           vl_len_;                /* varlena header (do not touch directly!) */
66         int                     bloomLength;    /* length of signature in uint16 */
67         int                     bitSize[INDEX_MAX_KEYS];                /* signature bits per index
68                                                                                                  * key */
69 }       BloomOptions;
70
71 /*
72  * FreeBlockNumberArray - array of block numbers sized so that metadata fill
73  * all space in metapage.
74  */
75 typedef BlockNumber FreeBlockNumberArray[
76                                                                                  MAXALIGN_DOWN(
77                 BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(BloomPageOpaqueData))
78            - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions))
79                                                                                                            ) / sizeof(BlockNumber)
80 ];
81
82 /* Metadata of bloom index */
83 typedef struct BloomMetaPageData
84 {
85         uint32          magickNumber;
86         uint16          nStart;
87         uint16          nEnd;
88         BloomOptions opts;
89         FreeBlockNumberArray notFullPage;
90 }       BloomMetaPageData;
91
92 /* Magic number to distinguish bloom pages among anothers */
93 #define BLOOM_MAGICK_NUMBER (0xDBAC0DED)
94
95 /* Number of blocks numbers fit in BloomMetaPageData */
96 #define BloomMetaBlockN         (sizeof(FreeBlockNumberArray) / sizeof(BlockNumber))
97
98 #define BloomPageGetMeta(page)  ((BloomMetaPageData *) PageGetContents(page))
99
100 typedef struct BloomState
101 {
102         FmgrInfo        hashFn[INDEX_MAX_KEYS];
103         BloomOptions *opts;                     /* stored in rd_amcache and defined at
104                                                                  * creation time */
105         int32           nColumns;
106
107         /*
108          * sizeOfBloomTuple is index's specific, and it depends on reloptions, so
109          * precompute it
110          */
111         int32           sizeOfBloomTuple;
112 }       BloomState;
113
114 #define BloomPageGetFreeSpace(state, page) \
115         (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
116                 - BloomPageGetMaxOffset(page) * (state)->sizeOfBloomTuple \
117                 - MAXALIGN(sizeof(BloomPageOpaqueData)))
118
119 /*
120  * Tuples are very different from all other relations
121  */
122 typedef uint16 SignType;
123
124 typedef struct BloomTuple
125 {
126         ItemPointerData heapPtr;
127         SignType        sign[1];
128 }       BloomTuple;
129
130 #define BLOOMTUPLEHDRSZ offsetof(BloomTuple, sign)
131
132 /* Opaque data structure for bloom index scan */
133 typedef struct BloomScanOpaqueData
134 {
135         SignType   *sign;                       /* Scan signature */
136         BloomState      state;
137 }       BloomScanOpaqueData;
138
139 typedef BloomScanOpaqueData *BloomScanOpaque;
140
141 /* blutils.c */
142 extern void _PG_init(void);
143 extern Datum blhandler(PG_FUNCTION_ARGS);
144 extern void initBloomState(BloomState * state, Relation index);
145 extern void BloomInitMetapage(Relation index);
146 extern void BloomInitPage(Page page, uint16 flags);
147 extern Buffer BloomNewBuffer(Relation index);
148 extern void signValue(BloomState * state, SignType * sign, Datum value, int attno);
149 extern BloomTuple *BloomFormTuple(BloomState * state, ItemPointer iptr, Datum *values, bool *isnull);
150 extern bool BloomPageAddItem(BloomState * state, Page page, BloomTuple * tuple);
151
152 /* blvalidate.c */
153 extern bool blvalidate(Oid opclassoid);
154
155 /* index access method interface functions */
156 extern bool blinsert(Relation index, Datum *values, bool *isnull,
157                  ItemPointer ht_ctid, Relation heapRel,
158                  IndexUniqueCheck checkUnique);
159 extern IndexScanDesc blbeginscan(Relation r, int nkeys, int norderbys);
160 extern int64 blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
161 extern void blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
162                  ScanKey orderbys, int norderbys);
163 extern void blendscan(IndexScanDesc scan);
164 extern IndexBuildResult *blbuild(Relation heap, Relation index,
165                 struct IndexInfo *indexInfo);
166 extern void blbuildempty(Relation index);
167 extern IndexBulkDeleteResult *blbulkdelete(IndexVacuumInfo *info,
168                          IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback,
169                          void *callback_state);
170 extern IndexBulkDeleteResult *blvacuumcleanup(IndexVacuumInfo *info,
171                                 IndexBulkDeleteResult *stats);
172 extern bytea *bloptions(Datum reloptions, bool validate);
173 extern void blcostestimate(PlannerInfo *root, IndexPath *path,
174                            double loop_count, Cost *indexStartupCost,
175                            Cost *indexTotalCost, Selectivity *indexSelectivity,
176                            double *indexCorrelation);
177
178 #endif