Correctness: Logically equivalent queries using INTERSECT and UNION/EXCEPT produce inconsistent results
- Dominant language
- Go
- Stars
- 40.5k
- Forks
- 6.2k
- PR merge metrics
- PR metrics pending
Description
## Bug Report
Please answer these questions before submitting your issue. Thanks!
### 1. Minimal reproduce step (Required)
```shell
Run the bugTidb.txt script file.
The bugTidb.txt file contains a complete sample test.
```
### 2. What did you expect to see? (Required)
```sql
mysql> (SELECT DISTINCT v0.c0, t1.c0 FROM v0 INNER JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ))
81 rows
mysql> (SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )) INTERSECT (SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ))
81 rows
mysql> (SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ) UNION SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )) EXCEPT ((SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ) EXCEPT SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )) UNION (SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ) EXCEPT SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )))
81 rows
```
### 3. What did you see instead (Required)
```sql
mysql> (SELECT DISTINCT v0.c0, t1.c0 FROM v0 INNER JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ))
81 rows
mysql> (SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )) INTERSECT (SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ))
81 rows
mysql> (SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ) UNION SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )) EXCEPT ((SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ) EXCEPT SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )) UNION (SELECT DISTINCT v0.c0, t1.c0 FROM v0 RIGHT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END ) EXCEPT SELECT DISTINCT v0.c0, t1.c0 FROM v0 LEFT JOIN t1 ON (~ (((-1126649584) IS NULL))) WHERE (CASE v0.c0 WHEN (- (NULL)) THEN (('w') IS NOT NULL) ELSE 239985614 END )))
162 rows
```
### 4. What is your TiDB version? (Required)
**I have tested both versions of TiDB with the same problem.**
```shell
mysql> select version();
+--------------------------------------------+
| version() |
+--------------------------------------------+
| 8.0.11-TiDB-v9.0.0-beta.2.pre-193-g4852c06 |
+--------------------------------------------+
1 row in set (0.01 sec)
mysql> select version();
+--------------------+
| version() |
+--------------------+
| 8.0.11-TiDB-v7.5.1 |
+--------------------+
1 row in set (0.00 sec)
```
[bugTidb.txt](https://github.com/user-attachments/files/21488901/bugTidb.txt)
Contributor guide
Assessment
This issue has not been assessed yet.