Commit dd683854 authored by unknown's avatar unknown

Fix over-optimization that could result in an unsigned double field being

set to a negative value. (Bug #7700)


sql/field_conv.cc:
  Don't treat real fields as identical when destination is unsigned and
  the source is not.
mysql-test/t/type_float.test:
  Add test for setting double unsigned to a negative value from a signed double
mysql-test/r/type_float.result:
  Add test results
parent d3ad1a91
...@@ -120,3 +120,10 @@ drop table t1; ...@@ -120,3 +120,10 @@ drop table t1;
create table t1 (f float(54)); create table t1 (f float(54));
Incorrect column specifier for column 'f' Incorrect column specifier for column 'f'
drop table if exists t1; 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;
...@@ -67,3 +67,9 @@ drop table t1; ...@@ -67,3 +67,9 @@ drop table t1;
create table t1 (f float(54)); # Should give an error create table t1 (f float(54)); # Should give an error
drop table if exists t1; drop table if exists t1;
# 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;
...@@ -537,6 +537,7 @@ void field_conv(Field *to,Field *from) ...@@ -537,6 +537,7 @@ void field_conv(Field *to,Field *from)
if (to->real_type() == from->real_type()) if (to->real_type() == from->real_type())
{ {
if (to->pack_length() == from->pack_length() && 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_ENUM &&
to->real_type() != FIELD_TYPE_SET && to->real_type() != FIELD_TYPE_SET &&
to->table->db_low_byte_first == from->table->db_low_byte_first) to->table->db_low_byte_first == from->table->db_low_byte_first)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment