Re: [HACKERS] Interval literal rounding bug(?) and patch.

2008-09-24 Thread Bruce Momjian
Ron Mayer wrote:
 I think it's a bug that these 3 different ways of writing 0.7 seconds
 produce different results from each other on HEAD.
 
 head=# select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 
 seconds';
interval   |interval |interval
 -+-+-
   00:00:00.70 | 00:00:00.69 | 00:00:00.69
 (1 row)
 
 The attached patch will make all of those output 00:00:00.70 which.
 
 Postgres 8.3 tended to output the 00:00:00.70 like this patch, I believe
 because it didn't default to HAVE_INT64_TIMESTAMP like HEAD is.   The patch
 seems to pass the existing regression tests.
 
 Does this seem reasonable?

Yes, very nice;  patch applied.  Thanks.

-- 
  Bruce Momjian  [EMAIL PROTECTED]http://momjian.us
  EnterpriseDB http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] Interval literal rounding bug(?) and patch.

2008-09-22 Thread Ron Mayer

I think it's a bug that these 3 different ways of writing 0.7 seconds
produce different results from each other on HEAD.

head=# select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 
seconds';
  interval   |interval |interval
-+-+-
 00:00:00.70 | 00:00:00.69 | 00:00:00.69
(1 row)

The attached patch will make all of those output 00:00:00.70 which.

Postgres 8.3 tended to output the 00:00:00.70 like this patch, I believe
because it didn't default to HAVE_INT64_TIMESTAMP like HEAD is.   The patch
seems to pass the existing regression tests.

Does this seem reasonable?

   Ron


*** a/src/backend/utils/adt/datetime.c
--- b/src/backend/utils/adt/datetime.c
***
*** 2888,2894  DecodeInterval(char **field, int *ftype, int nf, int range,
  {
  	case DTK_MICROSEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 		*fsec += val + fval;
  #else
  		*fsec += (val + fval) * 1e-6;
  #endif
--- 2888,2894 
  {
  	case DTK_MICROSEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 		*fsec += rint(val + fval);
  #else
  		*fsec += (val + fval) * 1e-6;
  #endif
***
*** 2897,2903  DecodeInterval(char **field, int *ftype, int nf, int range,
  
  	case DTK_MILLISEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 		*fsec += (val + fval) * 1000;
  #else
  		*fsec += (val + fval) * 1e-3;
  #endif
--- 2897,2903 
  
  	case DTK_MILLISEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 		*fsec += rint((val + fval) * 1000);
  #else
  		*fsec += (val + fval) * 1e-3;
  #endif
***
*** 2907,2913  DecodeInterval(char **field, int *ftype, int nf, int range,
  	case DTK_SECOND:
  		tm-tm_sec += val;
  #ifdef HAVE_INT64_TIMESTAMP
! 		*fsec += fval * 100;
  #else
  		*fsec += fval;
  #endif
--- 2907,2913 
  	case DTK_SECOND:
  		tm-tm_sec += val;
  #ifdef HAVE_INT64_TIMESTAMP
! 		*fsec += rint(fval * 100);
  #else
  		*fsec += fval;
  #endif
***
*** 2932,2938  DecodeInterval(char **field, int *ftype, int nf, int range,
  			sec = fval;
  			tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 			*fsec += (fval - sec) * 100;
  #else
  			*fsec += fval - sec;
  #endif
--- 2932,2938 
  			sec = fval;
  			tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 			*fsec += rint((fval - sec) * 100);
  #else
  			*fsec += fval - sec;
  #endif
***
*** 2950,2956  DecodeInterval(char **field, int *ftype, int nf, int range,
  			sec = fval;
  			tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 			*fsec += (fval - sec) * 100;
  #else
  			*fsec += fval - sec;
  #endif
--- 2950,2956 
  			sec = fval;
  			tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 			*fsec += rint((fval - sec) * 100);
  #else
  			*fsec += fval - sec;
  #endif
***
*** 2969,2975  DecodeInterval(char **field, int *ftype, int nf, int range,
  			sec = fval;
  			tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 			*fsec += (fval - sec) * 100;
  #else
  			*fsec += fval - sec;
  #endif
--- 2969,2975 
  			sec = fval;
  			tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 			*fsec += rint((fval - sec) * 100);
  #else
  			*fsec += fval - sec;
  #endif
***
*** 2995,3001  DecodeInterval(char **field, int *ftype, int nf, int range,
  sec = fval;
  tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! *fsec += (fval - sec) * 100;
  #else
  *fsec += fval - sec;
  #endif
--- 2995,3001 
  sec = fval;
  tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! *fsec += rint((fval - sec) * 100);
  #else
  *fsec += fval - sec;
  #endif
***
*** 3022,3028  DecodeInterval(char **field, int *ftype, int nf, int range,
  sec = fval;
  tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! *fsec += (fval - sec) * 100;
  #else
  *fsec += fval - sec;
  #endif
--- 3022,3028 
  sec = fval;
  tm-tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! *fsec += rint((fval - sec) * 100);
  #else
  *fsec += fval - sec;
  #endif

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers