Revert "Disallow infinite endpoints in generate_series() for timestamps."

This reverts commit eafdf9de06
and its back-branch counterparts.  Corey Huinker pointed out that
we'd discussed this exact change back in 2016 and rejected it,
on the grounds that there's at least one usage pattern with LIMIT
where an infinite endpoint can usefully be used.  Perhaps that
argument needs to be re-litigated, but there's no time left before
our back-branch releases.  To keep our options open, restore the
status quo ante; if we do end up deciding to change things, waiting
one more quarter won't hurt anything.

Rather than just doing a straight revert, I added a new test case
demonstrating the usage with LIMIT.  That'll at least remind us of
the issue if we forget again.

Discussion: https://postgr.es/m/3603504.1652068977@sss.pgh.pa.us
Discussion: https://postgr.es/m/CADkLM=dzw0Pvdqp5yWKxMd+VmNkAMhG=4ku7GnCZxebWnzmz3Q@mail.gmail.com
This commit is contained in:
Tom Lane 2022-05-09 11:02:36 -04:00
parent 677a494789
commit 9b5797ca54
5 changed files with 48 additions and 56 deletions

View File

@ -5757,20 +5757,6 @@ generate_series_timestamp(PG_FUNCTION_ARGS)
MemoryContext oldcontext;
Interval interval_zero;
/* Reject infinities in start and stop values */
if (TIMESTAMP_IS_NOBEGIN(start) ||
TIMESTAMP_IS_NOEND(start))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("start value cannot be infinity")));
if (TIMESTAMP_IS_NOBEGIN(finish) ||
TIMESTAMP_IS_NOEND(finish))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("stop value cannot be infinity")));
/* Interval doesn't (currently) have infinity, so nothing to check */
/* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();
@ -5851,20 +5837,6 @@ generate_series_timestamptz(PG_FUNCTION_ARGS)
MemoryContext oldcontext;
Interval interval_zero;
/* Reject infinities in start and stop values */
if (TIMESTAMP_IS_NOBEGIN(start) ||
TIMESTAMP_IS_NOEND(start))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("start value cannot be infinity")));
if (TIMESTAMP_IS_NOBEGIN(finish) ||
TIMESTAMP_IS_NOEND(finish))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("stop value cannot be infinity")));
/* Interval doesn't (currently) have infinity, so nothing to check */
/* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();

View File

@ -2055,15 +2055,26 @@ select * from generate_series('2020-01-01 00:00'::timestamp,
Thu Jan 02 03:00:00 2020
(28 rows)
-- the LIMIT should allow this to terminate in a reasonable amount of time
-- (but that unfortunately doesn't work yet for SELECT * FROM ...)
select generate_series('2022-01-01 00:00'::timestamp,
'infinity'::timestamp,
'1 month'::interval) limit 10;
generate_series
--------------------------
Sat Jan 01 00:00:00 2022
Tue Feb 01 00:00:00 2022
Tue Mar 01 00:00:00 2022
Fri Apr 01 00:00:00 2022
Sun May 01 00:00:00 2022
Wed Jun 01 00:00:00 2022
Fri Jul 01 00:00:00 2022
Mon Aug 01 00:00:00 2022
Thu Sep 01 00:00:00 2022
Sat Oct 01 00:00:00 2022
(10 rows)
-- errors
select * from generate_series('-infinity'::timestamp,
'2020-01-02 03:00'::timestamp,
'1 hour'::interval);
ERROR: start value cannot be infinity
select * from generate_series('2020-01-01 00:00'::timestamp,
'infinity'::timestamp,
'1 hour'::interval);
ERROR: stop value cannot be infinity
select * from generate_series('2020-01-01 00:00'::timestamp,
'2020-01-02 03:00'::timestamp,
'0 hour'::interval);

View File

@ -2333,15 +2333,26 @@ select * from generate_series('2020-01-01 00:00'::timestamptz,
Thu Jan 02 03:00:00 2020 PST
(28 rows)
-- the LIMIT should allow this to terminate in a reasonable amount of time
-- (but that unfortunately doesn't work yet for SELECT * FROM ...)
select generate_series('2022-01-01 00:00'::timestamptz,
'infinity'::timestamptz,
'1 month'::interval) limit 10;
generate_series
------------------------------
Sat Jan 01 00:00:00 2022 PST
Tue Feb 01 00:00:00 2022 PST
Tue Mar 01 00:00:00 2022 PST
Fri Apr 01 00:00:00 2022 PDT
Sun May 01 00:00:00 2022 PDT
Wed Jun 01 00:00:00 2022 PDT
Fri Jul 01 00:00:00 2022 PDT
Mon Aug 01 00:00:00 2022 PDT
Thu Sep 01 00:00:00 2022 PDT
Sat Oct 01 00:00:00 2022 PDT
(10 rows)
-- errors
select * from generate_series('-infinity'::timestamptz,
'2020-01-02 03:00'::timestamptz,
'1 hour'::interval);
ERROR: start value cannot be infinity
select * from generate_series('2020-01-01 00:00'::timestamptz,
'infinity'::timestamptz,
'1 hour'::interval);
ERROR: stop value cannot be infinity
select * from generate_series('2020-01-01 00:00'::timestamptz,
'2020-01-02 03:00'::timestamptz,
'0 hour'::interval);

View File

@ -375,13 +375,12 @@ select make_timestamp(0, 7, 15, 12, 30, 15);
select * from generate_series('2020-01-01 00:00'::timestamp,
'2020-01-02 03:00'::timestamp,
'1 hour'::interval);
-- the LIMIT should allow this to terminate in a reasonable amount of time
-- (but that unfortunately doesn't work yet for SELECT * FROM ...)
select generate_series('2022-01-01 00:00'::timestamp,
'infinity'::timestamp,
'1 month'::interval) limit 10;
-- errors
select * from generate_series('-infinity'::timestamp,
'2020-01-02 03:00'::timestamp,
'1 hour'::interval);
select * from generate_series('2020-01-01 00:00'::timestamp,
'infinity'::timestamp,
'1 hour'::interval);
select * from generate_series('2020-01-01 00:00'::timestamp,
'2020-01-02 03:00'::timestamp,
'0 hour'::interval);

View File

@ -414,13 +414,12 @@ RESET TimeZone;
select * from generate_series('2020-01-01 00:00'::timestamptz,
'2020-01-02 03:00'::timestamptz,
'1 hour'::interval);
-- the LIMIT should allow this to terminate in a reasonable amount of time
-- (but that unfortunately doesn't work yet for SELECT * FROM ...)
select generate_series('2022-01-01 00:00'::timestamptz,
'infinity'::timestamptz,
'1 month'::interval) limit 10;
-- errors
select * from generate_series('-infinity'::timestamptz,
'2020-01-02 03:00'::timestamptz,
'1 hour'::interval);
select * from generate_series('2020-01-01 00:00'::timestamptz,
'infinity'::timestamptz,
'1 hour'::interval);
select * from generate_series('2020-01-01 00:00'::timestamptz,
'2020-01-02 03:00'::timestamptz,
'0 hour'::interval);