commit 29d8501bb0e1b727abc81e862185770fd8e3a6c9 Author: Ashutosh Bapat Date: Fri Mar 31 18:02: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..cd05c61de3 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)); @@ -3580,12 +3581,35 @@ interval_mul(PG_FUNCTION_ARGS) */ if (INTERVAL_NOT_FINITE(span)) { - if (factor < 0.0) + if (factor == 0.0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else if (factor < 0.0) interval_um_internal(span, result); else memcpy(result, span, sizeof(Interval)); PG_RETURN_INTERVAL_P(result); } + else if (is_factor_inf) + { + Interval zero; + int result_is_inf; + + memset(&zero, 0, sizeof(zero)); + result_is_inf = interval_cmp_internal(span, &zero) * is_factor_inf; + + if (result_is_inf == 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else if (result_is_inf < 0) + INTERVAL_NOBEGIN(result); + else + INTERVAL_NOEND(result); + + PG_RETURN_INTERVAL_P(result); + } result_double = span->month * factor; if (isnan(result_double) ||