List:Commits« Previous MessageNext Message »
From:Alexey Kopytov Date:November 13 2008 9:38am
Subject:bzr commit into mysql-5.0-bugteam branch (alexeyk:2712) Bug#27483
View as plain text  
#At file:///data/src/bzr/bugteam/bug27483/5.0-bugteam/

 2712 Alexey Kopytov	2008-11-13
      Fix for bug #27483: Casting 'scientific notation type' to 'unsigned 
                          bigint' fails on windows.
      
      Visual Studio does not take into account some x86 hardware limitations
      which leads to incorrect results when converting large DOUBLE values
      to BIGINT UNSIGNED.
      
      Fixed by adding a workaround for double->ulonglong conversion on
      Windows.
modified:
  include/config-win.h
  include/my_global.h
  mysql-test/r/type_float.result
  mysql-test/t/type_float.test

per-file messages:
  include/config-win.h
    Added double2ulonglong(double) function implementing a workaround for
    broken double->ulonglong conversion on Windows/x86.
  include/my_global.h
    Define double2ulonglong() as a simple typecast for anything but
    Windows.
  mysql-test/r/type_float.result
    Added a test case for bug #27483.
  mysql-test/t/type_float.test
    Added a test case for bug #27483.
=== modified file 'include/config-win.h'
--- a/include/config-win.h	2008-03-27 22:35:56 +0000
+++ b/include/config-win.h	2008-11-13 09:38:26 +0000
@@ -245,6 +245,15 @@ inline double ulonglong2double(ulonglong
 #define my_off_t2double(A) ulonglong2double(A)
 #endif /* _WIN64 */
 
+inline ulonglong double2ulonglong(double d)
+{
+  double t= d - (double) 0x8000000000000000ULL;
+
+  if (t >= 0)
+    return  ((ulonglong) t) + 0x8000000000000000ULL;
+  return (ulonglong) d;
+}
+
 #if SIZEOF_OFF_T > 4
 #define lseek(A,B,C) _lseeki64((A),(longlong) (B),(C))
 #define tell(A) _telli64(A)

=== modified file 'include/my_global.h'
--- a/include/my_global.h	2008-04-28 18:58:32 +0000
+++ b/include/my_global.h	2008-11-13 09:38:26 +0000
@@ -713,6 +713,9 @@ typedef SOCKET_SIZE_TYPE size_socket;
 #define ulonglong2double(A) ((double) (ulonglong) (A))
 #define my_off_t2double(A)  ((double) (my_off_t) (A))
 #endif
+#ifndef double2ulonglong
+#define double2ulonglong(A) ((ulonglong) (double) (A))
+#endif
 #endif
 
 #ifndef offsetof

=== modified file 'mysql-test/r/type_float.result'
--- a/mysql-test/r/type_float.result	2007-10-15 07:22:11 +0000
+++ b/mysql-test/r/type_float.result	2008-11-13 09:38:26 +0000
@@ -392,4 +392,17 @@ f1 + 0e0
 1.0000000150475e+30
 -1.0000000150475e+30
 drop table t1;
+create table t1(d double, u bigint unsigned);
+insert into t1(d) values (9.2233720368547777e+18),
+(9.223372036854779e18),
+(9.22337203685479e18),
+(1.84e19);
+update t1 set u = d;
+select * from t1;
+d	u
+9.22337203685478e+18	9223372036854775808
+9.22337203685478e+18	9223372036854779904
+9.22337203685479e+18	9223372036854790144
+1.84e+19	18400000000000000000
+drop table t1;
 End of 5.0 tests

=== modified file 'mysql-test/t/type_float.test'
--- a/mysql-test/t/type_float.test	2007-12-01 07:48:41 +0000
+++ b/mysql-test/t/type_float.test	2008-11-13 09:38:26 +0000
@@ -252,4 +252,21 @@ insert into t1 values (2e30), (-2e30);
 select f1 + 0e0 from t1;
 drop table t1;
 
+# 
+# Bug #27483: Casting 'scientific notation type' to 'unsigned bigint' fails on 
+#             windows.
+#
+
+create table t1(d double, u bigint unsigned);
+
+insert into t1(d) values (9.2233720368547777e+18),
+                         (9.223372036854779e18),
+                         (9.22337203685479e18),
+                         (1.84e19);
+
+update t1 set u = d;
+select * from t1;
+
+drop table t1;
+
 --echo End of 5.0 tests

Thread
bzr commit into mysql-5.0-bugteam branch (alexeyk:2712) Bug#27483Alexey Kopytov13 Nov