aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-05-09 11:02:37 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2022-05-09 11:40:42 -0400
commit86a21803c7d860bd0cbd8c81c34cc9250d4cc173 (patch)
tree8da7d6f010d59c9c1eaa4f9560649e5e9ae92df6
parentf26d5702857a9c027f84850af48b0eea0f3aa15c (diff)
downloadpostgresql-86a21803c7d860bd0cbd8c81c34cc9250d4cc173.tar.gz
postgresql-86a21803c7d860bd0cbd8c81c34cc9250d4cc173.zip
Revert "Disallow infinite endpoints in generate_series() for timestamps."
This reverts commit eafdf9de06e9b60168f5e47cedcfceecdc6d4b5f 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
-rw-r--r--src/backend/utils/adt/timestamp.c28
-rw-r--r--src/test/regress/expected/timestamp.out27
-rw-r--r--src/test/regress/expected/timestamptz.out27
-rw-r--r--src/test/regress/sql/timestamp.sql11
-rw-r--r--src/test/regress/sql/timestamptz.sql11
5 files changed, 48 insertions, 56 deletions
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 7421031f2f7..199c0a2e7ba 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -5165,20 +5165,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();
@@ -5260,20 +5246,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();
diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out
index ec4f364c3b1..0ef838eaf60 100644
--- a/src/test/regress/expected/timestamp.out
+++ b/src/test/regress/expected/timestamp.out
@@ -1780,15 +1780,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);
diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out
index 32be7716c2d..effd7385a96 100644
--- a/src/test/regress/expected/timestamptz.out
+++ b/src/test/regress/expected/timestamptz.out
@@ -2108,15 +2108,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);
diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql
index 5a8defa9bbe..32066f1fde6 100644
--- a/src/test/regress/sql/timestamp.sql
+++ b/src/test/regress/sql/timestamp.sql
@@ -248,13 +248,12 @@ SELECT make_timestamp(2014,12,28,6,30,45.887);
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);
diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql
index 0483ee3e556..c5050f057d3 100644
--- a/src/test/regress/sql/timestamptz.sql
+++ b/src/test/regress/sql/timestamptz.sql
@@ -334,13 +334,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);