Loading mysql-test/r/func_math.result +3 −0 Original line number Diff line number Diff line Loading @@ -143,3 +143,6 @@ select format(col2,6) from t1 where col1=7; format(col2,6) 1,234,567,890,123,456.123450 drop table t1; select round(150, 2); round(150, 2) 150.00 mysql-test/r/type_newdecimal.result +8 −0 Original line number Diff line number Diff line Loading @@ -896,6 +896,14 @@ create table t1( d1 decimal(18) unsigned, d2 decimal(20) unsigned, d3 decimal (2 insert into t1 values(1,-1,-1); ERROR 22003: Out of range value adjusted for column 'd2' at row 1 drop table t1; create table t1 (col1 decimal(5,2), col2 numeric(5,2)); insert into t1 values (999.999,999.999); ERROR 22003: Out of range value adjusted for column 'col1' at row 1 insert into t1 values (-999.999,-999.999); ERROR 22003: Out of range value adjusted for column 'col1' at row 1 select * from t1; col1 col2 drop table t1; set sql_mode=''; set @sav_dpi= @@div_precision_increment; set @@div_precision_increment=15; Loading mysql-test/t/func_math.test +5 −0 Original line number Diff line number Diff line Loading @@ -79,3 +79,8 @@ insert into t1 values(7,1234567890123456.12345); select format(col2,6) from t1 where col1=7; drop table t1; # # Bug #10083 (round doesn't increase decimals) # select round(150, 2); mysql-test/t/type_newdecimal.test +7 −0 Original line number Diff line number Diff line Loading @@ -934,6 +934,13 @@ create table t1( d1 decimal(18) unsigned, d2 decimal(20) unsigned, d3 decimal (2 --error 1264 insert into t1 values(1,-1,-1); drop table t1; create table t1 (col1 decimal(5,2), col2 numeric(5,2)); --error 1264 insert into t1 values (999.999,999.999); --error 1264 insert into t1 values (-999.999,-999.999); select * from t1; drop table t1; set sql_mode=''; # Loading sql/item_func.cc +7 −12 Original line number Diff line number Diff line Loading @@ -1876,7 +1876,8 @@ void Item_func_round::fix_length_and_dec() max_length= float_length(decimals); break; case INT_RESULT: if (truncate || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS)) if ((decimals_to_set==0) && (truncate || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS))) { /* Here we can keep INT_RESULT */ hybrid_type= INT_RESULT; Loading @@ -1890,16 +1891,10 @@ void Item_func_round::fix_length_and_dec() hybrid_type= DECIMAL_RESULT; int decimals_delta= args[0]->decimals - decimals_to_set; int precision= args[0]->decimal_precision(); if (decimals_delta > 0) { int length_increase= truncate ? 0:1; int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1; precision-= decimals_delta - length_increase; decimals= decimals_to_set; } else /* Decimals to set is bigger that the original scale */ /* we keep original decimals value */ decimals= args[0]->decimals; max_length= my_decimal_precision_to_length(precision, decimals, unsigned_flag); break; Loading Loading
mysql-test/r/func_math.result +3 −0 Original line number Diff line number Diff line Loading @@ -143,3 +143,6 @@ select format(col2,6) from t1 where col1=7; format(col2,6) 1,234,567,890,123,456.123450 drop table t1; select round(150, 2); round(150, 2) 150.00
mysql-test/r/type_newdecimal.result +8 −0 Original line number Diff line number Diff line Loading @@ -896,6 +896,14 @@ create table t1( d1 decimal(18) unsigned, d2 decimal(20) unsigned, d3 decimal (2 insert into t1 values(1,-1,-1); ERROR 22003: Out of range value adjusted for column 'd2' at row 1 drop table t1; create table t1 (col1 decimal(5,2), col2 numeric(5,2)); insert into t1 values (999.999,999.999); ERROR 22003: Out of range value adjusted for column 'col1' at row 1 insert into t1 values (-999.999,-999.999); ERROR 22003: Out of range value adjusted for column 'col1' at row 1 select * from t1; col1 col2 drop table t1; set sql_mode=''; set @sav_dpi= @@div_precision_increment; set @@div_precision_increment=15; Loading
mysql-test/t/func_math.test +5 −0 Original line number Diff line number Diff line Loading @@ -79,3 +79,8 @@ insert into t1 values(7,1234567890123456.12345); select format(col2,6) from t1 where col1=7; drop table t1; # # Bug #10083 (round doesn't increase decimals) # select round(150, 2);
mysql-test/t/type_newdecimal.test +7 −0 Original line number Diff line number Diff line Loading @@ -934,6 +934,13 @@ create table t1( d1 decimal(18) unsigned, d2 decimal(20) unsigned, d3 decimal (2 --error 1264 insert into t1 values(1,-1,-1); drop table t1; create table t1 (col1 decimal(5,2), col2 numeric(5,2)); --error 1264 insert into t1 values (999.999,999.999); --error 1264 insert into t1 values (-999.999,-999.999); select * from t1; drop table t1; set sql_mode=''; # Loading
sql/item_func.cc +7 −12 Original line number Diff line number Diff line Loading @@ -1876,7 +1876,8 @@ void Item_func_round::fix_length_and_dec() max_length= float_length(decimals); break; case INT_RESULT: if (truncate || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS)) if ((decimals_to_set==0) && (truncate || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS))) { /* Here we can keep INT_RESULT */ hybrid_type= INT_RESULT; Loading @@ -1890,16 +1891,10 @@ void Item_func_round::fix_length_and_dec() hybrid_type= DECIMAL_RESULT; int decimals_delta= args[0]->decimals - decimals_to_set; int precision= args[0]->decimal_precision(); if (decimals_delta > 0) { int length_increase= truncate ? 0:1; int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1; precision-= decimals_delta - length_increase; decimals= decimals_to_set; } else /* Decimals to set is bigger that the original scale */ /* we keep original decimals value */ decimals= args[0]->decimals; max_length= my_decimal_precision_to_length(precision, decimals, unsigned_flag); break; Loading