PostgreSQL Source Code  git master
blutils.c File Reference
#include "postgres.h"
#include "access/amapi.h"
#include "access/generic_xlog.h"
#include "access/reloptions.h"
#include "bloom.h"
#include "catalog/index.h"
#include "commands/vacuum.h"
#include "miscadmin.h"
#include "storage/bufmgr.h"
#include "storage/freespace.h"
#include "storage/indexfsm.h"
#include "storage/lmgr.h"
#include "utils/memutils.h"
Include dependency graph for blutils.c:

Go to the source code of this file.

Macros

#define GETWORD(x, i)   ( *( (BloomSignatureWord *)(x) + ( (i) / SIGNWORDBITS ) ) )
 
#define CLRBIT(x, i)   GETWORD(x,i) &= ~( 0x01 << ( (i) % SIGNWORDBITS ) )
 
#define SETBIT(x, i)   GETWORD(x,i) |= ( 0x01 << ( (i) % SIGNWORDBITS ) )
 
#define GETBIT(x, i)   ( (GETWORD(x,i) >> ( (i) % SIGNWORDBITS )) & 0x01 )
 

Functions

 PG_FUNCTION_INFO_V1 (blhandler)
 
static int32 myRand (void)
 
static void mySrand (uint32 seed)
 
void _PG_init (void)
 
static BloomOptionsmakeDefaultBloomOptions (void)
 
Datum blhandler (PG_FUNCTION_ARGS)
 
void initBloomState (BloomState *state, Relation index)
 
void signValue (BloomState *state, BloomSignatureWord *sign, Datum value, int attno)
 
BloomTupleBloomFormTuple (BloomState *state, ItemPointer iptr, Datum *values, bool *isnull)
 
bool BloomPageAddItem (BloomState *state, Page page, BloomTuple *tuple)
 
Buffer BloomNewBuffer (Relation index)
 
void BloomInitPage (Page page, uint16 flags)
 
void BloomFillMetapage (Relation index, Page metaPage)
 
void BloomInitMetapage (Relation index, ForkNumber forknum)
 
byteabloptions (Datum reloptions, bool validate)
 

Variables

static relopt_kind bl_relopt_kind
 
static relopt_parse_elt bl_relopt_tab [INDEX_MAX_KEYS+1]
 
static int32 next
 

Macro Definition Documentation

◆ CLRBIT

#define CLRBIT (   x,
  i 
)    GETWORD(x,i) &= ~( 0x01 << ( (i) % SIGNWORDBITS ) )

Definition at line 31 of file blutils.c.

◆ GETBIT

#define GETBIT (   x,
  i 
)    ( (GETWORD(x,i) >> ( (i) % SIGNWORDBITS )) & 0x01 )

Definition at line 33 of file blutils.c.

◆ GETWORD

#define GETWORD (   x,
  i 
)    ( *( (BloomSignatureWord *)(x) + ( (i) / SIGNWORDBITS ) ) )

Definition at line 30 of file blutils.c.

◆ SETBIT

#define SETBIT (   x,
  i 
)    GETWORD(x,i) |= ( 0x01 << ( (i) % SIGNWORDBITS ) )

Definition at line 32 of file blutils.c.

Function Documentation

◆ _PG_init()

void _PG_init ( void  )

Definition at line 52 of file blutils.c.

53 {
54  int i;
55  char buf[16];
56 
58 
59  /* Option for length of signature */
61  "Length of signature in bits",
64  bl_relopt_tab[0].optname = "length";
66  bl_relopt_tab[0].offset = offsetof(BloomOptions, bloomLength);
67 
68  /* Number of bits for each possible index column: col1, col2, ... */
69  for (i = 0; i < INDEX_MAX_KEYS; i++)
70  {
71  snprintf(buf, sizeof(buf), "col%d", i + 1);
73  "Number of bits generated for each index column",
77  buf);
79  bl_relopt_tab[i + 1].offset = offsetof(BloomOptions, bitSize[0]) + sizeof(int) * i;
80  }
81 }
#define DEFAULT_BLOOM_BITS
Definition: bloom.h:97
#define DEFAULT_BLOOM_LENGTH
Definition: bloom.h:91
#define MAX_BLOOM_BITS
Definition: bloom.h:98
#define MAX_BLOOM_LENGTH
Definition: bloom.h:92
static relopt_kind bl_relopt_kind
Definition: blutils.c:38
static relopt_parse_elt bl_relopt_tab[INDEX_MAX_KEYS+1]
Definition: blutils.c:41
int i
Definition: isn.c:73
#define AccessExclusiveLock
Definition: lockdefs.h:43
MemoryContext TopMemoryContext
Definition: mcxt.c:149
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:1683
#define INDEX_MAX_KEYS
static char * buf
Definition: pg_test_fsync.c:73
#define snprintf
Definition: port.h:238
void add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_val, int min_val, int max_val, LOCKMODE lockmode)
Definition: reloptions.c:901
relopt_kind add_reloption_kind(void)
Definition: reloptions.c:683
@ RELOPT_TYPE_INT
Definition: reloptions.h:32
const char * optname
Definition: reloptions.h:152
relopt_type opttype
Definition: reloptions.h:153

References AccessExclusiveLock, add_int_reloption(), add_reloption_kind(), bl_relopt_kind, bl_relopt_tab, buf, DEFAULT_BLOOM_BITS, DEFAULT_BLOOM_LENGTH, i, INDEX_MAX_KEYS, MAX_BLOOM_BITS, MAX_BLOOM_LENGTH, MemoryContextStrdup(), relopt_parse_elt::offset, relopt_parse_elt::optname, relopt_parse_elt::opttype, RELOPT_TYPE_INT, snprintf, and TopMemoryContext.

◆ blhandler()

Datum blhandler ( PG_FUNCTION_ARGS  )

Definition at line 106 of file blutils.c.

107 {
108  IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
109 
110  amroutine->amstrategies = BLOOM_NSTRATEGIES;
111  amroutine->amsupport = BLOOM_NPROC;
112  amroutine->amoptsprocnum = BLOOM_OPTIONS_PROC;
113  amroutine->amcanorder = false;
114  amroutine->amcanorderbyop = false;
115  amroutine->amcanbackward = false;
116  amroutine->amcanunique = false;
117  amroutine->amcanmulticol = true;
118  amroutine->amoptionalkey = true;
119  amroutine->amsearcharray = false;
120  amroutine->amsearchnulls = false;
121  amroutine->amstorage = false;
122  amroutine->amclusterable = false;
123  amroutine->ampredlocks = false;
124  amroutine->amcanparallel = false;
125  amroutine->amcanbuildparallel = false;
126  amroutine->amcaninclude = false;
127  amroutine->amusemaintenanceworkmem = false;
128  amroutine->amparallelvacuumoptions =
130  amroutine->amkeytype = InvalidOid;
131 
132  amroutine->ambuild = blbuild;
133  amroutine->ambuildempty = blbuildempty;
134  amroutine->aminsert = blinsert;
135  amroutine->aminsertcleanup = NULL;
136  amroutine->ambulkdelete = blbulkdelete;
137  amroutine->amvacuumcleanup = blvacuumcleanup;
138  amroutine->amcanreturn = NULL;
139  amroutine->amcostestimate = blcostestimate;
140  amroutine->amgettreeheight = NULL;
141  amroutine->amoptions = bloptions;
142  amroutine->amproperty = NULL;
143  amroutine->ambuildphasename = NULL;
144  amroutine->amvalidate = blvalidate;
145  amroutine->amadjustmembers = NULL;
146  amroutine->ambeginscan = blbeginscan;
147  amroutine->amrescan = blrescan;
148  amroutine->amgettuple = NULL;
149  amroutine->amgetbitmap = blgetbitmap;
150  amroutine->amendscan = blendscan;
151  amroutine->ammarkpos = NULL;
152  amroutine->amrestrpos = NULL;
153  amroutine->amestimateparallelscan = NULL;
154  amroutine->aminitparallelscan = NULL;
155  amroutine->amparallelrescan = NULL;
156 
157  PG_RETURN_POINTER(amroutine);
158 }
void blcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, Cost *indexStartupCost, Cost *indexTotalCost, Selectivity *indexSelectivity, double *indexCorrelation, double *indexPages)
Definition: blcost.c:23
void blbuildempty(Relation index)
Definition: blinsert.c:164
IndexBuildResult * blbuild(Relation heap, Relation index, IndexInfo *indexInfo)
Definition: blinsert.c:121
bool blinsert(Relation index, Datum *values, bool *isnull, ItemPointer ht_ctid, Relation heapRel, IndexUniqueCheck checkUnique, bool indexUnchanged, IndexInfo *indexInfo)
Definition: blinsert.c:174
bool blvalidate(Oid opclassoid)
Definition: blvalidate.c:32
int64 blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
Definition: blscan.c:78
IndexScanDesc blbeginscan(Relation r, int nkeys, int norderbys)
Definition: blscan.c:28
#define BLOOM_NPROC
Definition: bloom.h:26
#define BLOOM_NSTRATEGIES
Definition: bloom.h:30
IndexBulkDeleteResult * blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, IndexBulkDeleteCallback callback, void *callback_state)
Definition: blvacuum.c:34
#define BLOOM_OPTIONS_PROC
Definition: bloom.h:25
IndexBulkDeleteResult * blvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats)
Definition: blvacuum.c:169
void blendscan(IndexScanDesc scan)
Definition: blscan.c:65
void blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
Definition: blscan.c:48
bytea * bloptions(Datum reloptions, bool validate)
Definition: blutils.c:478
#define PG_RETURN_POINTER(x)
Definition: fmgr.h:361
#define makeNode(_type_)
Definition: nodes.h:155
#define InvalidOid
Definition: postgres_ext.h:36
ambuildphasename_function ambuildphasename
Definition: amapi.h:285
ambuildempty_function ambuildempty
Definition: amapi.h:275
amvacuumcleanup_function amvacuumcleanup
Definition: amapi.h:279
bool amclusterable
Definition: amapi.h:249
amoptions_function amoptions
Definition: amapi.h:283
amestimateparallelscan_function amestimateparallelscan
Definition: amapi.h:297
amrestrpos_function amrestrpos
Definition: amapi.h:294
aminsert_function aminsert
Definition: amapi.h:276
amendscan_function amendscan
Definition: amapi.h:292
uint16 amoptsprocnum
Definition: amapi.h:229
amparallelrescan_function amparallelrescan
Definition: amapi.h:299
Oid amkeytype
Definition: amapi.h:265
bool ampredlocks
Definition: amapi.h:251
uint16 amsupport
Definition: amapi.h:227
amcostestimate_function amcostestimate
Definition: amapi.h:281
bool amcanorderbyop
Definition: amapi.h:233
amadjustmembers_function amadjustmembers
Definition: amapi.h:287
ambuild_function ambuild
Definition: amapi.h:274
bool amstorage
Definition: amapi.h:247
uint16 amstrategies
Definition: amapi.h:225
bool amoptionalkey
Definition: amapi.h:241
amgettuple_function amgettuple
Definition: amapi.h:290
amcanreturn_function amcanreturn
Definition: amapi.h:280
bool amcanunique
Definition: amapi.h:237
amgetbitmap_function amgetbitmap
Definition: amapi.h:291
amproperty_function amproperty
Definition: amapi.h:284
ambulkdelete_function ambulkdelete
Definition: amapi.h:278
bool amsearcharray
Definition: amapi.h:243
amvalidate_function amvalidate
Definition: amapi.h:286
ammarkpos_function ammarkpos
Definition: amapi.h:293
bool amcanmulticol
Definition: amapi.h:239
bool amusemaintenanceworkmem
Definition: amapi.h:259
ambeginscan_function ambeginscan
Definition: amapi.h:288
bool amcanparallel
Definition: amapi.h:253
amrescan_function amrescan
Definition: amapi.h:289
bool amcanorder
Definition: amapi.h:231
bool amcanbuildparallel
Definition: amapi.h:255
aminitparallelscan_function aminitparallelscan
Definition: amapi.h:298
uint8 amparallelvacuumoptions
Definition: amapi.h:263
aminsertcleanup_function aminsertcleanup
Definition: amapi.h:277
bool amcanbackward
Definition: amapi.h:235
amgettreeheight_function amgettreeheight
Definition: amapi.h:282
bool amcaninclude
Definition: amapi.h:257
bool amsearchnulls
Definition: amapi.h:245
#define VACUUM_OPTION_PARALLEL_CLEANUP
Definition: vacuum.h:63
#define VACUUM_OPTION_PARALLEL_BULKDEL
Definition: vacuum.h:48

References IndexAmRoutine::amadjustmembers, IndexAmRoutine::ambeginscan, IndexAmRoutine::ambuild, IndexAmRoutine::ambuildempty, IndexAmRoutine::ambuildphasename, IndexAmRoutine::ambulkdelete, IndexAmRoutine::amcanbackward, IndexAmRoutine::amcanbuildparallel, IndexAmRoutine::amcaninclude, IndexAmRoutine::amcanmulticol, IndexAmRoutine::amcanorder, IndexAmRoutine::amcanorderbyop, IndexAmRoutine::amcanparallel, IndexAmRoutine::amcanreturn, IndexAmRoutine::amcanunique, IndexAmRoutine::amclusterable, IndexAmRoutine::amcostestimate, IndexAmRoutine::amendscan, IndexAmRoutine::amestimateparallelscan, IndexAmRoutine::amgetbitmap, IndexAmRoutine::amgettreeheight, IndexAmRoutine::amgettuple, IndexAmRoutine::aminitparallelscan, IndexAmRoutine::aminsert, IndexAmRoutine::aminsertcleanup, IndexAmRoutine::amkeytype, IndexAmRoutine::ammarkpos, IndexAmRoutine::amoptionalkey, IndexAmRoutine::amoptions, IndexAmRoutine::amoptsprocnum, IndexAmRoutine::amparallelrescan, IndexAmRoutine::amparallelvacuumoptions, IndexAmRoutine::ampredlocks, IndexAmRoutine::amproperty, IndexAmRoutine::amrescan, IndexAmRoutine::amrestrpos, IndexAmRoutine::amsearcharray, IndexAmRoutine::amsearchnulls, IndexAmRoutine::amstorage, IndexAmRoutine::amstrategies, IndexAmRoutine::amsupport, IndexAmRoutine::amusemaintenanceworkmem, IndexAmRoutine::amvacuumcleanup, IndexAmRoutine::amvalidate, blbeginscan(), blbuild(), blbuildempty(), blbulkdelete(), blcostestimate(), blendscan(), blgetbitmap(), blinsert(), BLOOM_NPROC, BLOOM_NSTRATEGIES, BLOOM_OPTIONS_PROC, bloptions(), blrescan(), blvacuumcleanup(), blvalidate(), InvalidOid, makeNode, PG_RETURN_POINTER, VACUUM_OPTION_PARALLEL_BULKDEL, and VACUUM_OPTION_PARALLEL_CLEANUP.

◆ BloomFillMetapage()

void BloomFillMetapage ( Relation  index,
Page  metaPage 
)

Definition at line 417 of file blutils.c.

418 {
420  BloomMetaPageData *metadata;
421 
422  /*
423  * Choose the index's options. If reloptions have been assigned, use
424  * those, otherwise create default options.
425  */
426  opts = (BloomOptions *) index->rd_options;
427  if (!opts)
429 
430  /*
431  * Initialize contents of meta page, including a copy of the options,
432  * which are now frozen for the life of the index.
433  */
434  BloomInitPage(metaPage, BLOOM_META);
435  metadata = BloomPageGetMeta(metaPage);
436  memset(metadata, 0, sizeof(BloomMetaPageData));
437  metadata->magickNumber = BLOOM_MAGICK_NUMBER;
438  metadata->opts = *opts;
439  ((PageHeader) metaPage)->pd_lower += sizeof(BloomMetaPageData);
440 
441  /* If this fails, probably FreeBlockNumberArray size calc is wrong: */
442  Assert(((PageHeader) metaPage)->pd_lower <= ((PageHeader) metaPage)->pd_upper);
443 }
#define BloomPageGetMeta(page)
Definition: bloom.h:136
struct BloomMetaPageData BloomMetaPageData
#define BLOOM_MAGICK_NUMBER
Definition: bloom.h:131
#define BLOOM_META
Definition: bloom.h:46
void BloomInitPage(Page page, uint16 flags)
Definition: blutils.c:402
static BloomOptions * makeDefaultBloomOptions(void)
Definition: blutils.c:87
PageHeaderData * PageHeader
Definition: bufpage.h:173
#define Assert(condition)
Definition: c.h:861
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:77
static AmcheckOptions opts
Definition: pg_amcheck.c:111
BloomOptions opts
Definition: bloom.h:126
uint32 magickNumber
Definition: bloom.h:123
Definition: type.h:95

References Assert, BLOOM_MAGICK_NUMBER, BLOOM_META, BloomInitPage(), BloomPageGetMeta, if(), BloomMetaPageData::magickNumber, makeDefaultBloomOptions(), BloomMetaPageData::opts, and opts.

Referenced by BloomInitMetapage().

◆ BloomFormTuple()

BloomTuple* BloomFormTuple ( BloomState state,
ItemPointer  iptr,
Datum values,
bool isnull 
)

Definition at line 296 of file blutils.c.

297 {
298  int i;
299  BloomTuple *res = (BloomTuple *) palloc0(state->sizeOfBloomTuple);
300 
301  res->heapPtr = *iptr;
302 
303  /* Blooming each column */
304  for (i = 0; i < state->nColumns; i++)
305  {
306  /* skip nulls */
307  if (isnull[i])
308  continue;
309 
310  signValue(state, res->sign, values[i], i);
311  }
312 
313  return res;
314 }
void signValue(BloomState *state, BloomSignatureWord *sign, Datum value, int attno)
Definition: blutils.c:263
static Datum values[MAXATTR]
Definition: bootstrap.c:150
void * palloc0(Size size)
Definition: mcxt.c:1347
Definition: regguts.h:323

References i, palloc0(), res, signValue(), and values.

Referenced by blinsert(), and bloomBuildCallback().

◆ BloomInitMetapage()

void BloomInitMetapage ( Relation  index,
ForkNumber  forknum 
)

Definition at line 449 of file blutils.c.

450 {
451  Buffer metaBuffer;
452  Page metaPage;
454 
455  /*
456  * Make a new page; since it is first page it should be associated with
457  * block number 0 (BLOOM_METAPAGE_BLKNO). No need to hold the extension
458  * lock because there cannot be concurrent inserters yet.
459  */
460  metaBuffer = ReadBufferExtended(index, forknum, P_NEW, RBM_NORMAL, NULL);
461  LockBuffer(metaBuffer, BUFFER_LOCK_EXCLUSIVE);
463 
464  /* Initialize contents of meta page */
466  metaPage = GenericXLogRegisterBuffer(state, metaBuffer,
468  BloomFillMetapage(index, metaPage);
470 
471  UnlockReleaseBuffer(metaBuffer);
472 }
#define BLOOM_METAPAGE_BLKNO
Definition: bloom.h:78
void BloomFillMetapage(Relation index, Page metaPage)
Definition: blutils.c:417
int Buffer
Definition: buf.h:23
BlockNumber BufferGetBlockNumber(Buffer buffer)
Definition: bufmgr.c:3706
void UnlockReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:4923
void LockBuffer(Buffer buffer, int mode)
Definition: bufmgr.c:5140
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
Definition: bufmgr.c:793
#define P_NEW
Definition: bufmgr.h:184
#define BUFFER_LOCK_EXCLUSIVE
Definition: bufmgr.h:191
@ RBM_NORMAL
Definition: bufmgr.h:45
Pointer Page
Definition: bufpage.h:81
Page GenericXLogRegisterBuffer(GenericXLogState *state, Buffer buffer, int flags)
Definition: generic_xlog.c:299
GenericXLogState * GenericXLogStart(Relation relation)
Definition: generic_xlog.c:269
XLogRecPtr GenericXLogFinish(GenericXLogState *state)
Definition: generic_xlog.c:337
#define GENERIC_XLOG_FULL_IMAGE
Definition: generic_xlog.h:26

References Assert, BLOOM_METAPAGE_BLKNO, BloomFillMetapage(), BUFFER_LOCK_EXCLUSIVE, BufferGetBlockNumber(), GENERIC_XLOG_FULL_IMAGE, GenericXLogFinish(), GenericXLogRegisterBuffer(), GenericXLogStart(), LockBuffer(), P_NEW, RBM_NORMAL, ReadBufferExtended(), and UnlockReleaseBuffer().

Referenced by blbuild(), and blbuildempty().

◆ BloomInitPage()

void BloomInitPage ( Page  page,
uint16  flags 
)

Definition at line 402 of file blutils.c.

403 {
404  BloomPageOpaque opaque;
405 
406  PageInit(page, BLCKSZ, sizeof(BloomPageOpaqueData));
407 
408  opaque = BloomPageGetOpaque(page);
409  opaque->flags = flags;
410  opaque->bloom_page_id = BLOOM_PAGE_ID;
411 }
#define BloomPageGetOpaque(page)
Definition: bloom.h:60
#define BLOOM_PAGE_ID
Definition: bloom.h:57
void PageInit(Page page, Size pageSize, Size specialSize)
Definition: bufpage.c:42
uint16 flags
Definition: bloom.h:36
uint16 bloom_page_id
Definition: bloom.h:40

References BloomPageOpaqueData::bloom_page_id, BLOOM_PAGE_ID, BloomPageGetOpaque, BloomPageOpaqueData::flags, and PageInit().

Referenced by blinsert(), BloomFillMetapage(), and initCachedPage().

◆ BloomNewBuffer()

Buffer BloomNewBuffer ( Relation  index)

Definition at line 356 of file blutils.c.

357 {
358  Buffer buffer;
359 
360  /* First, try to get a page from FSM */
361  for (;;)
362  {
364 
365  if (blkno == InvalidBlockNumber)
366  break;
367 
368  buffer = ReadBuffer(index, blkno);
369 
370  /*
371  * We have to guard against the possibility that someone else already
372  * recycled this page; the buffer may be locked if so.
373  */
374  if (ConditionalLockBuffer(buffer))
375  {
376  Page page = BufferGetPage(buffer);
377 
378  if (PageIsNew(page))
379  return buffer; /* OK to use, if never initialized */
380 
381  if (BloomPageIsDeleted(page))
382  return buffer; /* OK to use */
383 
385  }
386 
387  /* Can't use it, so release buffer and try again */
388  ReleaseBuffer(buffer);
389  }
390 
391  /* Must extend the file */
392  buffer = ExtendBufferedRel(BMR_REL(index), MAIN_FORKNUM, NULL,
393  EB_LOCK_FIRST);
394 
395  return buffer;
396 }
uint32 BlockNumber
Definition: block.h:31
#define InvalidBlockNumber
Definition: block.h:33
#define BloomPageIsDeleted(page)
Definition: bloom.h:64
Buffer ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags)
Definition: bufmgr.c:846
bool ConditionalLockBuffer(Buffer buffer)
Definition: bufmgr.c:5166
void ReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:4906
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
Definition: bufmgr.c:746
#define BUFFER_LOCK_UNLOCK
Definition: bufmgr.h:189
static Page BufferGetPage(Buffer buffer)
Definition: bufmgr.h:400
@ EB_LOCK_FIRST
Definition: bufmgr.h:86
#define BMR_REL(p_rel)
Definition: bufmgr.h:107
static bool PageIsNew(Page page)
Definition: bufpage.h:233
BlockNumber GetFreeIndexPage(Relation rel)
Definition: indexfsm.c:38
@ MAIN_FORKNUM
Definition: relpath.h:58

References BloomPageIsDeleted, BMR_REL, BUFFER_LOCK_UNLOCK, BufferGetPage(), ConditionalLockBuffer(), EB_LOCK_FIRST, ExtendBufferedRel(), GetFreeIndexPage(), InvalidBlockNumber, LockBuffer(), MAIN_FORKNUM, PageIsNew(), ReadBuffer(), and ReleaseBuffer().

Referenced by blinsert(), and flushCachedPage().

◆ BloomPageAddItem()

bool BloomPageAddItem ( BloomState state,
Page  page,
BloomTuple tuple 
)

Definition at line 321 of file blutils.c.

322 {
323  BloomTuple *itup;
324  BloomPageOpaque opaque;
325  Pointer ptr;
326 
327  /* We shouldn't be pointed to an invalid page */
328  Assert(!PageIsNew(page) && !BloomPageIsDeleted(page));
329 
330  /* Does new tuple fit on the page? */
331  if (BloomPageGetFreeSpace(state, page) < state->sizeOfBloomTuple)
332  return false;
333 
334  /* Copy new tuple to the end of page */
335  opaque = BloomPageGetOpaque(page);
336  itup = BloomPageGetTuple(state, page, opaque->maxoff + 1);
337  memcpy((Pointer) itup, (Pointer) tuple, state->sizeOfBloomTuple);
338 
339  /* Adjust maxoff and pd_lower */
340  opaque->maxoff++;
341  ptr = (Pointer) BloomPageGetTuple(state, page, opaque->maxoff + 1);
342  ((PageHeader) page)->pd_lower = ptr - page;
343 
344  /* Assert we didn't overrun available space */
345  Assert(((PageHeader) page)->pd_lower <= ((PageHeader) page)->pd_upper);
346 
347  return true;
348 }
#define BloomPageGetFreeSpace(state, page)
Definition: bloom.h:152
#define BloomPageGetTuple(state, page, offset)
Definition: bloom.h:71
char * Pointer
Definition: c.h:486
OffsetNumber maxoff
Definition: bloom.h:35

References Assert, BloomPageGetFreeSpace, BloomPageGetOpaque, BloomPageGetTuple, BloomPageIsDeleted, BloomPageOpaqueData::maxoff, and PageIsNew().

Referenced by blinsert(), and bloomBuildCallback().

◆ bloptions()

bytea* bloptions ( Datum  reloptions,
bool  validate 
)

Definition at line 478 of file blutils.c.

479 {
480  BloomOptions *rdopts;
481 
482  /* Parse the user-given reloptions */
483  rdopts = (BloomOptions *) build_reloptions(reloptions, validate,
485  sizeof(BloomOptions),
488 
489  /* Convert signature length from # of bits to # to words, rounding up */
490  if (rdopts)
491  rdopts->bloomLength = (rdopts->bloomLength + SIGNWORDBITS - 1) / SIGNWORDBITS;
492 
493  return (bytea *) rdopts;
494 }
#define SIGNWORDBITS
Definition: bloom.h:86
#define lengthof(array)
Definition: c.h:791
void * build_reloptions(Datum reloptions, bool validate, relopt_kind kind, Size relopt_struct_size, const relopt_parse_elt *relopt_elems, int num_relopt_elems)
Definition: reloptions.c:1908
int bloomLength
Definition: bloom.h:104
Definition: c.h:690

References bl_relopt_kind, bl_relopt_tab, BloomOptions::bloomLength, build_reloptions(), lengthof, and SIGNWORDBITS.

Referenced by blhandler().

◆ initBloomState()

void initBloomState ( BloomState state,
Relation  index 
)

Definition at line 164 of file blutils.c.

165 {
166  int i;
167 
168  state->nColumns = index->rd_att->natts;
169 
170  /* Initialize hash function for each attribute */
171  for (i = 0; i < index->rd_att->natts; i++)
172  {
173  fmgr_info_copy(&(state->hashFn[i]),
176  state->collations[i] = index->rd_indcollation[i];
177  }
178 
179  /* Initialize amcache if needed with options from metapage */
180  if (!index->rd_amcache)
181  {
182  Buffer buffer;
183  Page page;
184  BloomMetaPageData *meta;
186 
187  opts = MemoryContextAlloc(index->rd_indexcxt, sizeof(BloomOptions));
188 
190  LockBuffer(buffer, BUFFER_LOCK_SHARE);
191 
192  page = BufferGetPage(buffer);
193 
194  if (!BloomPageIsMeta(page))
195  elog(ERROR, "Relation is not a bloom index");
196  meta = BloomPageGetMeta(BufferGetPage(buffer));
197 
198  if (meta->magickNumber != BLOOM_MAGICK_NUMBER)
199  elog(ERROR, "Relation is not a bloom index");
200 
201  *opts = meta->opts;
202 
203  UnlockReleaseBuffer(buffer);
204 
205  index->rd_amcache = (void *) opts;
206  }
207 
208  memcpy(&state->opts, index->rd_amcache, sizeof(state->opts));
209  state->sizeOfBloomTuple = BLOOMTUPLEHDRSZ +
210  sizeof(BloomSignatureWord) * state->opts.bloomLength;
211 }
#define BLOOMTUPLEHDRSZ
Definition: bloom.h:166
#define BLOOM_HASH_PROC
Definition: bloom.h:24
uint16 BloomSignatureWord
Definition: bloom.h:84
#define BloomPageIsMeta(page)
Definition: bloom.h:62
#define BUFFER_LOCK_SHARE
Definition: bufmgr.h:190
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
Definition: fmgr.c:580
FmgrInfo * index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum)
Definition: indexam.c:862
MemoryContext CurrentMemoryContext
Definition: mcxt.c:143
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1181

References BLOOM_HASH_PROC, BLOOM_MAGICK_NUMBER, BLOOM_METAPAGE_BLKNO, BloomPageGetMeta, BloomPageIsMeta, BLOOMTUPLEHDRSZ, BUFFER_LOCK_SHARE, BufferGetPage(), CurrentMemoryContext, elog, ERROR, fmgr_info_copy(), i, index_getprocinfo(), LockBuffer(), BloomMetaPageData::magickNumber, MemoryContextAlloc(), BloomMetaPageData::opts, opts, ReadBuffer(), and UnlockReleaseBuffer().

Referenced by blbeginscan(), blbuild(), blbulkdelete(), and blinsert().

◆ makeDefaultBloomOptions()

static BloomOptions* makeDefaultBloomOptions ( void  )
static

Definition at line 87 of file blutils.c.

88 {
90  int i;
91 
92  opts = (BloomOptions *) palloc0(sizeof(BloomOptions));
93  /* Convert DEFAULT_BLOOM_LENGTH from # of bits to # of words */
94  opts->bloomLength = (DEFAULT_BLOOM_LENGTH + SIGNWORDBITS - 1) / SIGNWORDBITS;
95  for (i = 0; i < INDEX_MAX_KEYS; i++)
96  opts->bitSize[i] = DEFAULT_BLOOM_BITS;
97  SET_VARSIZE(opts, sizeof(BloomOptions));
98  return opts;
99 }
#define SET_VARSIZE(PTR, len)
Definition: varatt.h:305

References DEFAULT_BLOOM_BITS, DEFAULT_BLOOM_LENGTH, i, INDEX_MAX_KEYS, opts, palloc0(), SET_VARSIZE, and SIGNWORDBITS.

Referenced by BloomFillMetapage().

◆ myRand()

static int32 myRand ( void  )
static

Definition at line 225 of file blutils.c.

226 {
227  /*----------
228  * Compute x = (7^5 * x) mod (2^31 - 1)
229  * without overflowing 31 bits:
230  * (2^31 - 1) = 127773 * (7^5) + 2836
231  * From "Random number generators: good ones are hard to find",
232  * Park and Miller, Communications of the ACM, vol. 31, no. 10,
233  * October 1988, p. 1195.
234  *----------
235  */
236  int32 hi,
237  lo,
238  x;
239 
240  /* Must be in [1, 0x7ffffffe] range at this point. */
241  hi = next / 127773;
242  lo = next % 127773;
243  x = 16807 * lo - 2836 * hi;
244  if (x < 0)
245  x += 0x7fffffff;
246  next = x;
247  /* Transform to [0, 0x7ffffffd] range. */
248  return (x - 1);
249 }
static int32 next
Definition: blutils.c:222
signed int int32
Definition: c.h:497
int x
Definition: isn.c:71

References next, and x.

Referenced by signValue().

◆ mySrand()

static void mySrand ( uint32  seed)
static

Definition at line 252 of file blutils.c.

253 {
254  next = seed;
255  /* Transform to [1, 0x7ffffffe] range. */
256  next = (next % 0x7ffffffe) + 1;
257 }

References next.

Referenced by signValue().

◆ PG_FUNCTION_INFO_V1()

PG_FUNCTION_INFO_V1 ( blhandler  )

◆ signValue()

void signValue ( BloomState state,
BloomSignatureWord sign,
Datum  value,
int  attno 
)

Definition at line 263 of file blutils.c.

264 {
265  uint32 hashVal;
266  int nBit,
267  j;
268 
269  /*
270  * init generator with "column's" number to get "hashed" seed for new
271  * value. We don't want to map the same numbers from different columns
272  * into the same bits!
273  */
274  mySrand(attno);
275 
276  /*
277  * Init hash sequence to map our value into bits. the same values in
278  * different columns will be mapped into different bits because of step
279  * above
280  */
281  hashVal = DatumGetInt32(FunctionCall1Coll(&state->hashFn[attno], state->collations[attno], value));
282  mySrand(hashVal ^ myRand());
283 
284  for (j = 0; j < state->opts.bitSize[attno]; j++)
285  {
286  /* prevent multiple evaluation in SETBIT macro */
287  nBit = myRand() % (state->opts.bloomLength * SIGNWORDBITS);
288  SETBIT(sign, nBit);
289  }
290 }
static int32 myRand(void)
Definition: blutils.c:225
#define SETBIT(x, i)
Definition: blutils.c:32
static void mySrand(uint32 seed)
Definition: blutils.c:252
unsigned int uint32
Definition: c.h:509
Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
Definition: fmgr.c:1129
static struct @157 value
char sign
Definition: informix.c:693
int j
Definition: isn.c:74
static int32 DatumGetInt32(Datum X)
Definition: postgres.h:202

References DatumGetInt32(), FunctionCall1Coll(), j, myRand(), mySrand(), SETBIT, sign, SIGNWORDBITS, and value.

Referenced by blgetbitmap(), and BloomFormTuple().

Variable Documentation

◆ bl_relopt_kind

relopt_kind bl_relopt_kind
static

Definition at line 38 of file blutils.c.

Referenced by _PG_init(), and bloptions().

◆ bl_relopt_tab

relopt_parse_elt bl_relopt_tab[INDEX_MAX_KEYS+1]
static

Definition at line 41 of file blutils.c.

Referenced by _PG_init(), and bloptions().

◆ next

int32 next
static

Definition at line 222 of file blutils.c.

Referenced by _pglstat64(), _pgstat64(), addItemsToLeaf(), AllocSetDelete(), AllocSetReset(), appendBoolResult(), astreamer_gzip_decompressor_new(), astreamer_lz4_compressor_new(), astreamer_lz4_decompressor_new(), astreamer_recovery_injector_new(), astreamer_tar_archiver_new(), astreamer_tar_parser_new(), astreamer_tar_terminator_new(), astreamer_verify_content_new(), astreamer_zstd_compressor_new(), astreamer_zstd_decompressor_new(), AtEOSubXact_SPI(), AtSubAbort_Snapshot(), bbsink_gzip_new(), bbsink_lz4_new(), bbsink_progress_new(), bbsink_server_new(), bbsink_throttle_new(), bbsink_zstd_new(), CallSubXactCallbacks(), CallXactCallbacks(), deallocate_one(), delete_item_from_bucket(), delete_key_from_bucket(), descriptor_deallocate_all(), do_setval(), doLog(), dsa_trim(), ecpg_register_prepared_stmt(), ecpg_sqlda_align_add_size(), ECPGconnect(), encrypt_init(), encrypt_process(), entry_purge_tuples(), ExecHashTableDetachBatch(), ExecParallelHashNextTuple(), executeKeyValueMethod(), executeNextItem(), executeNumericItemMethod(), extract_jsp_path_expr_nodes(), find_struct(), find_struct_member(), find_variable(), flattenJsonPathParseItem(), FreePageManagerGetInternal(), FreePagePopSpanLeader(), get_nextfield(), get_source_line(), get_typedef(), getNextFlagFromString(), GinDataLeafPageGetItems(), heap_lock_updated_tuple_rec(), infer_arbiter_indexes(), intset_iterate_next(), IssuePendingWritebacks(), LagTrackerRead(), lrq_alloc(), make_new_segment(), merge_children(), myRand(), mySrand(), nextval_internal(), pg_event_trigger_dropped_objects(), pgstat_flush_pending_entries(), pkt_stream_flush(), pkt_stream_process(), plpgsql_destroy_econtext(), plpgsql_subxact_cb(), PostPrepare_smgr(), pqTraceOutputNchar(), prepare_common(), pushf_create(), ReadMultiXactIdRange(), rebin_segment(), RelationPreserveStorage(), ReorderBufferIterTXNNext(), replace_auto_config_value(), ResourceOwnerReleaseInternal(), setCompoundAffixFlagValue(), setval3_oid(), setval_oid(), simple_oid_list_destroy(), simple_ptr_list_destroy(), simple_string_list_destroy(), smgrDoPendingDeletes(), SPI_freetuptable(), StandbyReleaseXidEntryLocks(), unicode_normalize(), unlink_segment(), and unlink_span().