summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAlexey Kopytov <alexeyk@mysql.com>2008-12-03 19:15:39 +0300
committerAlexey Kopytov <alexeyk@mysql.com>2008-12-03 19:15:39 +0300
commit91f0c94c23eb9b48421d9590662666de9e4c75d5 (patch)
tree897de4fad83899e4bae91b9435028a0240815aa6 /include
parent7f9e0b9bfb71bd3e47c48bb77f11df76feb1b7ad (diff)
downloadmariadb-git-91f0c94c23eb9b48421d9590662666de9e4c75d5.tar.gz
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 ones. Fixed by adding a workaround for double->ulonglong conversion on Windows. 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.
Diffstat (limited to 'include')
-rw-r--r--include/config-win.h9
-rw-r--r--include/my_global.h3
2 files changed, 12 insertions, 0 deletions
diff --git a/include/config-win.h b/include/config-win.h
index 2628095a181..eba699159c7 100644
--- a/include/config-win.h
+++ b/include/config-win.h
@@ -245,6 +245,15 @@ inline double ulonglong2double(ulonglong value)
#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)
diff --git a/include/my_global.h b/include/my_global.h
index e474b620d27..845ae042a42 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -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