1 /*-------------------------------------------------------------------------
4 * Header for bloom index.
6 * Copyright (c) 2016, PostgreSQL Global Development Group
9 * contrib/bloom/bloom.h
11 *-------------------------------------------------------------------------
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"
23 /* Support procedures numbers */
24 #define BLOOM_HASH_PROC 1
28 #define BLOOM_EQUAL_STRATEGY 1
29 #define BLOOM_NSTRATEGIES 1
31 /* Opaque for bloom pages */
32 typedef struct BloomPageOpaqueData
36 } BloomPageOpaqueData;
38 typedef BloomPageOpaqueData *BloomPageOpaque;
40 /* Bloom page flags */
41 #define BLOOM_META (1<<0)
42 #define BLOOM_DELETED (2<<0)
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))
58 /* Preserved page numbers */
59 #define BLOOM_METAPAGE_BLKNO (0)
60 #define BLOOM_HEAD_BLKNO (1) /* first data page */
62 /* Bloom index options */
63 typedef struct BloomOptions
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
72 * FreeBlockNumberArray - array of block numbers sized so that metadata fill
73 * all space in metapage.
75 typedef BlockNumber FreeBlockNumberArray[
77 BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(BloomPageOpaqueData))
78 - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions))
79 ) / sizeof(BlockNumber)
82 /* Metadata of bloom index */
83 typedef struct BloomMetaPageData
89 FreeBlockNumberArray notFullPage;
92 /* Magic number to distinguish bloom pages among anothers */
93 #define BLOOM_MAGICK_NUMBER (0xDBAC0DED)
95 /* Number of blocks numbers fit in BloomMetaPageData */
96 #define BloomMetaBlockN (sizeof(FreeBlockNumberArray) / sizeof(BlockNumber))
98 #define BloomPageGetMeta(page) ((BloomMetaPageData *) PageGetContents(page))
100 typedef struct BloomState
102 FmgrInfo hashFn[INDEX_MAX_KEYS];
103 BloomOptions *opts; /* stored in rd_amcache and defined at
108 * sizeOfBloomTuple is index's specific, and it depends on reloptions, so
111 int32 sizeOfBloomTuple;
114 #define BloomPageGetFreeSpace(state, page) \
115 (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
116 - BloomPageGetMaxOffset(page) * (state)->sizeOfBloomTuple \
117 - MAXALIGN(sizeof(BloomPageOpaqueData)))
120 * Tuples are very different from all other relations
122 typedef uint16 SignType;
124 typedef struct BloomTuple
126 ItemPointerData heapPtr;
130 #define BLOOMTUPLEHDRSZ offsetof(BloomTuple, sign)
132 /* Opaque data structure for bloom index scan */
133 typedef struct BloomScanOpaqueData
135 SignType *sign; /* Scan signature */
137 } BloomScanOpaqueData;
139 typedef BloomScanOpaqueData *BloomScanOpaque;
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);
153 extern bool blvalidate(Oid opclassoid);
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);