diff --git a/mysql-test/r/type_newdecimal.result b/mysql-test/r/type_newdecimal.result index 901297288af..f3c7e45de39 100644 --- a/mysql-test/r/type_newdecimal.result +++ b/mysql-test/r/type_newdecimal.result @@ -1428,6 +1428,19 @@ f1 20101112000000.000014 101112.000000 drop table t1; +select cast(19999999999999999999 as unsigned); +cast(19999999999999999999 as unsigned) +18446744073709551615 +Warnings: +Error 1292 Truncated incorrect DECIMAL value: '' +create table t1(a decimal(18)); +insert into t1 values(123456789012345678); +alter table t1 modify column a decimal(19); +select * from t1; +a +123456789012345678 +drop table t1; +End of 5.0 tests select cast(143.481 as decimal(4,1)); cast(143.481 as decimal(4,1)) 143.5 @@ -1455,8 +1468,3 @@ Error 1264 Out of range value for column 'cast(-13.4 as decimal(2,1))' at row 1 select cast(98.6 as decimal(2,0)); cast(98.6 as decimal(2,0)) 99 -select cast(19999999999999999999 as unsigned); -cast(19999999999999999999 as unsigned) -18446744073709551615 -Warnings: -Error 1292 Truncated incorrect DECIMAL value: '' diff --git a/mysql-test/t/type_newdecimal.test b/mysql-test/t/type_newdecimal.test index f16e5dec40c..b8c05d62720 100644 --- a/mysql-test/t/type_newdecimal.test +++ b/mysql-test/t/type_newdecimal.test @@ -1126,6 +1126,22 @@ insert into t1 values (CAST('10:11:12' AS time)); select * from t1; drop table t1; +# +# Bug #8663 (cant use bigint as input to CAST) +# +select cast(19999999999999999999 as unsigned); + +# +# Bug #24558: Increasing decimal column length causes data loss +# +create table t1(a decimal(18)); +insert into t1 values(123456789012345678); +alter table t1 modify column a decimal(19); +select * from t1; +drop table t1; + +--echo End of 5.0 tests + # # Bug#16172 DECIMAL data type processed incorrectly # @@ -1136,8 +1152,3 @@ select cast(-3.4 as decimal(2,1)); select cast(99.6 as decimal(2,0)); select cast(-13.4 as decimal(2,1)); select cast(98.6 as decimal(2,0)); - -# Bug #8663 (cant use bigint as input to CAST) -# -select cast(19999999999999999999 as unsigned); - diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 805aba01754..88d36615668 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -336,6 +336,13 @@ static void do_field_real(Copy_field *copy) } +static void do_field_decimal(Copy_field *copy) +{ + my_decimal value; + copy->to_field->store_decimal(copy->from_field->val_decimal(&value)); +} + + /* string copy for single byte characters set when to string is shorter than from string @@ -580,6 +587,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) if (to->real_type() == MYSQL_TYPE_BIT || from->real_type() == MYSQL_TYPE_BIT) return do_field_int; + if (to->result_type() == DECIMAL_RESULT) + return do_field_decimal; // Check if identical fields if (from->result_type() == STRING_RESULT) {