Loading mysql-test/r/func_math.result +13 −0 Original line number Diff line number Diff line Loading @@ -130,3 +130,16 @@ Warnings: Note 1003 select degrees(pi()) AS `degrees(pi())`,radians(360) AS `radians(360)` select rand(rand); ERROR 42S22: Unknown column 'rand' in 'field list' create table t1 (col1 int, col2 decimal(60,30)); insert into t1 values(1,1234567890.12345); select format(col2,7) from t1; format(col2,7) 1,234,567,890.1234500 select format(col2,8) from t1; format(col2,8) 1,234,567,890.12345000 insert into t1 values(7,1234567890123456.12345); select format(col2,6) from t1 where col1=7; format(col2,6) 1,234,567,890,123,456.123450 drop table t1; mysql-test/t/func_math.test +12 −0 Original line number Diff line number Diff line Loading @@ -67,3 +67,15 @@ explain extended select degrees(pi()),radians(360); --error 1054 select rand(rand); # # Bug #8459 (FORMAT returns incorrect result) # create table t1 (col1 int, col2 decimal(60,30)); insert into t1 values(1,1234567890.12345); select format(col2,7) from t1; select format(col2,8) from t1; insert into t1 values(7,1234567890123456.12345); select format(col2,6) from t1 where col1=7; drop table t1; sql/item_strfunc.cc +27 −13 Original line number Diff line number Diff line Loading @@ -1668,14 +1668,28 @@ Item_func_format::Item_func_format(Item *org,int dec) :Item_str_func(org) String *Item_func_format::val_str(String *str) { DBUG_ASSERT(fixed == 1); double nr= args[0]->val_real(); uint32 length, str_length ,dec; int diff; DBUG_ASSERT(fixed == 1); dec= decimals ? decimals+1 : 0; if (args[0]->result_type() == DECIMAL_RESULT || args[0]->result_type() == INT_RESULT) { my_decimal dec_val, rnd_dec, *res; res= args[0]->val_decimal(&dec_val); my_decimal_round(E_DEC_FATAL_ERROR, res, decimals, false, &rnd_dec); my_decimal2string(E_DEC_FATAL_ERROR, &rnd_dec, 0, 0, 0, str); str_length= str->length(); if (rnd_dec.sign()) str_length--; } else { double nr= args[0]->val_real(); if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ nr= my_double_round(nr, decimals, FALSE); dec= decimals ? decimals+1 : 0; /* Here default_charset() is right as this is not an automatic conversion */ str->set(nr,decimals, default_charset()); if (isnan(nr)) Loading @@ -1683,7 +1697,7 @@ String *Item_func_format::val_str(String *str) str_length=str->length(); if (nr < 0) str_length--; // Don't count sign } /* We need this test to handle 'nan' values */ if (str_length >= dec+4) { Loading Loading
mysql-test/r/func_math.result +13 −0 Original line number Diff line number Diff line Loading @@ -130,3 +130,16 @@ Warnings: Note 1003 select degrees(pi()) AS `degrees(pi())`,radians(360) AS `radians(360)` select rand(rand); ERROR 42S22: Unknown column 'rand' in 'field list' create table t1 (col1 int, col2 decimal(60,30)); insert into t1 values(1,1234567890.12345); select format(col2,7) from t1; format(col2,7) 1,234,567,890.1234500 select format(col2,8) from t1; format(col2,8) 1,234,567,890.12345000 insert into t1 values(7,1234567890123456.12345); select format(col2,6) from t1 where col1=7; format(col2,6) 1,234,567,890,123,456.123450 drop table t1;
mysql-test/t/func_math.test +12 −0 Original line number Diff line number Diff line Loading @@ -67,3 +67,15 @@ explain extended select degrees(pi()),radians(360); --error 1054 select rand(rand); # # Bug #8459 (FORMAT returns incorrect result) # create table t1 (col1 int, col2 decimal(60,30)); insert into t1 values(1,1234567890.12345); select format(col2,7) from t1; select format(col2,8) from t1; insert into t1 values(7,1234567890123456.12345); select format(col2,6) from t1 where col1=7; drop table t1;
sql/item_strfunc.cc +27 −13 Original line number Diff line number Diff line Loading @@ -1668,14 +1668,28 @@ Item_func_format::Item_func_format(Item *org,int dec) :Item_str_func(org) String *Item_func_format::val_str(String *str) { DBUG_ASSERT(fixed == 1); double nr= args[0]->val_real(); uint32 length, str_length ,dec; int diff; DBUG_ASSERT(fixed == 1); dec= decimals ? decimals+1 : 0; if (args[0]->result_type() == DECIMAL_RESULT || args[0]->result_type() == INT_RESULT) { my_decimal dec_val, rnd_dec, *res; res= args[0]->val_decimal(&dec_val); my_decimal_round(E_DEC_FATAL_ERROR, res, decimals, false, &rnd_dec); my_decimal2string(E_DEC_FATAL_ERROR, &rnd_dec, 0, 0, 0, str); str_length= str->length(); if (rnd_dec.sign()) str_length--; } else { double nr= args[0]->val_real(); if ((null_value=args[0]->null_value)) return 0; /* purecov: inspected */ nr= my_double_round(nr, decimals, FALSE); dec= decimals ? decimals+1 : 0; /* Here default_charset() is right as this is not an automatic conversion */ str->set(nr,decimals, default_charset()); if (isnan(nr)) Loading @@ -1683,7 +1697,7 @@ String *Item_func_format::val_str(String *str) str_length=str->length(); if (nr < 0) str_length--; // Don't count sign } /* We need this test to handle 'nan' values */ if (str_length >= dec+4) { Loading