PostgreSQL Source Code: src/backend/access/gist/gistget.c File Reference (original) (raw)
Go to the source code of this file.
Functions | |
---|---|
static void | gistkillitems (IndexScanDesc scan) |
static bool | gistindex_keytest (IndexScanDesc scan, IndexTuple tuple, Page page, OffsetNumber offset, bool *recheck_p, bool *recheck_distances_p) |
static void | gistScanPage (IndexScanDesc scan, GISTSearchItem *pageItem, IndexOrderByDistance *myDistances, TIDBitmap *tbm, int64 *ntids) |
static GISTSearchItem * | getNextGISTSearchItem (GISTScanOpaque so) |
static bool | getNextNearest (IndexScanDesc scan) |
bool | gistgettuple (IndexScanDesc scan, ScanDirection dir) |
int64 | gistgetbitmap (IndexScanDesc scan, TIDBitmap *tbm) |
bool | gistcanreturn (Relation index, int attno) |
◆ getNextGISTSearchItem()
◆ getNextNearest()
Definition at line 560 of file gistget.c.
561{
563 bool res = false;
564
566 {
567
570 }
571
572 do
573 {
575
576 if (!item)
577 break;
578
580 {
581
584
588
589
592 res = true;
593 }
594 else
595 {
596
598
600 }
601
603 } while (!res);
604
605 return res;
606}
GISTScanOpaqueData * GISTScanOpaque
#define GISTSearchItemIsHeap(item)
static GISTSearchItem * getNextGISTSearchItem(GISTScanOpaque so)
static void gistScanPage(IndexScanDesc scan, GISTSearchItem *pageItem, IndexOrderByDistance *myDistances, TIDBitmap *tbm, int64 *ntids)
void index_store_float8_orderby_distances(IndexScanDesc scan, Oid *orderByTypes, IndexOrderByDistance *distances, bool recheckOrderBy)
if(TABLE==NULL||TABLE_index==NULL)
void pfree(void *pointer)
#define CHECK_FOR_INTERRUPTS()
IndexOrderByDistance distances[FLEXIBLE_ARRAY_MEMBER]
union GISTSearchItem::@45 data
ItemPointerData xs_heaptid
References CHECK_FOR_INTERRUPTS, GISTSearchItem::data, GISTSearchItem::distances, getNextGISTSearchItem(), gistScanPage(), GISTSearchItemIsHeap, GISTSearchItem::heap, GISTSearchHeapItem::heapPtr, if(), index_store_float8_orderby_distances(), IndexScanDescData::opaque, GISTScanOpaqueData::orderByTypes, pfree(), GISTSearchHeapItem::recheck, GISTSearchHeapItem::recheckDistances, GISTSearchHeapItem::recontup, IndexScanDescData::xs_heaptid, IndexScanDescData::xs_hitup, IndexScanDescData::xs_recheck, and IndexScanDescData::xs_want_itup.
Referenced by gistgettuple().
◆ gistcanreturn()
bool gistcanreturn | ( | Relation | index, |
---|---|---|---|
int | attno | ||
) |
◆ gistgetbitmap()
Definition at line 745 of file gistget.c.
746{
750
752 return 0;
753
757
758
763
765 memset(&fakeItem.data.parentlsn, 0, sizeof(GistNSN));
766 gistScanPage(scan, &fakeItem, NULL, tbm, &ntids);
767
768
769
770
771
772 for (;;)
773 {
775
776 if (!item)
777 break;
778
780
782
784 }
785
786 return ntids;
787}
void MemoryContextReset(MemoryContext context)
#define pgstat_count_index_scan(rel)
MemoryContext pageDataCxt
struct IndexScanInstrumentation * instrument
References CHECK_FOR_INTERRUPTS, GISTScanOpaqueData::curPageData, GISTSearchItem::distances, getNextGISTSearchItem(), GIST_ROOT_BLKNO, gistScanPage(), if(), IndexScanDescData::indexRelation, IndexScanDescData::instrument, MemoryContextReset(), GISTScanOpaqueData::nPageData, IndexScanInstrumentation::nsearches, IndexScanDescData::opaque, GISTScanOpaqueData::pageDataCxt, pfree(), pgstat_count_index_scan, GISTScanOpaqueData::qual_ok, and IndexScanDescData::xs_hitup.
Referenced by gisthandler().
◆ gistgettuple()
Definition at line 612 of file gistget.c.
613{
615
617 elog(ERROR, "GiST only supports forward scan direction");
618
620 return false;
621
623 {
624
626
630
636
639 gistScanPage(scan, &fakeItem, NULL, NULL, NULL);
640 }
641
643 {
644
646 }
647 else
648 {
649
650 for (;;)
651 {
653 {
655 {
656
658 {
661
665
667 }
671 }
672
675
676
679
681
682 return true;
683 }
684
685
686
687
688
692 {
693
695 {
698
702
704 }
708 }
709
710 do
711 {
713
716
718
719 if (!item)
720 return false;
721
723
724
726
727
728
729
730
731
732
734
737 }
738 }
739}
#define InvalidBlockNumber
static bool getNextNearest(IndexScanDesc scan)
static void gistkillitems(IndexScanDesc scan)
#define MaxIndexTuplesPerPage
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
OffsetNumber * killedItems
GISTSearchHeapItem pageData[BLCKSZ/sizeof(IndexTupleData)]
References GISTSearchItem::blkno, CHECK_FOR_INTERRUPTS, GISTScanOpaqueData::curBlkno, GISTScanOpaqueData::curPageData, GISTSearchItem::data, GISTSearchItem::distances, elog, ERROR, GISTScanOpaqueData::firstCall, ForwardScanDirection, getNextGISTSearchItem(), getNextNearest(), GIST_ROOT_BLKNO, gistkillitems(), gistScanPage(), GISTScanOpaqueData::giststate, GISTSearchHeapItem::heapPtr, if(), IndexScanDescData::indexRelation, IndexScanDescData::instrument, InvalidBlockNumber, IndexScanDescData::kill_prior_tuple, GISTScanOpaqueData::killedItems, MaxIndexTuplesPerPage, MemoryContextReset(), MemoryContextSwitchTo(), GISTScanOpaqueData::nPageData, IndexScanInstrumentation::nsearches, IndexScanDescData::numberOfOrderBys, GISTScanOpaqueData::numKilled, GISTSearchHeapItem::offnum, IndexScanDescData::opaque, GISTScanOpaqueData::pageData, GISTScanOpaqueData::pageDataCxt, palloc(), GISTSearchItem::parentlsn, pfree(), pgstat_count_index_scan, GISTScanOpaqueData::qual_ok, GISTSearchHeapItem::recheck, GISTSearchHeapItem::recontup, GISTSTATE::scanCxt, IndexScanDescData::xs_heaptid, IndexScanDescData::xs_hitup, IndexScanDescData::xs_recheck, and IndexScanDescData::xs_want_itup.
Referenced by gisthandler().
◆ gistindex_keytest()
Definition at line 125 of file gistget.c.
131{
138
139 *recheck_p = false;
140 *recheck_distances_p = false;
141
142
143
144
145
146
148 {
149 int i;
150
152 elog(ERROR, "invalid GiST tuple found on leaf page");
154 {
157 }
158 return true;
159 }
160
161
162 while (keySize > 0)
163 {
165 bool isNull;
166
168 key->sk_attno,
169 giststate->leafTupdesc,
170 &isNull);
171
173 {
174
175
176
177
178
179
181 {
183 return false;
184 }
185 else
186 {
188 if (isNull)
189 return false;
190 }
191 }
192 else if (isNull)
193 {
194 return false;
195 }
196 else
197 {
199 bool recheck;
201
203 datum, r, page, offset,
204 false, isNull);
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219 recheck = true;
220
222 key->sk_collation,
224 key->sk_argument,
228
230 return false;
231 *recheck_p |= recheck;
232 }
233
235 keySize--;
236 }
237
238
242 while (keySize > 0)
243 {
245 bool isNull;
246
248 key->sk_attno,
249 giststate->leafTupdesc,
250 &isNull);
251
253 {
254
255 distance_p->value = 0.0;
256 distance_p->isnull = true;
257 }
258 else
259 {
261 bool recheck;
263
265 datum, r, page, offset,
266 false, isNull);
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284 recheck = false;
286 key->sk_collation,
288 key->sk_argument,
292 *recheck_distances_p |= recheck;
294 distance_p->isnull = false;
295 }
296
298 distance_p++;
299 keySize--;
300 }
301
302 return true;
303}
static float8 get_float8_infinity(void)
Datum FunctionCall5Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5)
#define GistPageIsLeaf(page)
#define GistTupleIsInvalid(itup)
void gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, Datum k, Relation r, Page pg, OffsetNumber o, bool l, bool isNull)
Assert(PointerIsAligned(start, uint64))
static Datum index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
static Datum Int16GetDatum(int16 X)
static float8 DatumGetFloat8(Datum X)
static Datum ObjectIdGetDatum(Oid X)
IndexOrderByDistance * distances
struct ScanKeyData * keyData
struct ScanKeyData * orderByData
References Assert(), DatumGetBool(), DatumGetFloat8(), GISTScanOpaqueData::distances, elog, ERROR, FunctionCall5Coll(), get_float8_infinity(), gistdentryinit(), GistPageIsLeaf, GISTScanOpaqueData::giststate, GistTupleIsInvalid, i, if(), index_getattr(), IndexScanDescData::indexRelation, Int16GetDatum(), IndexOrderByDistance::isnull, sort-test::key, IndexScanDescData::keyData, IndexScanDescData::numberOfKeys, IndexScanDescData::numberOfOrderBys, ObjectIdGetDatum(), IndexScanDescData::opaque, IndexScanDescData::orderByData, PointerGetDatum(), SK_ISNULL, SK_SEARCHNOTNULL, SK_SEARCHNULL, test(), and IndexOrderByDistance::value.
Referenced by gistScanPage().
◆ gistkillitems()
Definition at line 38 of file gistget.c.
39{
45 int i;
46 bool killedsomething = false;
47
51
54 return;
55
59
60
61
62
63
64
66 {
68 so->numKilled = 0;
69 return;
70 }
71
73
74
75
76
77
79 {
83 killedsomething = true;
84 }
85
86 if (killedsomething)
87 {
90 }
91
93
94
95
96
97
99}
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
void MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
static Page BufferGetPage(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
#define GistMarkPageHasGarbage(page)
void gistcheckpage(Relation rel, Buffer buf)
#define ItemIdMarkDead(itemId)
#define XLogRecPtrIsInvalid(r)
References Assert(), BufferGetLSNAtomic(), BufferGetPage(), BufferIsValid(), GISTScanOpaqueData::curBlkno, GISTScanOpaqueData::curPageLSN, GIST_SHARE, gistcheckpage(), GistMarkPageHasGarbage, GistPageIsLeaf, i, IndexScanDescData::indexRelation, InvalidBlockNumber, ItemIdMarkDead, GISTScanOpaqueData::killedItems, LockBuffer(), MarkBufferDirtyHint(), GISTScanOpaqueData::numKilled, IndexScanDescData::opaque, PageGetItemId(), ReadBuffer(), UnlockReleaseBuffer(), and XLogRecPtrIsInvalid.
Referenced by gistgettuple().
◆ gistScanPage()
Definition at line 328 of file gistget.c.
330{
340
342
349
350
351
352
353
354
355
360 {
361
363
364
365 Assert(myDistances != NULL);
366
368
369
371 item->blkno = opaque->rightlink;
373
374
375 memcpy(item->distances, myDistances,
377
379
381 }
382
383
384
385
386
387
388
389
390
392 {
394 return;
395 }
396
398 scan->xs_hitup = NULL;
401
402
403
404
405
406
408
409
410
411
414 {
417 bool match;
418 bool recheck;
419 bool recheck_distances;
420
421
422
423
424
426 continue;
427
429
430
431
432
433
435
437 &recheck, &recheck_distances);
438
441
442
443 if (!match)
444 continue;
445
447 {
448
449
450
451
453 (*ntids)++;
454 }
456 {
457
458
459
463
464
465
466
467
469 {
474 }
476 }
477 else
478 {
479
480
481
482
483
486
488
489
491
493 {
494
499
500
501
502
505 }
506 else
507 {
508
510
511
512
513
514
515
517 }
518
519
521 sizeof(item->distances[0]) * nOrderBys);
522
524
526 }
527 }
528
530}
BlockNumber BufferGetBlockNumber(Buffer buffer)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define GistFollowRight(page)
#define GistPageIsDeleted(page)
#define GistPageGetOpaque(page)
#define GistPageGetNSN(page)
#define SizeOfGISTSearchItem(n_distances)
static bool gistindex_keytest(IndexScanDesc scan, IndexTuple tuple, Page page, OffsetNumber offset, bool *recheck_p, bool *recheck_distances_p)
HeapTuple gistFetchTuple(GISTSTATE *giststate, Relation r, IndexTuple tuple)
#define ItemIdIsDead(itemId)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
IndexTupleData * IndexTuple
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
void pairingheap_add(pairingheap *heap, pairingheap_node *node)
void PredicateLockPage(Relation relation, BlockNumber blkno, Snapshot snapshot)
bool ignore_killed_tuples
struct SnapshotData * xs_snapshot
void tbm_add_tuples(TIDBitmap *tbm, const ItemPointer tids, int ntids, bool recheck)
References Assert(), GISTSearchItem::blkno, BufferGetBlockNumber(), BufferGetLSNAtomic(), BufferGetPage(), GISTScanOpaqueData::curPageData, GISTScanOpaqueData::curPageLSN, GISTSearchItem::data, GISTSearchItem::distances, GISTScanOpaqueData::distances, FirstOffsetNumber, GIST_SHARE, gistcheckpage(), gistFetchTuple(), GistFollowRight, gistindex_keytest(), GistPageGetNSN, GistPageGetOpaque, GistPageIsDeleted, GistPageIsLeaf, GISTSearchItemIsHeap, GISTScanOpaqueData::giststate, GISTSearchItem::heap, GISTSearchHeapItem::heapPtr, i, IndexScanDescData::ignore_killed_tuples, IndexScanDescData::indexRelation, InvalidBlockNumber, ItemIdIsDead, ItemPointerGetBlockNumber(), LockBuffer(), MemoryContextReset(), MemoryContextSwitchTo(), GISTScanOpaqueData::nPageData, IndexScanDescData::numberOfOrderBys, GISTSearchHeapItem::offnum, OffsetNumberNext, IndexScanDescData::opaque, GISTScanOpaqueData::pageData, GISTScanOpaqueData::pageDataCxt, PageGetItem(), PageGetItemId(), PageGetMaxOffsetNumber(), pairingheap_add(), palloc(), GISTSearchItem::parentlsn, GISTSearchItem::phNode, PredicateLockPage(), GISTScanOpaqueData::queue, GISTScanOpaqueData::queueCxt, ReadBuffer(), GISTSearchHeapItem::recheck, GISTSearchHeapItem::recheckDistances, GISTSearchHeapItem::recontup, SizeOfGISTSearchItem, IndexTupleData::t_tid, tbm_add_tuples(), GISTSTATE::tempCxt, UnlockReleaseBuffer(), XLogRecPtrIsInvalid, IndexScanDescData::xs_hitup, IndexScanDescData::xs_snapshot, and IndexScanDescData::xs_want_itup.
Referenced by getNextNearest(), gistgetbitmap(), and gistgettuple().