summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/config-win.h9
-rw-r--r--include/my_global.h3
-rw-r--r--mysql-test/r/type_float.result13
-rw-r--r--mysql-test/t/type_float.test17
4 files changed, 42 insertions, 0 deletions
diff --git a/include/config-win.h b/include/config-win.h
index cc2b2767663..15c107597d1 100644
--- a/include/config-win.h
+++ b/include/config-win.h
@@ -250,6 +250,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 4feed96e7d6..8fb5a6b69da 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -789,6 +789,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
diff --git a/mysql-test/r/type_float.result b/mysql-test/r/type_float.result
index 6fbc8268a64..49edaf06847 100644
--- a/mysql-test/r/type_float.result
+++ b/mysql-test/r/type_float.result
@@ -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
diff --git a/mysql-test/t/type_float.test b/mysql-test/t/type_float.test
index 9aa8c00d24a..b23755b44fb 100644
--- a/mysql-test/t/type_float.test
+++ b/mysql-test/t/type_float.test
@@ -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