@@ -712,6 +712,71 @@ false, true, false, true);
712
712
-- the support function.
713
713
SELECT * FROM generate_series(TIMESTAMPTZ '2024-02-01', TIMESTAMPTZ '2024-03-01', INTERVAL '0 day') g(s);
714
714
ERROR: step size cannot equal zero
715
+ --
716
+ -- Test the SupportRequestRows support function for generate_series_numeric()
717
+ --
718
+ -- Ensure the row estimate matches the actual rows
719
+ SELECT explain_mask_costs($$
720
+ SELECT * FROM generate_series(1.0, 25.0) g(s);$$,
721
+ true, true, false, true);
722
+ explain_mask_costs
723
+ ------------------------------------------------------------------------------------------
724
+ Function Scan on generate_series g (cost=N..N rows=25 width=N) (actual rows=25 loops=1)
725
+ (1 row)
726
+
727
+ -- As above but with non-default step
728
+ SELECT explain_mask_costs($$
729
+ SELECT * FROM generate_series(1.0, 25.0, 2.0) g(s);$$,
730
+ true, true, false, true);
731
+ explain_mask_costs
732
+ ------------------------------------------------------------------------------------------
733
+ Function Scan on generate_series g (cost=N..N rows=13 width=N) (actual rows=13 loops=1)
734
+ (1 row)
735
+
736
+ -- Ensure the estimates match when step is decreasing
737
+ SELECT explain_mask_costs($$
738
+ SELECT * FROM generate_series(25.0, 1.0, -1.0) g(s);$$,
739
+ true, true, false, true);
740
+ explain_mask_costs
741
+ ------------------------------------------------------------------------------------------
742
+ Function Scan on generate_series g (cost=N..N rows=25 width=N) (actual rows=25 loops=1)
743
+ (1 row)
744
+
745
+ -- Ensure an empty range estimates 1 row
746
+ SELECT explain_mask_costs($$
747
+ SELECT * FROM generate_series(25.0, 1.0, 1.0) g(s);$$,
748
+ true, true, false, true);
749
+ explain_mask_costs
750
+ ----------------------------------------------------------------------------------------
751
+ Function Scan on generate_series g (cost=N..N rows=1 width=N) (actual rows=0 loops=1)
752
+ (1 row)
753
+
754
+ -- Ensure we get the default row estimate for error cases (infinity/NaN values
755
+ -- and zero step size)
756
+ SELECT explain_mask_costs($$
757
+ SELECT * FROM generate_series('-infinity'::NUMERIC, 'infinity'::NUMERIC, 1.0) g(s);$$,
758
+ false, true, false, true);
759
+ explain_mask_costs
760
+ -------------------------------------------------------------------
761
+ Function Scan on generate_series g (cost=N..N rows=1000 width=N)
762
+ (1 row)
763
+
764
+ SELECT explain_mask_costs($$
765
+ SELECT * FROM generate_series(1.0, 25.0, 'NaN'::NUMERIC) g(s);$$,
766
+ false, true, false, true);
767
+ explain_mask_costs
768
+ -------------------------------------------------------------------
769
+ Function Scan on generate_series g (cost=N..N rows=1000 width=N)
770
+ (1 row)
771
+
772
+ SELECT explain_mask_costs($$
773
+ SELECT * FROM generate_series(25.0, 2.0, 0.0) g(s);$$,
774
+ false, true, false, true);
775
+ explain_mask_costs
776
+ -------------------------------------------------------------------
777
+ Function Scan on generate_series g (cost=N..N rows=1000 width=N)
778
+ (1 row)
779
+
715
780
-- Test functions for control data
716
781
SELECT count(*) > 0 AS ok FROM pg_control_checkpoint();
717
782
ok
0 commit comments