From 4da99ea4231e3d8bbf28b666748c1028e7b7d665 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 27 Jun 2011 10:27:17 -0400 Subject: Avoid having two copies of the HOT-chain search logic. It's been like this since HOT was originally introduced, but the logic is complex enough that this is a recipe for bugs, as we've already found out with SSI. So refactor heap_hot_search_buffer() so that it can satisfy the needs of index_getnext(), and make index_getnext() use that rather than duplicating the logic. This change was originally proposed by Heikki Linnakangas as part of a larger refactoring oriented towards allowing index-only scans. I extracted and adjusted this part, since it seems to have independent merit. Review by Jeff Davis. --- src/include/access/heapam.h | 3 ++- src/include/access/relscan.h | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'src/include/access') diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index fc657612ed0..ee474d6c909 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -83,7 +83,8 @@ extern bool heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tuple, Buffer *userbuf, bool keep_buf, Relation stats_relation); extern bool heap_hot_search_buffer(ItemPointer tid, Relation relation, - Buffer buffer, Snapshot snapshot, bool *all_dead); + Buffer buffer, Snapshot snapshot, HeapTuple heapTuple, + bool *all_dead, bool first_call); extern bool heap_hot_search(ItemPointer tid, Relation relation, Snapshot snapshot, bool *all_dead); diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h index 7663033723b..db1131e2600 100644 --- a/src/include/access/relscan.h +++ b/src/include/access/relscan.h @@ -84,9 +84,7 @@ typedef struct IndexScanDescData bool xs_recheck; /* T means scan keys must be rechecked */ /* state data for traversing HOT chains in index_getnext */ - bool xs_hot_dead; /* T if all members of HOT chain are dead */ - OffsetNumber xs_next_hot; /* next member of HOT chain, if any */ - TransactionId xs_prev_xmax; /* previous HOT chain member's XMAX, if any */ + bool xs_continue_hot; /* T if must keep walking HOT chain */ } IndexScanDescData; /* Struct for heap-or-index scans of system tables */ -- cgit v1.2.3