diff options
-rw-r--r-- | mysql-test/r/func_if.result | 7 | ||||
-rw-r--r-- | mysql-test/t/func_if.test | 8 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 3 |
3 files changed, 17 insertions, 1 deletions
diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index aee23b38ca5..eef380c8f52 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -121,3 +121,10 @@ a NULLIF(a,'') NULL NULL NULL DROP TABLE t1; +create table t1 (f1 int, f2 int); +insert into t1 values(1,1),(0,0); +select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; +f1 f2 if(f1, 40.0, 5.00) +0 0 5.00 +1 1 40.00 +drop table t1; diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index 4e0f426c10b..beaa371f847 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -89,3 +89,11 @@ SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; DROP TABLE t1; # End of 4.1 tests + +# +# Bug #16272 IF function with decimal args can produce wrong result +# +create table t1 (f1 int, f2 int); +insert into t1 values(1,1),(0,0); +select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; +drop table t1; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index bb3f6e8b231..d812ce913c5 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1383,7 +1383,8 @@ Item_func_if::fix_length_and_dec() max_length= (cached_result_type == DECIMAL_RESULT || cached_result_type == INT_RESULT) ? (max(args[1]->max_length - args[1]->decimals, - args[2]->max_length - args[2]->decimals) + decimals) : + args[2]->max_length - args[2]->decimals) + decimals + + (unsigned_flag ? 0 : 1) ) : max(args[1]->max_length, args[2]->max_length); } |