summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/func_if.result7
-rw-r--r--mysql-test/t/func_if.test8
-rw-r--r--sql/item_cmpfunc.cc3
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);
}