PostgreSQL Source Code git master
Loading...
Searching...
No Matches
bloom.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * bloom.h
4 * Header for bloom index.
5 *
6 * Copyright (c) 2016-2026, 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 "fmgr.h"
21#include "nodes/pathnodes.h"
22
23/* Support procedures numbers */
24#define BLOOM_HASH_PROC 1
25#define BLOOM_OPTIONS_PROC 2
26#define BLOOM_NPROC 2
27
28/* Scan strategies */
29#define BLOOM_EQUAL_STRATEGY 1
30#define BLOOM_NSTRATEGIES 1
31
32/* Opaque for bloom pages */
33typedef struct BloomPageOpaqueData
34{
35 OffsetNumber maxoff; /* number of index tuples on page */
36 uint16 flags; /* see bit definitions below */
37 uint16 unused; /* placeholder to force maxaligning of size of
38 * BloomPageOpaqueData and to place
39 * bloom_page_id exactly at the end of page */
40 uint16 bloom_page_id; /* for identification of BLOOM indexes */
42
44
45/* Bloom page flags */
46#define BLOOM_META (1<<0)
47#define BLOOM_DELETED (2<<0)
48
49/*
50 * The page ID is for the convenience of pg_filedump and similar utilities,
51 * which otherwise would have a hard time telling pages of different index
52 * types apart. It should be the last 2 bytes on the page. This is more or
53 * less "free" due to alignment considerations.
54 *
55 * See comments above GinPageOpaqueData.
56 */
57#define BLOOM_PAGE_ID 0xFF83
58
59/* Macros for accessing bloom page structures */
60#define BloomPageGetOpaque(page) ((BloomPageOpaque) PageGetSpecialPointer(page))
61#define BloomPageGetMaxOffset(page) (BloomPageGetOpaque(page)->maxoff)
62#define BloomPageIsMeta(page) \
63 ((BloomPageGetOpaque(page)->flags & BLOOM_META) != 0)
64#define BloomPageIsDeleted(page) \
65 ((BloomPageGetOpaque(page)->flags & BLOOM_DELETED) != 0)
66#define BloomPageSetDeleted(page) \
67 (BloomPageGetOpaque(page)->flags |= BLOOM_DELETED)
68#define BloomPageSetNonDeleted(page) \
69 (BloomPageGetOpaque(page)->flags &= ~BLOOM_DELETED)
70#define BloomPageGetData(page) ((BloomTuple *)PageGetContents(page))
71#define BloomPageGetTuple(state, page, offset) \
72 ((BloomTuple *)(PageGetContents(page) \
73 + (state)->sizeOfBloomTuple * ((offset) - 1)))
74#define BloomPageGetNextTuple(state, tuple) \
75 ((BloomTuple *)((char *)(tuple) + (state)->sizeOfBloomTuple))
76
77/* Preserved page numbers */
78#define BLOOM_METAPAGE_BLKNO (0)
79#define BLOOM_HEAD_BLKNO (1) /* first data page */
80
81/*
82 * We store Bloom signatures as arrays of uint16 words.
83 */
85
86#define SIGNWORDBITS ((int) (BITS_PER_BYTE * sizeof(BloomSignatureWord)))
87
88/*
89 * Default and maximum Bloom signature length in bits.
90 */
91#define DEFAULT_BLOOM_LENGTH (5 * SIGNWORDBITS)
92#define MAX_BLOOM_LENGTH (256 * SIGNWORDBITS)
93
94/*
95 * Default and maximum signature bits generated per index key.
96 */
97#define DEFAULT_BLOOM_BITS 2
98#define MAX_BLOOM_BITS (MAX_BLOOM_LENGTH - 1)
99
100/* Bloom index options */
101typedef struct BloomOptions
102{
103 int32 vl_len_; /* varlena header (do not touch directly!) */
104 int bloomLength; /* length of signature in words (not bits!) */
105 int bitSize[INDEX_MAX_KEYS]; /* # of bits generated for each
106 * index key */
108
109/*
110 * FreeBlockNumberArray - array of block numbers sized so that metadata fill
111 * all space in metapage.
112 */
114 - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions)))
115 / sizeof(BlockNumber)];
116
117/* Metadata of bloom index */
126
127/* Magic number to distinguish bloom pages from others */
128#define BLOOM_MAGICK_NUMBER (0xDBAC0DED)
129
130/* Number of blocks numbers fit in BloomMetaPageData */
131#define BloomMetaBlockN (sizeof(FreeBlockNumberArray) / sizeof(BlockNumber))
132
133#define BloomPageGetMeta(page) ((BloomMetaPageData *) PageGetContents(page))
134
135typedef struct BloomState
136{
139 BloomOptions opts; /* copy of options on index's metapage */
141
142 /*
143 * sizeOfBloomTuple is index-specific, and it depends on reloptions, so
144 * precompute it
145 */
148
149#define BloomPageGetFreeSpace(state, page) \
150 (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) \
151 - BloomPageGetMaxOffset(page) * (state)->sizeOfBloomTuple \
152 - MAXALIGN(sizeof(BloomPageOpaqueData)))
153
154/*
155 * Tuples are very different from all other relations
156 */
162
163#define BLOOMTUPLEHDRSZ offsetof(BloomTuple, sign)
164
165/* Opaque data structure for bloom index scan */
171
173
174/* blutils.c */
177extern void BloomInitMetapage(Relation index, ForkNumber forknum);
178extern void BloomInitPage(Page page, uint16 flags);
180extern void signValue(BloomState *state, BloomSignatureWord *sign, Datum value, int attno);
181extern BloomTuple *BloomFormTuple(BloomState *state, ItemPointer iptr, Datum *values, bool *isnull);
182extern bool BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple);
183
184/* blvalidate.c */
185extern bool blvalidate(Oid opclassoid);
186
187/* index access method interface functions */
188extern bool blinsert(Relation index, Datum *values, bool *isnull,
191 bool indexUnchanged,
192 struct IndexInfo *indexInfo);
193extern IndexScanDesc blbeginscan(Relation r, int nkeys, int norderbys);
194extern int64 blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm);
195extern void blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
196 ScanKey orderbys, int norderbys);
197extern void blendscan(IndexScanDesc scan);
199 struct IndexInfo *indexInfo);
200extern void blbuildempty(Relation index);
203 void *callback_state);
205 IndexBulkDeleteResult *stats);
206extern bytea *bloptions(Datum reloptions, bool validate);
207extern void blcostestimate(PlannerInfo *root, IndexPath *path,
208 double loop_count, Cost *indexStartupCost,
209 Cost *indexTotalCost, Selectivity *indexSelectivity,
210 double *indexCorrelation, double *indexPages);
211
212#endif
static bool validate(Port *port, const char *auth)
Definition auth-oauth.c:638
uint32 BlockNumber
Definition block.h:31
IndexBuildResult * blbuild(Relation heap, Relation index, struct IndexInfo *indexInfo)
Definition blinsert.c:122
bool blvalidate(Oid opclassoid)
Definition blvalidate.c:30
void BloomInitPage(Page page, uint16 flags)
Definition blutils.c:405
int64 blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
Definition blscan.c:76
IndexScanDesc blbeginscan(Relation r, int nkeys, int norderbys)
Definition blscan.c:26
BloomTuple * BloomFormTuple(BloomState *state, ItemPointer iptr, Datum *values, bool *isnull)
Definition blutils.c:299
bool BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple)
Definition blutils.c:324
void blcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, Cost *indexStartupCost, Cost *indexTotalCost, Selectivity *indexSelectivity, double *indexCorrelation, double *indexPages)
Definition blcost.c:22
void blbuildempty(Relation index)
Definition blinsert.c:165
BloomPageOpaqueData * BloomPageOpaque
Definition bloom.h:43
BlockNumber FreeBlockNumberArray[MAXALIGN_DOWN(BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(BloomPageOpaqueData)) - MAXALIGN(sizeof(uint16) *2+sizeof(uint32)+sizeof(BloomOptions)))/sizeof(BlockNumber)]
Definition bloom.h:115
struct BloomOptions BloomOptions
Buffer BloomNewBuffer(Relation index)
Definition blutils.c:359
IndexBulkDeleteResult * blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
Definition blvacuum.c:30
void BloomFillMetapage(Relation index, Page metaPage)
Definition blutils.c:420
bool blinsert(Relation index, Datum *values, bool *isnull, ItemPointer ht_ctid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, struct IndexInfo *indexInfo)
Definition blinsert.c:175
void BloomInitMetapage(Relation index, ForkNumber forknum)
Definition blutils.c:452
bytea * bloptions(Datum reloptions, bool validate)
Definition blutils.c:481
IndexBulkDeleteResult * blvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
Definition blvacuum.c:164
uint16 BloomSignatureWord
Definition bloom.h:84
void signValue(BloomState *state, BloomSignatureWord *sign, Datum value, int attno)
Definition blutils.c:266
void initBloomState(BloomState *state, Relation index)
Definition blutils.c:167
BloomScanOpaqueData * BloomScanOpaque
Definition bloom.h:172
void blendscan(IndexScanDesc scan)
Definition blscan.c:63
void blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
Definition blscan.c:46
static Datum values[MAXATTR]
Definition bootstrap.c:155
int Buffer
Definition buf.h:23
#define SizeOfPageHeaderData
Definition bufpage.h:216
PageData * Page
Definition bufpage.h:81
#define MAXALIGN_DOWN(LEN)
Definition c.h:838
#define MAXALIGN(LEN)
Definition c.h:826
int64_t int64
Definition c.h:543
#define FLEXIBLE_ARRAY_MEMBER
Definition c.h:480
int32_t int32
Definition c.h:542
uint16_t uint16
Definition c.h:545
uint32_t uint32
Definition c.h:546
size_t Size
Definition c.h:619
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
Definition genam.h:93
IndexUniqueCheck
Definition genam.h:122
static struct @172 value
char sign
Definition informix.c:693
double Cost
Definition nodes.h:261
double Selectivity
Definition nodes.h:260
uint16 OffsetNumber
Definition off.h:24
#define INDEX_MAX_KEYS
uint64_t Datum
Definition postgres.h:70
unsigned int Oid
static int fb(int x)
tree ctl root
Definition radixtree.h:1857
ForkNumber
Definition relpath.h:56
FreeBlockNumberArray notFullPage
Definition bloom.h:124
BloomOptions opts
Definition bloom.h:123
uint32 magickNumber
Definition bloom.h:120
uint16 nStart
Definition bloom.h:121
int32 vl_len_
Definition bloom.h:103
int bloomLength
Definition bloom.h:104
int bitSize[INDEX_MAX_KEYS]
Definition bloom.h:105
OffsetNumber maxoff
Definition bloom.h:35
uint16 bloom_page_id
Definition bloom.h:40
BloomSignatureWord * sign
Definition bloom.h:168
BloomState state
Definition bloom.h:169
BloomOptions opts
Definition bloom.h:139
Size sizeOfBloomTuple
Definition bloom.h:146
Oid collations[INDEX_MAX_KEYS]
Definition bloom.h:138
int32 nColumns
Definition bloom.h:140
FmgrInfo hashFn[INDEX_MAX_KEYS]
Definition bloom.h:137
BloomSignatureWord sign[FLEXIBLE_ARRAY_MEMBER]
Definition bloom.h:160
ItemPointerData heapPtr
Definition bloom.h:159
Definition type.h:96
Definition c.h:706
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)