Commit 826604f9 authored by Bruce Momjian's avatar Bruce Momjian

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.
parent ca76df42
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -2201,7 +2201,7 @@ interval_mul(PG_FUNCTION_ARGS)
result->time += (months - result->month) * INT64CONST(30) * result->time += (months - result->month) * INT64CONST(30) *
USECS_PER_DAY; USECS_PER_DAY;
#else #else
result->month = rint(months); result->month = (int)months;
result->time = JROUND(span1->time * factor); result->time = JROUND(span1->time * factor);
/* evaluate fractional months as 30 days */ /* evaluate fractional months as 30 days */
result->time += JROUND((months - result->month) * 30 * SECS_PER_DAY); result->time += JROUND((months - result->month) * 30 * SECS_PER_DAY);
...@@ -2246,7 +2246,7 @@ interval_div(PG_FUNCTION_ARGS) ...@@ -2246,7 +2246,7 @@ interval_div(PG_FUNCTION_ARGS)
INT64CONST(30) * USECS_PER_DAY) / factor; INT64CONST(30) * USECS_PER_DAY) / factor;
#else #else
months = span->month / factor; months = span->month / factor;
result->month = rint(months); result->month = (int)months;
result->time = JROUND(span->time / factor); result->time = JROUND(span->time / factor);
/* evaluate fractional months as 30 days */ /* evaluate fractional months as 30 days */
result->time += JROUND((months - result->month) * 30 * SECS_PER_DAY); result->time += JROUND((months - result->month) * 30 * SECS_PER_DAY);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment