Index: timestamp.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v retrieving revision 1.140 diff -c -r1.140 timestamp.c *** timestamp.c 22 Jul 2005 15:15:38 -0000 1.140 --- timestamp.c 22 Jul 2005 16:14:31 -0000 *************** *** 2294,2300 **** --- 2294,2302 ---- { Interval *span = PG_GETARG_INTERVAL_P(0); float8 factor = PG_GETARG_FLOAT8(1); + #ifndef HAVE_INT64_TIMESTAMP double month_remainder, day_remainder; + #endif Interval *result; result = (Interval *) palloc(sizeof(Interval)); *************** *** 2308,2313 **** --- 2310,2322 ---- result->day = span->day / factor; result->time = span->time / factor; + #ifdef HAVE_INT64_TIMESTAMP + /* Cascade fractions to lower units */ + /* fractional months partial days into time */ + result->time += ((span->day - (result->day * factor)) * USECS_PER_DAY) / factor; + /* fractional months full days into days */ + result->day += ((span->month - (result->month * factor)) * DAYS_PER_MONTH) / factor; + #else /* Computer remainders */ month_remainder = (span->month - result->month * factor) / factor; day_remainder = (span->day - result->day * factor) / factor; *************** *** 2317,2326 **** result->day += month_remainder * DAYS_PER_MONTH; /* fractional months partial days into time */ day_remainder += (month_remainder * DAYS_PER_MONTH) - (int)(month_remainder * DAYS_PER_MONTH); - - #ifdef HAVE_INT64_TIMESTAMP - result->time += day_remainder * USECS_PER_DAY; - #else result->time += day_remainder * SECS_PER_DAY; result->time = JROUND(result->time); #endif --- 2326,2331 ----