From 5b29a4b6353d35d30cabbc67fe9e0b66b24d93a3 Mon Sep 17 00:00:00 2001 From: Edmund Horner Date: Fri, 12 Oct 2018 16:28:58 +1300 Subject: [PATCH 3/4] Support backward scans over restricted ranges in heap access method This is required for backward Tid scans. --- src/backend/access/heap/heapam.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index fb63471..0d736f2 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -575,11 +575,22 @@ heapgettup(HeapScanDesc scan, * forward scanners. */ scan->rs_syncscan = false; + /* start from last page of the scan */ - if (scan->rs_startblock > 0) - page = scan->rs_startblock - 1; + if (scan->rs_numblocks == InvalidBlockNumber) + { + /* Scanning the full relation: start just before start block. */ + if (scan->rs_startblock > 0) + page = scan->rs_startblock - 1; + else + page = scan->rs_nblocks - 1; + } else - page = scan->rs_nblocks - 1; + { + /* Scanning a restricted range: start at end of range. */ + page = scan->rs_startblock + scan->rs_numblocks - 1; + } + heapgetpage(scan, page); } else @@ -876,11 +887,22 @@ heapgettup_pagemode(HeapScanDesc scan, * forward scanners. */ scan->rs_syncscan = false; + /* start from last page of the scan */ - if (scan->rs_startblock > 0) - page = scan->rs_startblock - 1; + if (scan->rs_numblocks == InvalidBlockNumber) + { + /* Scanning the full relation: start just before start block. */ + if (scan->rs_startblock > 0) + page = scan->rs_startblock - 1; + else + page = scan->rs_nblocks - 1; + } else - page = scan->rs_nblocks - 1; + { + /* Scanning a restricted range: start at end of range. */ + page = scan->rs_startblock + scan->rs_numblocks - 1; + } + heapgetpage(scan, page); } else -- 2.7.4