aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/heap/heapam.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index d107e14690c..9926e2bd546 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -603,8 +603,14 @@ heapgettup(HeapScanDesc scan,
* forward scanners.
*/
scan->rs_base.rs_flags &= ~SO_ALLOW_SYNC;
- /* start from last page of the scan */
- if (scan->rs_startblock > 0)
+
+ /*
+ * Start from last page of the scan. Ensure we take into account
+ * rs_numblocks if it's been adjusted by heap_setscanlimits().
+ */
+ if (scan->rs_numblocks != InvalidBlockNumber)
+ page = (scan->rs_startblock + scan->rs_numblocks - 1) % scan->rs_nblocks;
+ else if (scan->rs_startblock > 0)
page = scan->rs_startblock - 1;
else
page = scan->rs_nblocks - 1;
@@ -918,8 +924,14 @@ heapgettup_pagemode(HeapScanDesc scan,
* forward scanners.
*/
scan->rs_base.rs_flags &= ~SO_ALLOW_SYNC;
- /* start from last page of the scan */
- if (scan->rs_startblock > 0)
+
+ /*
+ * Start from last page of the scan. Ensure we take into account
+ * rs_numblocks if it's been adjusted by heap_setscanlimits().
+ */
+ if (scan->rs_numblocks != InvalidBlockNumber)
+ page = (scan->rs_startblock + scan->rs_numblocks - 1) % scan->rs_nblocks;
+ else if (scan->rs_startblock > 0)
page = scan->rs_startblock - 1;
else
page = scan->rs_nblocks - 1;