Bug #117851 Incorrect Behavior of EXISTS Condition with OR in SQL Query
Submitted: 2 Apr 7:05 Modified: 2 Apr 9:43
Reporter: zhiqiang cheng Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S2 (Serious)
Version: 9.1.0, 8.0.41, 8.4.4, 9.2.0 OS:Ubuntu (20.04)
Assigned to: CPU Architecture:Any

[2 Apr 7:05] zhiqiang cheng
Description:
When using the EXISTS operator with a WHERE clause, MySQL is returning incorrect results. Specifically, in a query where the EXISTS operator is combined with an OR condition, the result should be empty when no matching rows exist. However, the query is incorrectly returning a result, despite the condition logically evaluating to FALSE.

How to repeat:
Create Test Table and Insert Sample Data:
CREATE TABLE `t1` (
  `c1` int,
  `c2` int
);

INSERT INTO `t1` VALUES (1,2);

Execute the Following Queries:
Query 1: Without WHERE Clause Filtering
select  
  ((exists (
      select  
          ref_1.c2 as c_1
        from 
          t1 as ref_1
        where ((-87) <> (subq_0.c_0)) ))
   or false) as w_1
from 
  (t1 as ref_0
    left outer join (select  
          45 as c_0,
          ref_1.c1 as c_1
        from 
          t1 as ref_1
        ) as subq_0
    on (( (ref_0.c2) = (subq_0.c_1)) ))

Result:
+------+
| w_1  |
+------+
|    0 |
+------+
1 row in set (0.00 sec)    

Query 2: With WHERE Clause Filtering
SELECT  
  ((EXISTS (
      SELECT  
          ref_1.c2 AS c_1
        FROM 
          t1 AS ref_1
        WHERE ((-87) <> (subq_0.c_0)) ))
   OR FALSE) AS w_1
FROM 
  (t1 AS ref_0
    LEFT OUTER JOIN (SELECT  
          45 AS c_0,
          ref_1.c1 AS c_1
        FROM 
          t1 AS ref_1
        ) AS subq_0
    ON ((ref_0.c2) = (subq_0.c_1)) )
WHERE ((EXISTS (
      SELECT  
          ref_1.c2 AS c_1
        FROM 
          t1 AS ref_1
        WHERE ((-87) <> (subq_0.c_0)) ))
   OR FALSE);

Expected Result:
Empty set (0.00 sec)
Since the EXISTS subquery in the WHERE clause evaluates to FALSE (in Query 1), the query should return an empty set.

Actual Result:
+------+
| w_1  |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

mysql version:
github commit: 61a3a1d8ef15512396b4c2af46e922a19bf2b174
version: 9.1.0 

os version:
Linux ubuntu 5.15.0-134-generic #145~20.04.1-Ubuntu SMP Mon Feb 17 13:27:16 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
[2 Apr 9:43] MySQL Verification Team
Hello zhiqiang cheng,

Thank you for the report and test case.

regards,
Umesh