From: Bruce Momjian Date: Wed, 20 Jul 2005 03:50:24 +0000 (+0000) Subject: Fix interval division and multiplication, before: X-Git-Tag: REL8_1_0BETA1~281 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=826604f9e61c233c4229a3eb4d1ee3945691ee1b;p=postgresql Fix interval division and multiplication, before: test=> select '4 months'::interval / 5; ?column? --------------- 1 mon -6 days (1 row) after: test=> select '4 months'::interval / 5; ?column? ---------- 24 days (1 row) The problem was the use of rint() to round, and then find the remainder, causing the negative values. --- diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 74f40af783..be86884205 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.132 2005/07/12 16:04:58 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.133 2005/07/20 03:50:24 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -2201,7 +2201,7 @@ interval_mul(PG_FUNCTION_ARGS) result->time += (months - result->month) * INT64CONST(30) * USECS_PER_DAY; #else - result->month = rint(months); + result->month = (int)months; result->time = JROUND(span1->time * factor); /* evaluate fractional months as 30 days */ result->time += JROUND((months - result->month) * 30 * SECS_PER_DAY); @@ -2246,7 +2246,7 @@ interval_div(PG_FUNCTION_ARGS) INT64CONST(30) * USECS_PER_DAY) / factor; #else months = span->month / factor; - result->month = rint(months); + result->month = (int)months; result->time = JROUND(span->time / factor); /* evaluate fractional months as 30 days */ result->time += JROUND((months - result->month) * 30 * SECS_PER_DAY);