On Tue, Mar 28, 2023 at 7:17 PM Ashutosh Bapat <ashutosh.bapat....@gmail.com> wrote: > make sure that every > operator that interval as one of its operands or the result has been > covered in the code.
time_mi_time - do we want to add an Assert to make sure that this function does not produce an Interval structure which looks like non-finite interval? multiplying an interval by infinity throws an error #select '5 days'::interval * 'infinity'::float8; 2023-03-29 19:40:15.797 IST [136240] ERROR: interval out of range 2023-03-29 19:40:15.797 IST [136240] STATEMENT: select '5 days'::interval * 'infinity'::float8; ERROR: interval out of range I think this should produce an infinite interval now. Attached patch to fix this, to be applied on top of your patch. With the patch #select '5 days'::interval * 'infinity'::float8; ?column? ---------- infinity (1 row) Going through the tests now. -- Best Wishes, Ashutosh Bapat
commit e345924db6e6b531f98124159731560a38eae7d0 Author: Ashutosh Bapat <ashutosh.ba...@enterprisedb.com> Date: Fri Mar 31 15:41:25 2023 +0530 fixup! Add infinite interval values diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index c006e27dc0..79842d3e0d 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -3566,6 +3566,7 @@ interval_mul(PG_FUNCTION_ARGS) int32 orig_month = span->month, orig_day = span->day; Interval *result; + int is_factor_inf = isinf(factor); result = (Interval *) palloc(sizeof(Interval)); @@ -3574,6 +3575,15 @@ interval_mul(PG_FUNCTION_ARGS) (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("interval out of range"))); + if (is_factor_inf != 0) + { + if (is_factor_inf < 0) + INTERVAL_NOBEGIN(result); + else + INTERVAL_NOEND(result); + PG_RETURN_INTERVAL_P(result); + } + /* * Multiplying infinite interval by finite number keeps it infinite but * may change the sign.