diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 1525d2a..2f9e8d0 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -5405,6 +5405,16 @@ generate_series_timestamp(PG_FUNCTION_ARGS) MemoryContext oldcontext; Interval interval_zero; + /* handle infinite in start and stop values */ + if (TIMESTAMP_NOT_FINITE(start)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("start value cannot be infinite"))); + if (TIMESTAMP_NOT_FINITE(finish)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("stop value cannot be infinite"))); + /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); @@ -5486,6 +5496,16 @@ generate_series_timestamptz(PG_FUNCTION_ARGS) MemoryContext oldcontext; Interval interval_zero; + /* handle infinite in start and stop values */ + if (TIMESTAMP_NOT_FINITE(start)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("start value cannot be infinite"))); + if (TIMESTAMP_NOT_FINITE(finish)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("stop value cannot be infinite"))); + /* 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 e9f5e77..ac708e2 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -1592,3 +1592,8 @@ SELECT make_timestamp(2014,12,28,6,30,45.887); Sun Dec 28 06:30:45.887 2014 (1 row) +-- Tests for generate_series +SELECT generate_series(now(), 'infinity'::timestamp, interval '1 hour'); +ERROR: stop value cannot be infinite +SELECT generate_series('infinity'::timestamp, now(), interval '1 hour'); +ERROR: start value cannot be infinite diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 40a2254..3ec7ddb 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -2487,3 +2487,8 @@ SELECT '2007-12-09 07:30:00 UTC'::timestamptz AT TIME ZONE 'VET'; Sun Dec 09 03:00:00 2007 (1 row) +-- Tests for generate_series +SELECT generate_series(now(), 'infinity'::timestamp, interval '1 hour'); +ERROR: stop value cannot be infinite +SELECT generate_series('infinity'::timestamp, now(), interval '1 hour'); +ERROR: start value cannot be infinite diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index b22cd48..898d9cb 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -225,3 +225,7 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID') -- timestamp numeric fields constructor SELECT make_timestamp(2014,12,28,6,30,45.887); + +-- Tests for generate_series +SELECT generate_series(now(), 'infinity'::timestamp, interval '1 hour'); +SELECT generate_series('infinity'::timestamp, now(), interval '1 hour'); diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index f4b455e..b565452 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -432,3 +432,7 @@ SELECT '2007-12-09 07:00:00 UTC'::timestamptz AT TIME ZONE 'VET'; SELECT '2007-12-09 07:00:01 UTC'::timestamptz AT TIME ZONE 'VET'; SELECT '2007-12-09 07:29:59 UTC'::timestamptz AT TIME ZONE 'VET'; SELECT '2007-12-09 07:30:00 UTC'::timestamptz AT TIME ZONE 'VET'; + +-- Tests for generate_series +SELECT generate_series(now(), 'infinity'::timestamp, interval '1 hour'); +SELECT generate_series('infinity'::timestamp, now(), interval '1 hour');