postgres.git / summary / log / commit / refs

commit    d9fe63acb033141be695815a8a663de8dae4f8af
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Wed Jun 29 18:40:27 2011 +0000
First released in: 9.2.0, 9.1.0

    Grab predicate locks on matching tuples in a lossy bitmap heap scan.
    Non-lossy case was already handled correctly.
    
    Kevin Grittner


src/backend/executor/nodeBitmapHeapscan.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 40ad7757587..568035a481b 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -42,6 +42,7 @@ #include "executor/nodeBitmapHeapscan.h" #include "pgstat.h" #include "storage/bufmgr.h" +#include "storage/predicate.h" #include "utils/memutils.h" #include "utils/snapmgr.h" #include "utils/tqual.h" @@ -371,14 +372,23 @@ bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres) { ItemId lp; HeapTupleData loctup; + bool valid; lp = PageGetItemId(dp, offnum); if (!ItemIdIsNormal(lp)) continue; loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp); loctup.t_len = ItemIdGetLength(lp); - if (HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer)) + loctup.t_tableOid = scan->rs_rd->rd_id; + ItemPointerSet(&loctup.t_self, page, offnum); + valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); + if (valid) + { scan->rs_vistuples[ntup++] = offnum; + PredicateLockTuple(scan->rs_rd, &loctup, snapshot); + } + CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup, + buffer, snapshot); } } [parent: 79aa44536f39]