pingcap / pingcap/tidb

Correctness: Logically equivalent queries using INTERSECT and UNION/EXCEPT produce inconsistent results

Open
#62,689 1 comment 0 reactions 1 assignee Claimed by @hawkingrei View on GitHub
fuzz/randomtest sig/planner type/bug
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.