OSDN Git Service
(root)
/
pg-rex
/
syncrep.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Grab predicate locks on matching tuples in a lossy bitmap heap scan.
[pg-rex/syncrep.git]
/
src
/
backend
/
executor
/
nodeBitmapHeapscan.c
diff --git
a/src/backend/executor/nodeBitmapHeapscan.c
b/src/backend/executor/nodeBitmapHeapscan.c
index
40ad775
..
568035a
100644
(file)
--- 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 "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"
#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;
{
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);
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;
scan->rs_vistuples[ntup++] = offnum;
+ PredicateLockTuple(scan->rs_rd, &loctup, snapshot);
+ }
+ CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup,
+ buffer, snapshot);
}
}
}
}