summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/type_float.result7
-rw-r--r--mysql-test/t/type_float.test7
-rw-r--r--sql/field_conv.cc1
3 files changed, 15 insertions, 0 deletions
diff --git a/mysql-test/r/type_float.result b/mysql-test/r/type_float.result
index 530eb32f77d..6e8275d5dac 100644
--- a/mysql-test/r/type_float.result
+++ b/mysql-test/r/type_float.result
@@ -179,6 +179,13 @@ f
9.999
9.999
drop table if exists t1;
+create table t1 (d1 double, d2 double unsigned);
+insert into t1 set d1 = -1.0;
+update t1 set d2 = d1;
+select * from t1;
+d1 d2
+-1 0
+drop table t1;
create table t1 (c char(20));
insert into t1 values (5e-28);
select * from t1;
diff --git a/mysql-test/t/type_float.test b/mysql-test/t/type_float.test
index 69cdeaa32a9..5b106d242de 100644
--- a/mysql-test/t/type_float.test
+++ b/mysql-test/t/type_float.test
@@ -93,6 +93,13 @@ create table t1 (f float(54)); # Should give an error
drop table if exists t1;
--enable_warnings
+# Don't allow 'double unsigned' to be set to a negative value (Bug #7700)
+create table t1 (d1 double, d2 double unsigned);
+insert into t1 set d1 = -1.0;
+update t1 set d2 = d1;
+select * from t1;
+drop table t1;
+
# Ensure that maximum values as the result of number of decimals
# being specified in table schema are enforced (Bug #7361)
create table t1 (f float(4,3));
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index 61a5a28f47b..8b362bbf807 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -559,6 +559,7 @@ void field_conv(Field *to,Field *from)
if (to->real_type() == from->real_type())
{
if (to->pack_length() == from->pack_length() &&
+ !(to->flags & UNSIGNED_FLAG && !(from->flags & UNSIGNED_FLAG)) &&
to->real_type() != FIELD_TYPE_ENUM &&
to->real_type() != FIELD_TYPE_SET &&
from->charset() == to->charset() &&