On Tue, Jan 26, 2016 at 7:00 PM, Torsten Zuehlsdorff <mailingli...@toco-domains.de> wrote: > > On 26.01.2016 07:52, Simon Riggs wrote: > >>> Imagine for example a script that in some rare cases passes happens to >>> pass infinity into generate_series() - in that case I'd much rather error >>> out than wait till the end of the universe. >>> >>> So +1 from me to checking for infinity. >>> >> >> +1 >> >> ERROR infinite result sets are not supported, yet > > > Maybe we should skip the "yet". Or do we really plan to support them in > (infinite) future? ;) > > +1 from me to check infinity also.
Something like the patch attached would be fine? This wins a backpatch because the query continuously running eats memory, no? -- Michael
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');
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers