summaryrefslogtreecommitdiff
path: root/src/include/access
diff options
context:
space:
mode:
authorRobert Haas2011-06-27 14:27:17 +0000
committerRobert Haas2011-06-27 14:27:17 +0000
commit4da99ea4231e3d8bbf28b666748c1028e7b7d665 (patch)
treec91fede8b34009adc608d542ec3ebbc5fab20c0c /src/include/access
parent8c8745b298d20b49e64c77c1e4ba4c8ac300e9e6 (diff)
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.
Diffstat (limited to 'src/include/access')
-rw-r--r--src/include/access/heapam.h3
-rw-r--r--src/include/access/relscan.h4
2 files changed, 3 insertions, 4 deletions
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 */