@@ -277,7 +277,6 @@ initscan(HeapScanDesc scan, ScanKey key, bool is_rescan)
277277 scan -> rs_startblock = 0 ;
278278 }
279279
280- scan -> rs_initblock = 0 ;
281280 scan -> rs_numblocks = InvalidBlockNumber ;
282281 scan -> rs_inited = false;
283282 scan -> rs_ctup .t_data = NULL ;
@@ -302,11 +301,22 @@ initscan(HeapScanDesc scan, ScanKey key, bool is_rescan)
302301 pgstat_count_heap_scan (scan -> rs_rd );
303302}
304303
304+ /*
305+ * heap_setscanlimits - restrict range of a heapscan
306+ *
307+ * startBlk is the page to start at
308+ * numBlks is number of pages to scan (InvalidBlockNumber means "all")
309+ */
305310void
306311heap_setscanlimits (HeapScanDesc scan , BlockNumber startBlk , BlockNumber numBlks )
307312{
313+ Assert (!scan -> rs_inited ); /* else too late to change */
314+ Assert (!scan -> rs_syncscan ); /* else rs_startblock is significant */
315+
316+ /* Check startBlk is valid (but allow case of zero blocks...) */
317+ Assert (startBlk == 0 || startBlk < scan -> rs_nblocks );
318+
308319 scan -> rs_startblock = startBlk ;
309- scan -> rs_initblock = startBlk ;
310320 scan -> rs_numblocks = numBlks ;
311321}
312322
@@ -477,7 +487,7 @@ heapgettup(HeapScanDesc scan,
477487 /*
478488 * return null immediately if relation is empty
479489 */
480- if (scan -> rs_nblocks == 0 )
490+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
481491 {
482492 Assert (!BufferIsValid (scan -> rs_cbuf ));
483493 tuple -> t_data = NULL ;
@@ -511,7 +521,7 @@ heapgettup(HeapScanDesc scan,
511521 /*
512522 * return null immediately if relation is empty
513523 */
514- if (scan -> rs_nblocks == 0 )
524+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
515525 {
516526 Assert (!BufferIsValid (scan -> rs_cbuf ));
517527 tuple -> t_data = NULL ;
@@ -651,7 +661,7 @@ heapgettup(HeapScanDesc scan,
651661 if (backward )
652662 {
653663 finished = (page == scan -> rs_startblock ) ||
654- (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks < = 0 : false);
664+ (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks = = 0 : false);
655665 if (page == 0 )
656666 page = scan -> rs_nblocks ;
657667 page -- ;
@@ -662,7 +672,7 @@ heapgettup(HeapScanDesc scan,
662672 if (page >= scan -> rs_nblocks )
663673 page = 0 ;
664674 finished = (page == scan -> rs_startblock ) ||
665- (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks < = 0 : false);
675+ (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks = = 0 : false);
666676
667677 /*
668678 * Report our new scan position for synchronization purposes. We
@@ -754,7 +764,7 @@ heapgettup_pagemode(HeapScanDesc scan,
754764 /*
755765 * return null immediately if relation is empty
756766 */
757- if (scan -> rs_nblocks == 0 )
767+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
758768 {
759769 Assert (!BufferIsValid (scan -> rs_cbuf ));
760770 tuple -> t_data = NULL ;
@@ -785,7 +795,7 @@ heapgettup_pagemode(HeapScanDesc scan,
785795 /*
786796 * return null immediately if relation is empty
787797 */
788- if (scan -> rs_nblocks == 0 )
798+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
789799 {
790800 Assert (!BufferIsValid (scan -> rs_cbuf ));
791801 tuple -> t_data = NULL ;
@@ -914,7 +924,7 @@ heapgettup_pagemode(HeapScanDesc scan,
914924 if (backward )
915925 {
916926 finished = (page == scan -> rs_startblock ) ||
917- (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks < = 0 : false);
927+ (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks = = 0 : false);
918928 if (page == 0 )
919929 page = scan -> rs_nblocks ;
920930 page -- ;
@@ -925,7 +935,7 @@ heapgettup_pagemode(HeapScanDesc scan,
925935 if (page >= scan -> rs_nblocks )
926936 page = 0 ;
927937 finished = (page == scan -> rs_startblock ) ||
928- (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks < = 0 : false);
938+ (scan -> rs_numblocks != InvalidBlockNumber ? -- scan -> rs_numblocks = = 0 : false);
929939
930940 /*
931941 * Report our new scan position for synchronization purposes. We
0 commit comments