PostgreSQL Source Code  git master
blscan.c File Reference
#include "postgres.h"
#include "access/relscan.h"
#include "bloom.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "storage/bufmgr.h"
#include "storage/lmgr.h"
#include "utils/memutils.h"
#include "utils/rel.h"
Include dependency graph for blscan.c:

Go to the source code of this file.

Functions

IndexScanDesc blbeginscan (Relation r, int nkeys, int norderbys)
 
void blrescan (IndexScanDesc scan, ScanKey scankey, int nscankeys, ScanKey orderbys, int norderbys)
 
void blendscan (IndexScanDesc scan)
 
int64 blgetbitmap (IndexScanDesc scan, TIDBitmap *tbm)
 

Function Documentation

◆ blbeginscan()

IndexScanDesc blbeginscan ( Relation  r,
int  nkeys,
int  norderbys 
)

Definition at line 28 of file blscan.c.

29 {
30  IndexScanDesc scan;
31  BloomScanOpaque so;
32 
33  scan = RelationGetIndexScan(r, nkeys, norderbys);
34 
36  initBloomState(&so->state, scan->indexRelation);
37  so->sign = NULL;
38 
39  scan->opaque = so;
40 
41  return scan;
42 }
void initBloomState(BloomState *state, Relation index)
Definition: blutils.c:164
BloomScanOpaqueData * BloomScanOpaque
Definition: bloom.h:175
IndexScanDesc RelationGetIndexScan(Relation indexRelation, int nkeys, int norderbys)
Definition: genam.c:80
void * palloc(Size size)
Definition: mcxt.c:1317
BloomSignatureWord * sign
Definition: bloom.h:171
BloomState state
Definition: bloom.h:172
Relation indexRelation
Definition: relscan.h:119

References IndexScanDescData::indexRelation, initBloomState(), IndexScanDescData::opaque, palloc(), RelationGetIndexScan(), BloomScanOpaqueData::sign, and BloomScanOpaqueData::state.

Referenced by blhandler().

◆ blendscan()

void blendscan ( IndexScanDesc  scan)

Definition at line 65 of file blscan.c.

66 {
68 
69  if (so->sign)
70  pfree(so->sign);
71  so->sign = NULL;
72 }
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:77
void pfree(void *pointer)
Definition: mcxt.c:1521

References if(), IndexScanDescData::opaque, pfree(), and BloomScanOpaqueData::sign.

Referenced by blhandler().

◆ blgetbitmap()

int64 blgetbitmap ( IndexScanDesc  scan,
TIDBitmap tbm 
)

Definition at line 78 of file blscan.c.

79 {
80  int64 ntids = 0;
82  npages;
83  int i;
86 
87  if (so->sign == NULL)
88  {
89  /* New search: have to calculate search signature */
90  ScanKey skey = scan->keyData;
91 
92  so->sign = palloc0(sizeof(BloomSignatureWord) * so->state.opts.bloomLength);
93 
94  for (i = 0; i < scan->numberOfKeys; i++)
95  {
96  /*
97  * Assume bloom-indexable operators to be strict, so nothing could
98  * be found for NULL key.
99  */
100  if (skey->sk_flags & SK_ISNULL)
101  {
102  pfree(so->sign);
103  so->sign = NULL;
104  return 0;
105  }
106 
107  /* Add next value to the signature */
108  signValue(&so->state, so->sign, skey->sk_argument,
109  skey->sk_attno - 1);
110 
111  skey++;
112  }
113  }
114 
115  /*
116  * We're going to read the whole index. This is why we use appropriate
117  * buffer access strategy.
118  */
121 
122  for (blkno = BLOOM_HEAD_BLKNO; blkno < npages; blkno++)
123  {
124  Buffer buffer;
125  Page page;
126 
128  blkno, RBM_NORMAL, bas);
129 
130  LockBuffer(buffer, BUFFER_LOCK_SHARE);
131  page = BufferGetPage(buffer);
132 
133  if (!PageIsNew(page) && !BloomPageIsDeleted(page))
134  {
135  OffsetNumber offset,
136  maxOffset = BloomPageGetMaxOffset(page);
137 
138  for (offset = 1; offset <= maxOffset; offset++)
139  {
140  BloomTuple *itup = BloomPageGetTuple(&so->state, page, offset);
141  bool res = true;
142 
143  /* Check index signature with scan signature */
144  for (i = 0; i < so->state.opts.bloomLength; i++)
145  {
146  if ((itup->sign[i] & so->sign[i]) != so->sign[i])
147  {
148  res = false;
149  break;
150  }
151  }
152 
153  /* Add matching tuples to bitmap */
154  if (res)
155  {
156  tbm_add_tuples(tbm, &itup->heapPtr, 1, true);
157  ntids++;
158  }
159  }
160  }
161 
162  UnlockReleaseBuffer(buffer);
164  }
165  FreeAccessStrategy(bas);
166 
167  return ntids;
168 }
uint32 BlockNumber
Definition: block.h:31
#define BloomPageGetMaxOffset(page)
Definition: bloom.h:61
#define BloomPageGetTuple(state, page, offset)
Definition: bloom.h:71
uint16 BloomSignatureWord
Definition: bloom.h:84
void signValue(BloomState *state, BloomSignatureWord *sign, Datum value, int attno)
Definition: blutils.c:263
#define BloomPageIsDeleted(page)
Definition: bloom.h:64
#define BLOOM_HEAD_BLKNO
Definition: bloom.h:79
int Buffer
Definition: buf.h:23
void UnlockReleaseBuffer(Buffer buffer)
Definition: bufmgr.c:4941
void LockBuffer(Buffer buffer, int mode)
Definition: bufmgr.c:5158
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
Definition: bufmgr.c:793
@ BAS_BULKREAD
Definition: bufmgr.h:36
#define BUFFER_LOCK_SHARE
Definition: bufmgr.h:190
#define RelationGetNumberOfBlocks(reln)
Definition: bufmgr.h:273
static Page BufferGetPage(Buffer buffer)
Definition: bufmgr.h:400
@ RBM_NORMAL
Definition: bufmgr.h:45
Pointer Page
Definition: bufpage.h:81
static bool PageIsNew(Page page)
Definition: bufpage.h:233
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
Definition: freelist.c:541
void FreeAccessStrategy(BufferAccessStrategy strategy)
Definition: freelist.c:681
int i
Definition: isn.c:73
void * palloc0(Size size)
Definition: mcxt.c:1347
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:122
uint16 OffsetNumber
Definition: off.h:24
@ MAIN_FORKNUM
Definition: relpath.h:58
#define SK_ISNULL
Definition: skey.h:115
int bloomLength
Definition: bloom.h:104
BloomOptions opts
Definition: bloom.h:142
BloomSignatureWord sign[FLEXIBLE_ARRAY_MEMBER]
Definition: bloom.h:163
ItemPointerData heapPtr
Definition: bloom.h:162
struct ScanKeyData * keyData
Definition: relscan.h:123
int sk_flags
Definition: skey.h:66
Datum sk_argument
Definition: skey.h:72
AttrNumber sk_attno
Definition: skey.h:67
void tbm_add_tuples(TIDBitmap *tbm, const ItemPointer tids, int ntids, bool recheck)
Definition: tidbitmap.c:377

References BAS_BULKREAD, BLOOM_HEAD_BLKNO, BloomOptions::bloomLength, BloomPageGetMaxOffset, BloomPageGetTuple, BloomPageIsDeleted, BUFFER_LOCK_SHARE, BufferGetPage(), CHECK_FOR_INTERRUPTS, FreeAccessStrategy(), GetAccessStrategy(), BloomTuple::heapPtr, i, if(), IndexScanDescData::indexRelation, IndexScanDescData::keyData, LockBuffer(), MAIN_FORKNUM, IndexScanDescData::numberOfKeys, IndexScanDescData::opaque, BloomState::opts, PageIsNew(), palloc0(), pfree(), RBM_NORMAL, ReadBufferExtended(), RelationGetNumberOfBlocks, res, BloomTuple::sign, BloomScanOpaqueData::sign, signValue(), ScanKeyData::sk_argument, ScanKeyData::sk_attno, ScanKeyData::sk_flags, SK_ISNULL, BloomScanOpaqueData::state, tbm_add_tuples(), and UnlockReleaseBuffer().

Referenced by blhandler().

◆ blrescan()

void blrescan ( IndexScanDesc  scan,
ScanKey  scankey,
int  nscankeys,
ScanKey  orderbys,
int  norderbys 
)

Definition at line 48 of file blscan.c.

50 {
52 
53  if (so->sign)
54  pfree(so->sign);
55  so->sign = NULL;
56 
57  if (scankey && scan->numberOfKeys > 0)
58  memcpy(scan->keyData, scankey, scan->numberOfKeys * sizeof(ScanKeyData));
59 }

References if(), IndexScanDescData::keyData, IndexScanDescData::numberOfKeys, IndexScanDescData::opaque, pfree(), and BloomScanOpaqueData::sign.

Referenced by blhandler().