#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#27483 | Alexey Kopytov | 13 Nov |