Loading mysql-test/r/type_float.result +71 −0 Original line number Diff line number Diff line Loading @@ -268,6 +268,77 @@ select 1e-308, 1.00000001e-300, 100000000e-300; select 10e307; 10e307 1e+308 create table t1(a int, b double(8, 2)); insert into t1 values (1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75), (1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00), (5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93), (3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3, 0.16), (6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82); explain select sum(b) s from t1 group by a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using temporary; Using filesort select sum(b) s from t1 group by a; s 0.00 100.00 0.00 -0.00 -0.00 0.00 select sum(b) s from t1 group by a having s <> 0; s 100.00 select sum(b) s from t1 group by a having s <> 0 order by s; s 100.00 select sum(b) s from t1 group by a having s <=> 0; s 0.00 0.00 -0.00 -0.00 0.00 select sum(b) s from t1 group by a having s <=> 0 order by s; s -0.00 -0.00 0.00 0.00 0.00 alter table t1 add key (a, b); explain select sum(b) s from t1 group by a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL a 14 NULL 26 Using index select sum(b) s from t1 group by a; s 0.00 100.00 0.00 -0.00 0.00 0.00 select sum(b) s from t1 group by a having s <> 0; s 100.00 select sum(b) s from t1 group by a having s <> 0 order by s; s 100.00 select sum(b) s from t1 group by a having s <=> 0; s 0.00 0.00 -0.00 0.00 0.00 select sum(b) s from t1 group by a having s <=> 0 order by s; s -0.00 0.00 0.00 0.00 0.00 drop table t1; End of 4.1 tests create table t1 (s1 float(0,2)); ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 's1'). Loading mysql-test/t/type_float.test +25 −0 Original line number Diff line number Diff line Loading @@ -187,6 +187,31 @@ select 1e-308, 1.00000001e-300, 100000000e-300; # check if overflows are detected correctly select 10e307; # # Bug #19690: ORDER BY eliminates rows from the result # create table t1(a int, b double(8, 2)); insert into t1 values (1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75), (1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00), (5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93), (3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3, 0.16), (6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82); explain select sum(b) s from t1 group by a; select sum(b) s from t1 group by a; select sum(b) s from t1 group by a having s <> 0; select sum(b) s from t1 group by a having s <> 0 order by s; select sum(b) s from t1 group by a having s <=> 0; select sum(b) s from t1 group by a having s <=> 0 order by s; alter table t1 add key (a, b); explain select sum(b) s from t1 group by a; select sum(b) s from t1 group by a; select sum(b) s from t1 group by a having s <> 0; select sum(b) s from t1 group by a having s <> 0 order by s; select sum(b) s from t1 group by a having s <=> 0; select sum(b) s from t1 group by a having s <=> 0 order by s; drop table t1; --echo End of 4.1 tests # Loading sql/field.cc +1 −1 Original line number Diff line number Diff line Loading @@ -4064,7 +4064,7 @@ int Field_double::store(double nr) else { double max_value; if (dec >= NOT_FIXED_DEC) if (not_fixed) { max_value= DBL_MAX; } Loading sql/field.h +12 −3 Original line number Diff line number Diff line Loading @@ -725,6 +725,7 @@ class Field_float :public Field_real { class Field_double :public Field_real { public: my_bool not_fixed; Field_double(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, Loading @@ -732,12 +733,20 @@ class Field_double :public Field_real { uint8 dec_arg,bool zero_arg,bool unsigned_arg) :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, table_arg, dec_arg, zero_arg, unsigned_arg) dec_arg, zero_arg, unsigned_arg), not_fixed(dec_arg >= NOT_FIXED_DEC) {} Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg, uint8 dec_arg) :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, NONE, field_name_arg, table_arg, dec_arg, 0, 0) NONE, field_name_arg, table_arg, dec_arg, 0, 0), not_fixed(dec_arg >= NOT_FIXED_DEC) {} Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg, uint8 dec_arg, my_bool not_fixed_srg) :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, NONE, field_name_arg, table_arg, dec_arg, 0, 0), not_fixed(not_fixed_srg) {} enum_field_types type() const { return FIELD_TYPE_DOUBLE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; } Loading sql/init.cc +6 −0 Original line number Diff line number Diff line Loading @@ -44,5 +44,11 @@ void unireg_init(ulong options) { /* It's used by filesort... */ log_10[i]= nr ; nr*= 10.0; } /* Make a tab of powers of 0.1 */ for (i= 0, nr= 0.1; i < array_elements(log_01); i++) { log_01[i]= nr; nr*= 0.1; } DBUG_VOID_RETURN; } Loading
mysql-test/r/type_float.result +71 −0 Original line number Diff line number Diff line Loading @@ -268,6 +268,77 @@ select 1e-308, 1.00000001e-300, 100000000e-300; select 10e307; 10e307 1e+308 create table t1(a int, b double(8, 2)); insert into t1 values (1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75), (1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00), (5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93), (3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3, 0.16), (6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82); explain select sum(b) s from t1 group by a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using temporary; Using filesort select sum(b) s from t1 group by a; s 0.00 100.00 0.00 -0.00 -0.00 0.00 select sum(b) s from t1 group by a having s <> 0; s 100.00 select sum(b) s from t1 group by a having s <> 0 order by s; s 100.00 select sum(b) s from t1 group by a having s <=> 0; s 0.00 0.00 -0.00 -0.00 0.00 select sum(b) s from t1 group by a having s <=> 0 order by s; s -0.00 -0.00 0.00 0.00 0.00 alter table t1 add key (a, b); explain select sum(b) s from t1 group by a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL a 14 NULL 26 Using index select sum(b) s from t1 group by a; s 0.00 100.00 0.00 -0.00 0.00 0.00 select sum(b) s from t1 group by a having s <> 0; s 100.00 select sum(b) s from t1 group by a having s <> 0 order by s; s 100.00 select sum(b) s from t1 group by a having s <=> 0; s 0.00 0.00 -0.00 0.00 0.00 select sum(b) s from t1 group by a having s <=> 0 order by s; s -0.00 0.00 0.00 0.00 0.00 drop table t1; End of 4.1 tests create table t1 (s1 float(0,2)); ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 's1'). Loading
mysql-test/t/type_float.test +25 −0 Original line number Diff line number Diff line Loading @@ -187,6 +187,31 @@ select 1e-308, 1.00000001e-300, 100000000e-300; # check if overflows are detected correctly select 10e307; # # Bug #19690: ORDER BY eliminates rows from the result # create table t1(a int, b double(8, 2)); insert into t1 values (1, 28.50), (1, 121.85), (1, 157.23), (1, 1351.00), (1, -1965.35), (1, 81.75), (1, 217.08), (1, 7.94), (4, 96.07), (4, 6404.65), (4, -6500.72), (2, 100.00), (5, 5.00), (5, -2104.80), (5, 2033.80), (5, 0.07), (5, 65.93), (3, -4986.24), (3, 5.00), (3, 4857.34), (3, 123.74), (3, 0.16), (6, -1695.31), (6, 1003.77), (6, 499.72), (6, 191.82); explain select sum(b) s from t1 group by a; select sum(b) s from t1 group by a; select sum(b) s from t1 group by a having s <> 0; select sum(b) s from t1 group by a having s <> 0 order by s; select sum(b) s from t1 group by a having s <=> 0; select sum(b) s from t1 group by a having s <=> 0 order by s; alter table t1 add key (a, b); explain select sum(b) s from t1 group by a; select sum(b) s from t1 group by a; select sum(b) s from t1 group by a having s <> 0; select sum(b) s from t1 group by a having s <> 0 order by s; select sum(b) s from t1 group by a having s <=> 0; select sum(b) s from t1 group by a having s <=> 0 order by s; drop table t1; --echo End of 4.1 tests # Loading
sql/field.cc +1 −1 Original line number Diff line number Diff line Loading @@ -4064,7 +4064,7 @@ int Field_double::store(double nr) else { double max_value; if (dec >= NOT_FIXED_DEC) if (not_fixed) { max_value= DBL_MAX; } Loading
sql/field.h +12 −3 Original line number Diff line number Diff line Loading @@ -725,6 +725,7 @@ class Field_float :public Field_real { class Field_double :public Field_real { public: my_bool not_fixed; Field_double(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const char *field_name_arg, Loading @@ -732,12 +733,20 @@ class Field_double :public Field_real { uint8 dec_arg,bool zero_arg,bool unsigned_arg) :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, table_arg, dec_arg, zero_arg, unsigned_arg) dec_arg, zero_arg, unsigned_arg), not_fixed(dec_arg >= NOT_FIXED_DEC) {} Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg, uint8 dec_arg) :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, NONE, field_name_arg, table_arg, dec_arg, 0, 0) NONE, field_name_arg, table_arg, dec_arg, 0, 0), not_fixed(dec_arg >= NOT_FIXED_DEC) {} Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg, struct st_table *table_arg, uint8 dec_arg, my_bool not_fixed_srg) :Field_real((char*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, NONE, field_name_arg, table_arg, dec_arg, 0, 0), not_fixed(not_fixed_srg) {} enum_field_types type() const { return FIELD_TYPE_DOUBLE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; } Loading
sql/init.cc +6 −0 Original line number Diff line number Diff line Loading @@ -44,5 +44,11 @@ void unireg_init(ulong options) { /* It's used by filesort... */ log_10[i]= nr ; nr*= 10.0; } /* Make a tab of powers of 0.1 */ for (i= 0, nr= 0.1; i < array_elements(log_01); i++) { log_01[i]= nr; nr*= 0.1; } DBUG_VOID_RETURN; }