Loading mysql-test/r/type_float.result +15 −0 Original line number Diff line number Diff line Loading @@ -179,3 +179,18 @@ f 9.999 9.999 drop table if exists t1; create table t1 (c char(20)); insert into t1 values (5e-28); select * from t1; c 5e-28 drop table t1; create table t1 (c char(6)); insert into t1 values (2e5),(2e6),(2e-4),(2e-5); select * from t1; c 200000 2e+06 0.0002 2e-05 drop table t1; mysql-test/r/type_float.result.es +15 −0 Original line number Diff line number Diff line Loading @@ -179,3 +179,18 @@ f 9.999 9.999 drop table if exists t1; create table t1 (c char(20)); insert into t1 values (5e-28); select * from t1; c 5e-28 drop table t1; create table t1 (c char(6)); insert into t1 values (2e5),(2e6),(2e-4),(2e-5); select * from t1; c 200000 2e+06 0.0002 2e-05 drop table t1; mysql-test/t/type_float.test +10 −0 Original line number Diff line number Diff line Loading @@ -103,3 +103,13 @@ create table t1 (f double(4,3)); insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); select * from t1; drop table if exists t1; # Check conversion of floats to character field (Bug #7774) create table t1 (c char(20)); insert into t1 values (5e-28); select * from t1; drop table t1; create table t1 (c char(6)); insert into t1 values (2e5),(2e6),(2e-4),(2e-5); select * from t1; drop table t1; sql/field.cc +10 −3 Original line number Diff line number Diff line Loading @@ -4301,13 +4301,20 @@ int Field_str::store(double nr) char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; uint length; bool use_scientific_notation= TRUE; use_scientific_notation= TRUE; if (field_length < 32 && fabs(nr) < log_10[field_length]-1) /* Check fabs(nr) against longest value that can be stored in field, which depends on whether the value is < 1 or not, and negative or not */ double anr= fabs(nr); int neg= (nr < 0.0) ? 1 : 0; if (field_length > 4 && field_length < 32 && (anr < 1.0 ? anr > 1/(log_10[max(0,field_length-neg-2)]) /* -2 for "0." */ : anr < log_10[field_length-neg]-1)) use_scientific_notation= FALSE; length= (uint) my_sprintf(buff, (buff, "%-.*g", (use_scientific_notation ? max(0, (int)field_length-5) : max(0, (int)field_length-neg-5) : field_length), nr)); /* Loading Loading
mysql-test/r/type_float.result +15 −0 Original line number Diff line number Diff line Loading @@ -179,3 +179,18 @@ f 9.999 9.999 drop table if exists t1; create table t1 (c char(20)); insert into t1 values (5e-28); select * from t1; c 5e-28 drop table t1; create table t1 (c char(6)); insert into t1 values (2e5),(2e6),(2e-4),(2e-5); select * from t1; c 200000 2e+06 0.0002 2e-05 drop table t1;
mysql-test/r/type_float.result.es +15 −0 Original line number Diff line number Diff line Loading @@ -179,3 +179,18 @@ f 9.999 9.999 drop table if exists t1; create table t1 (c char(20)); insert into t1 values (5e-28); select * from t1; c 5e-28 drop table t1; create table t1 (c char(6)); insert into t1 values (2e5),(2e6),(2e-4),(2e-5); select * from t1; c 200000 2e+06 0.0002 2e-05 drop table t1;
mysql-test/t/type_float.test +10 −0 Original line number Diff line number Diff line Loading @@ -103,3 +103,13 @@ create table t1 (f double(4,3)); insert into t1 values (-11.0),(-11),("-11"),(11.0),(11),("11"); select * from t1; drop table if exists t1; # Check conversion of floats to character field (Bug #7774) create table t1 (c char(20)); insert into t1 values (5e-28); select * from t1; drop table t1; create table t1 (c char(6)); insert into t1 values (2e5),(2e6),(2e-4),(2e-5); select * from t1; drop table t1;
sql/field.cc +10 −3 Original line number Diff line number Diff line Loading @@ -4301,13 +4301,20 @@ int Field_str::store(double nr) char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; uint length; bool use_scientific_notation= TRUE; use_scientific_notation= TRUE; if (field_length < 32 && fabs(nr) < log_10[field_length]-1) /* Check fabs(nr) against longest value that can be stored in field, which depends on whether the value is < 1 or not, and negative or not */ double anr= fabs(nr); int neg= (nr < 0.0) ? 1 : 0; if (field_length > 4 && field_length < 32 && (anr < 1.0 ? anr > 1/(log_10[max(0,field_length-neg-2)]) /* -2 for "0." */ : anr < log_10[field_length-neg]-1)) use_scientific_notation= FALSE; length= (uint) my_sprintf(buff, (buff, "%-.*g", (use_scientific_notation ? max(0, (int)field_length-5) : max(0, (int)field_length-neg-5) : field_length), nr)); /* Loading