@@ -277,7 +277,6 @@ initscan(HeapScanDesc scan, ScanKey key, bool is_rescan)
277
277
scan -> rs_startblock = 0 ;
278
278
}
279
279
280
- scan -> rs_initblock = 0 ;
281
280
scan -> rs_numblocks = InvalidBlockNumber ;
282
281
scan -> rs_inited = false;
283
282
scan -> rs_ctup .t_data = NULL ;
@@ -302,11 +301,22 @@ initscan(HeapScanDesc scan, ScanKey key, bool is_rescan)
302
301
pgstat_count_heap_scan (scan -> rs_rd );
303
302
}
304
303
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
+ */
305
310
void
306
311
heap_setscanlimits (HeapScanDesc scan , BlockNumber startBlk , BlockNumber numBlks )
307
312
{
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
+
308
319
scan -> rs_startblock = startBlk ;
309
- scan -> rs_initblock = startBlk ;
310
320
scan -> rs_numblocks = numBlks ;
311
321
}
312
322
@@ -477,7 +487,7 @@ heapgettup(HeapScanDesc scan,
477
487
/*
478
488
* return null immediately if relation is empty
479
489
*/
480
- if (scan -> rs_nblocks == 0 )
490
+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
481
491
{
482
492
Assert (!BufferIsValid (scan -> rs_cbuf ));
483
493
tuple -> t_data = NULL ;
@@ -511,7 +521,7 @@ heapgettup(HeapScanDesc scan,
511
521
/*
512
522
* return null immediately if relation is empty
513
523
*/
514
- if (scan -> rs_nblocks == 0 )
524
+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
515
525
{
516
526
Assert (!BufferIsValid (scan -> rs_cbuf ));
517
527
tuple -> t_data = NULL ;
@@ -651,7 +661,7 @@ heapgettup(HeapScanDesc scan,
651
661
if (backward )
652
662
{
653
663
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);
655
665
if (page == 0 )
656
666
page = scan -> rs_nblocks ;
657
667
page -- ;
@@ -662,7 +672,7 @@ heapgettup(HeapScanDesc scan,
662
672
if (page >= scan -> rs_nblocks )
663
673
page = 0 ;
664
674
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);
666
676
667
677
/*
668
678
* Report our new scan position for synchronization purposes. We
@@ -754,7 +764,7 @@ heapgettup_pagemode(HeapScanDesc scan,
754
764
/*
755
765
* return null immediately if relation is empty
756
766
*/
757
- if (scan -> rs_nblocks == 0 )
767
+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
758
768
{
759
769
Assert (!BufferIsValid (scan -> rs_cbuf ));
760
770
tuple -> t_data = NULL ;
@@ -785,7 +795,7 @@ heapgettup_pagemode(HeapScanDesc scan,
785
795
/*
786
796
* return null immediately if relation is empty
787
797
*/
788
- if (scan -> rs_nblocks == 0 )
798
+ if (scan -> rs_nblocks == 0 || scan -> rs_numblocks == 0 )
789
799
{
790
800
Assert (!BufferIsValid (scan -> rs_cbuf ));
791
801
tuple -> t_data = NULL ;
@@ -914,7 +924,7 @@ heapgettup_pagemode(HeapScanDesc scan,
914
924
if (backward )
915
925
{
916
926
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);
918
928
if (page == 0 )
919
929
page = scan -> rs_nblocks ;
920
930
page -- ;
@@ -925,7 +935,7 @@ heapgettup_pagemode(HeapScanDesc scan,
925
935
if (page >= scan -> rs_nblocks )
926
936
page = 0 ;
927
937
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);
929
939
930
940
/*
931
941
* Report our new scan position for synchronization purposes. We
0 commit comments