Index: src/backend/utils/adt/timestamp.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.160
diff --context=5 -r1.160 timestamp.c
*** src/backend/utils/adt/timestamp.c	22 Nov 2005 22:30:33 -0000	1.160
--- src/backend/utils/adt/timestamp.c	1 Mar 2006 18:35:36 -0000
***************
*** 2003,2013 ****
  	TMODULO(result->time, wholeday, USECS_PER_DAY);
  #else
  	TMODULO(result->time, wholeday, (double) SECS_PER_DAY);
  #endif
  	result->day += wholeday;	/* could overflow... */
! 
  	PG_RETURN_INTERVAL_P(result);
  }
  
  /*
   *	interval_justify_days()
--- 2003,2021 ----
  	TMODULO(result->time, wholeday, USECS_PER_DAY);
  #else
  	TMODULO(result->time, wholeday, (double) SECS_PER_DAY);
  #endif
  	result->day += wholeday;	/* could overflow... */
! 	if (result->time < 0)
! 	{
! #ifdef HAVE_INT64_TIMESTAMP
! 		result->time += USECS_PER_DAY;
! #else
! 		result->time += (double) SECS_PER_DAY;
! #endif
! 		result->day--;
! 	}
  	PG_RETURN_INTERVAL_P(result);
  }
  
  /*
   *	interval_justify_days()
***************
*** 2028,2037 ****
--- 2036,2050 ----
  	result->time = span->time;
  
  	wholemonth = result->day / DAYS_PER_MONTH;
  	result->day -= wholemonth * DAYS_PER_MONTH;
  	result->month += wholemonth;
+ 	if (result->day < 0)
+ 	{
+ 		result->day += DAYS_PER_MONTH;
+ 		result->month--;
+ 	}
  
  	PG_RETURN_INTERVAL_P(result);
  }
  
  /* timestamp_pl_interval()
