Bug #120699 WHERE clause incorrectly returns rows when using COALESCE/IFNULL/LEAST/GREATEST on DECIMAL column
Submitted: 16 Jun 5:52 Modified: 16 Jun 13:31
Reporter: jinhui lai Email Updates:
Status: Duplicate Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S2 (Serious)
Version:9.7.0, 9.6.0 OS:Any
Assigned to: CPU Architecture:Any

[16 Jun 5:52] jinhui lai
Description:
Hi, MySQL developers. I found a bug. 
When a WHERE clause contains mutually exclusive conditions together with functions like COALESCE, IFNULL, LEAST, or GREATEST, MySQL incorrectly returns rows that do not satisfy the equality condition.

How to repeat:
CREATE TABLE t0(c0 DECIMAL);
CREATE TABLE t1(c0 DECIMAL);
INSERT INTO t0(c0) VALUES(0);
INSERT INTO t1(c0) VALUES(0);
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 WHERE t0.c0 = 0.1 AND NOT COALESCE(t0.c0); -- {0|0}, expect {}
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 WHERE t0.c0 = 0.1 AND NOT IFNULL(t0.c0, 1); -- {0|0}, expect {}
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 WHERE t0.c0 = 0.1 AND LEAST(t0.c0, 1) = 0; -- {0|0}, expect {}
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 WHERE t0.c0 = 0.1 AND GREATEST(t0.c0, 0) = 0; -- {0|0}, expect {}

SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 AND t0.c0 = 0.1 AND NOT COALESCE(t0.c0); -- {}
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 AND t0.c0 = 0.1 AND NOT IFNULL(t0.c0, 1); -- {}
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 AND t0.c0 = 0.1 AND LEAST(t0.c0, 1) = 0; -- {}
SELECT * FROM t0 JOIN t1 ON t0.c0 != 0.1 AND t0.c0 = 0.1 AND GREATEST(t0.c0, 0) = 0; -- {}
[16 Jun 13:31] Roy Lyseng
Thank you for the bug report.
Verified as a duplicate of bug#118033.