Bug #118063 Wrong Join Result after creating index on expressions
Submitted: 27 Apr 19:02 Modified: 28 Apr 7:34
Reporter: Zhaokun Xiang Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S1 (Critical)
Version:9.0, 8.0, 8.0.42, 8.4.5, 9.3.0 OS:Any
Assigned to: CPU Architecture:Any

[27 Apr 19:02] Zhaokun Xiang
Description:
Hi, MySQL developers,

Please see the below cases.

```

CREATE TABLE t1(c0 FLOAT);
CREATE TABLE t0(c0 INT);

INSERT INTO t1(c0) VALUES(0.2);

INSERT INTO t0(c0) VALUES(1);

CREATE INDEX i0 ON t1((((CAST(IFNULL(t1.c0, t1.c0) AS SIGNED)))));
-- index creating is necessary

select * from t1 inner join t0 on NOT(IFNULL(t1.c0, t1.c0));
-- 0.2, 1

select * from t1 left join t0 on NOT(IFNULL(t1.c0, t1.c0));
-- 0.2, NULL
-- wrong result based on the inner join result

select * from t1 where exists(select 1 from t0 where NOT(IFNULL(t1.c0, t1.c0)));
-- 0.2

select * from t1 where not exists(select 1 from t0 where NOT(IFNULL(t1.c0, t1.c0)));
-- 0.2
-- semi join and anti-join should contradict with each other

```

How to repeat:
```

CREATE TABLE t1(c0 FLOAT);
CREATE TABLE t0(c0 INT);

INSERT INTO t1(c0) VALUES(0.2);

INSERT INTO t0(c0) VALUES(1);

CREATE INDEX i0 ON t1((((CAST(IFNULL(t1.c0, t1.c0) AS SIGNED)))));

select * from t1 inner join t0 on NOT(IFNULL(t1.c0, t1.c0));
-- 0.2, 1

select * from t1 left join t0 on NOT(IFNULL(t1.c0, t1.c0));
-- 0.2, NULL

select * from t1 where exists(select 1 from t0 where NOT(IFNULL(t1.c0, t1.c0)));
-- 0.2

select * from t1 where not exists(select 1 from t0 where NOT(IFNULL(t1.c0, t1.c0)));
-- 0.2

```
[28 Apr 7:34] MySQL Verification Team
Hello Zhaokun Xiang,

Thank you for the report and feedback.
Verified as described.

regards,
Umesh