PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
bloom.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * bloom.h
4 * Header for bloom index.
5 *
6 * Copyright (c) 2016-2024, 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 *)((Pointer)(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 */
118typedef struct BloomMetaPageData
119{
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 */
157typedef struct BloomTuple
158{
162
163#define BLOOMTUPLEHDRSZ offsetof(BloomTuple, sign)
164
165/* Opaque data structure for bloom index scan */
167{
168 BloomSignatureWord *sign; /* Scan signature */
171
173
174/* blutils.c */
176extern void BloomFillMetapage(Relation index, Page metaPage);
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,
189 ItemPointer ht_ctid, Relation heapRel,
190 IndexUniqueCheck checkUnique,
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
uint32 BlockNumber
Definition: block.h:31
IndexBuildResult * blbuild(Relation heap, Relation index, struct IndexInfo *indexInfo)
Definition: blinsert.c:119
bool blvalidate(Oid opclassoid)
Definition: blvalidate.c:30
void BloomInitPage(Page page, uint16 flags)
Definition: blutils.c:399
int64 blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
Definition: blscan.c:75
IndexScanDesc blbeginscan(Relation r, int nkeys, int norderbys)
Definition: blscan.c:25
BloomTuple * BloomFormTuple(BloomState *state, ItemPointer iptr, Datum *values, bool *isnull)
Definition: blutils.c:293
bool BloomPageAddItem(BloomState *state, Page page, BloomTuple *tuple)
Definition: blutils.c:318
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:162
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 BloomMetaPageData BloomMetaPageData
struct BloomOptions BloomOptions
Buffer BloomNewBuffer(Relation index)
Definition: blutils.c:353
struct BloomPageOpaqueData BloomPageOpaqueData
IndexBulkDeleteResult * blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
Definition: blvacuum.c:30
void BloomFillMetapage(Relation index, Page metaPage)
Definition: blutils.c:414
bool blinsert(Relation index, Datum *values, bool *isnull, ItemPointer ht_ctid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, struct IndexInfo *indexInfo)
Definition: blinsert.c:172
void BloomInitMetapage(Relation index, ForkNumber forknum)
Definition: blutils.c:446
struct BloomState BloomState
bytea * bloptions(Datum reloptions, bool validate)
Definition: blutils.c:475
IndexBulkDeleteResult * blvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
Definition: blvacuum.c:165
struct BloomTuple BloomTuple
uint16 BloomSignatureWord
Definition: bloom.h:84
void signValue(BloomState *state, BloomSignatureWord *sign, Datum value, int attno)
Definition: blutils.c:260
void initBloomState(BloomState *state, Relation index)
Definition: blutils.c:161
BloomScanOpaqueData * BloomScanOpaque
Definition: bloom.h:172
struct BloomScanOpaqueData BloomScanOpaqueData
void blendscan(IndexScanDesc scan)
Definition: blscan.c:62
void blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
Definition: blscan.c:45
static Datum values[MAXATTR]
Definition: bootstrap.c:151
int Buffer
Definition: buf.h:23
Pointer Page
Definition: bufpage.h:81
#define SizeOfPageHeaderData
Definition: bufpage.h:216
#define MAXALIGN_DOWN(LEN)
Definition: c.h:777
#define MAXALIGN(LEN)
Definition: c.h:765
int64_t int64
Definition: c.h:482
#define FLEXIBLE_ARRAY_MEMBER
Definition: c.h:417
int32_t int32
Definition: c.h:481
uint16_t uint16
Definition: c.h:484
uint32_t uint32
Definition: c.h:485
size_t Size
Definition: c.h:559
bool(* IndexBulkDeleteCallback)(ItemPointer itemptr, void *state)
Definition: genam.h:89
IndexUniqueCheck
Definition: genam.h:118
static struct @161 value
char sign
Definition: informix.c:693
double Cost
Definition: nodes.h:251
double Selectivity
Definition: nodes.h:250
uint16 OffsetNumber
Definition: off.h:24
#define INDEX_MAX_KEYS
uintptr_t Datum
Definition: postgres.h:64
unsigned int Oid
Definition: postgres_ext.h:31
tree ctl root
Definition: radixtree.h:1888
ForkNumber
Definition: relpath.h:56
FreeBlockNumberArray notFullPage
Definition: bloom.h:124
BloomOptions opts
Definition: bloom.h:123
uint32 magickNumber
Definition: bloom.h:120
uint16 nEnd
Definition: bloom.h:122
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 flags
Definition: bloom.h:36
uint16 unused
Definition: bloom.h:37
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: fmgr.h:57
Definition: type.h:96
Definition: regguts.h:323
Definition: c.h:641
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Definition: test_ifaddrs.c:46