diff options
Diffstat (limited to 'src/backend/access/heap')
-rw-r--r-- | src/backend/access/heap/heapam.c | 9 | ||||
-rw-r--r-- | src/backend/access/heap/heapam_handler.c | 27 |
2 files changed, 28 insertions, 8 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 65536c72148..fa747be73ab 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -1388,8 +1388,7 @@ bool heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tuple, - Buffer *userbuf, - Relation stats_relation) + Buffer *userbuf) { ItemPointer tid = &(tuple->t_self); ItemId lp; @@ -1468,10 +1467,6 @@ heap_fetch(Relation relation, */ *userbuf = buffer; - /* Count the successful fetch against appropriate rel, if any */ - if (stats_relation != NULL) - pgstat_count_heap_fetch(stats_relation); - return true; } @@ -5097,7 +5092,7 @@ heap_lock_updated_tuple_rec(Relation rel, ItemPointer tid, TransactionId xid, block = ItemPointerGetBlockNumber(&tupid); ItemPointerCopy(&tupid, &(mytup.t_self)); - if (!heap_fetch(rel, SnapshotAny, &mytup, &buf, NULL)) + if (!heap_fetch(rel, SnapshotAny, &mytup, &buf)) { /* * if we fail to find the updated version of the tuple, it's diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index fcd4acb5aa3..00ca71a3d2a 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -149,6 +149,30 @@ heapam_index_fetch_tuple(struct IndexFetchTableData *scan, */ static bool +heapam_fetch_row_version(Relation relation, + ItemPointer tid, + Snapshot snapshot, + TupleTableSlot *slot) +{ + BufferHeapTupleTableSlot *bslot = (BufferHeapTupleTableSlot *) slot; + Buffer buffer; + + Assert(TTS_IS_BUFFERTUPLE(slot)); + + bslot->base.tupdata.t_self = *tid; + if (heap_fetch(relation, snapshot, &bslot->base.tupdata, &buffer)) + { + /* store in slot, transferring existing pin */ + ExecStorePinnedBufferHeapTuple(&bslot->base.tupdata, slot, buffer); + slot->tts_tableOid = RelationGetRelid(relation); + + return true; + } + + return false; +} + +static bool heapam_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot, Snapshot snapshot) { @@ -338,7 +362,7 @@ tuple_lock_retry: errmsg("tuple to be locked was already moved to another partition due to concurrent update"))); tuple->t_self = *tid; - if (heap_fetch(relation, &SnapshotDirty, tuple, &buffer, NULL)) + if (heap_fetch(relation, &SnapshotDirty, tuple, &buffer)) { /* * If xmin isn't what we're expecting, the slot must have @@ -517,6 +541,7 @@ static const TableAmRoutine heapam_methods = { .tuple_update = heapam_tuple_update, .tuple_lock = heapam_tuple_lock, + .tuple_fetch_row_version = heapam_fetch_row_version, .tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot, }; |