Commit f83a6a66 authored by Igor Babaev's avatar Igor Babaev

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.
parent 1ee37b40
...@@ -87,3 +87,23 @@ a v ...@@ -87,3 +87,23 @@ a v
2002-02-15 00:00:00 0 2002-02-15 00:00:00 0
2000-10-15 00:00:00 1 2000-10-15 00:00:00 1
DROP TABLE t1, t2; 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;
...@@ -87,3 +87,19 @@ INSERT INTO t2(a) VALUES ('2000-10-15'); ...@@ -87,3 +87,19 @@ INSERT INTO t2(a) VALUES ('2000-10-15');
SELECT * FROM t2; SELECT * FROM t2;
DROP TABLE t1, 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;
...@@ -2040,10 +2040,12 @@ double Item_func_round::real_op() ...@@ -2040,10 +2040,12 @@ double Item_func_round::real_op()
{ {
double value= args[0]->val_real(); double value= args[0]->val_real();
if (!(null_value= args[0]->null_value || args[1]->null_value)) if (!(null_value= args[0]->null_value))
return my_double_round(value, args[1]->val_int(), args[1]->unsigned_flag, {
truncate); 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; return 0.0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment