Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1aa447a

Browse files
committed
Grab predicate locks on matching tuples in a lossy bitmap heap scan.
Non-lossy case was already handled correctly. Kevin Grittner
1 parent 3ec6e00 commit 1aa447a

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/backend/executor/nodeBitmapHeapscan.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "executor/nodeBitmapHeapscan.h"
4343
#include "pgstat.h"
4444
#include "storage/bufmgr.h"
45+
#include "storage/predicate.h"
4546
#include "utils/memutils.h"
4647
#include "utils/snapmgr.h"
4748
#include "utils/tqual.h"
@@ -369,14 +370,23 @@ bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres)
369370
{
370371
ItemId lp;
371372
HeapTupleData loctup;
373+
bool valid;
372374

373375
lp = PageGetItemId(dp, offnum);
374376
if (!ItemIdIsNormal(lp))
375377
continue;
376378
loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
377379
loctup.t_len = ItemIdGetLength(lp);
378-
if (HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer))
380+
loctup.t_tableOid = scan->rs_rd->rd_id;
381+
ItemPointerSet(&loctup.t_self, page, offnum);
382+
valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer);
383+
if (valid)
384+
{
379385
scan->rs_vistuples[ntup++] = offnum;
386+
PredicateLockTuple(scan->rs_rd, &loctup, snapshot);
387+
}
388+
CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup,
389+
buffer, snapshot);
380390
}
381391
}
382392

0 commit comments

Comments
 (0)