aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeBitmapHeapscan.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2011-06-29 21:40:27 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2011-06-29 21:50:42 +0300
commitd9fe63acb033141be695815a8a663de8dae4f8af (patch)
treebd7b35b9483896119b1037a543d7ecbfd48920cb /src/backend/executor/nodeBitmapHeapscan.c
parent79aa44536f3980d324f486504cde643ce23bf5c6 (diff)
downloadpostgresql-d9fe63acb033141be695815a8a663de8dae4f8af.tar.gz
postgresql-d9fe63acb033141be695815a8a663de8dae4f8af.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/backend/executor/nodeBitmapHeapscan.c')
-rw-r--r--src/backend/executor/nodeBitmapHeapscan.c12
1 files changed, 11 insertions, 1 deletions
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);
}
}