diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-06-29 21:40:27 +0300 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2011-06-29 22:10:45 +0300 |
commit | 1aa447a1e1273e51f1bb34e085c021941db86212 (patch) | |
tree | 90e5e8586287ebcc0d16c62fc8d85343a581839b /src | |
parent | 3ec6e00ece5fc7483f8890306005f97a2c640861 (diff) | |
download | postgresql-1aa447a1e1273e51f1bb34e085c021941db86212.tar.gz postgresql-1aa447a1e1273e51f1bb34e085c021941db86212.zip |
Grab predicate locks on matching tuples in a lossy bitmap heap scan.
Non-lossy case was already handled correctly.
Kevin Grittner
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/executor/nodeBitmapHeapscan.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index e20ef1433ed..c376c55f1e1 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" @@ -369,14 +370,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); } } |