]> granicus.if.org Git - postgresql/commitdiff
Fix interval division and multiplication, before:
authorBruce Momjian <bruce@momjian.us>
Wed, 20 Jul 2005 03:50:24 +0000 (03:50 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 20 Jul 2005 03:50:24 +0000 (03:50 +0000)
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.

src/backend/utils/adt/timestamp.c

index 74f40af7836236ba2f6346e375568ab43b15cc58..be86884205a26cc497106a19905937a33b238d34 100644 (file)
@@ -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);