From a7bc7ebd8a0e41fc482fbcb3494aa1ee23319ff4 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 20 Jul 2010 21:59:47 -0700 Subject: [PATCH] Fixed bug #607177. Due to an invalid check for NULL of the second argument of the Item_func_round items performed in the code of Item_func_round::real_op the function ROUND sometimes could return wrong results. --- mysql-test/suite/vcol/r/vcol_misc.result | 20 ++++++++++++++++++++ mysql-test/suite/vcol/t/vcol_misc.test | 16 ++++++++++++++++ sql/item_func.cc | 10 ++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/vcol/r/vcol_misc.result b/mysql-test/suite/vcol/r/vcol_misc.result index 8ee9f5a9f67..2896157b813 100644 --- a/mysql-test/suite/vcol/r/vcol_misc.result +++ b/mysql-test/suite/vcol/r/vcol_misc.result @@ -87,3 +87,23 @@ a v 2002-02-15 00:00:00 0 2000-10-15 00:00:00 1 DROP TABLE t1, t2; +CREATE TABLE t1 (p int, a double NOT NULL, v double AS (ROUND(a,p)) VIRTUAL); +INSERT INTO t1 VALUES (0,1,0); +Warnings: +Warning 1645 The value specified for computed column 'v' in table 't1' ignored +INSERT INTO t1 VALUES (NULL,0,0); +Warnings: +Warning 1645 The value specified for computed column 'v' in table 't1' ignored +SELECT a, p, v, ROUND(a,p), ROUND(a,p+NULL) FROM t1; +a p v ROUND(a,p) ROUND(a,p+NULL) +1 0 1 1 NULL +0 NULL NULL NULL NULL +DROP TABLE t1; +CREATE TABLE t1 (p int, a double NOT NULL); +INSERT INTO t1(p,a) VALUES (0,1); +INSERT INTO t1(p,a) VALUES (NULL,0); +SELECT a, p, ROUND(a,p), ROUND(a,p+NULL) FROM t1; +a p ROUND(a,p) ROUND(a,p+NULL) +1 0 1 NULL +0 NULL NULL NULL +DROP TABLE t1; diff --git a/mysql-test/suite/vcol/t/vcol_misc.test b/mysql-test/suite/vcol/t/vcol_misc.test index 87a870181b0..bd527a61fbc 100644 --- a/mysql-test/suite/vcol/t/vcol_misc.test +++ b/mysql-test/suite/vcol/t/vcol_misc.test @@ -87,3 +87,19 @@ INSERT INTO t2(a) VALUES ('2000-10-15'); SELECT * FROM t2; DROP TABLE t1, t2; + +# +# Bug#607177: ROUND function in the expression for a virtual function +# + +CREATE TABLE t1 (p int, a double NOT NULL, v double AS (ROUND(a,p)) VIRTUAL); +INSERT INTO t1 VALUES (0,1,0); +INSERT INTO t1 VALUES (NULL,0,0); +SELECT a, p, v, ROUND(a,p), ROUND(a,p+NULL) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (p int, a double NOT NULL); +INSERT INTO t1(p,a) VALUES (0,1); +INSERT INTO t1(p,a) VALUES (NULL,0); +SELECT a, p, ROUND(a,p), ROUND(a,p+NULL) FROM t1; +DROP TABLE t1; diff --git a/sql/item_func.cc b/sql/item_func.cc index 653c29cec48..3cb9d4724b9 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2040,10 +2040,12 @@ double Item_func_round::real_op() { double value= args[0]->val_real(); - if (!(null_value= args[0]->null_value || args[1]->null_value)) - return my_double_round(value, args[1]->val_int(), args[1]->unsigned_flag, - truncate); - + if (!(null_value= args[0]->null_value)) + { + longlong dec= args[1]->val_int(); + if (!(null_value= args[1]->null_value)) + return my_double_round(value, dec, args[1]->unsigned_flag, truncate); + } return 0.0; }