Complex UNION/EXCEPT collection result is inconsistent with equivalent INTERSECT and incompatible with MySQL/OceanBase/MariaaDB.
- 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)
```sql
DROP DATABASE IF EXISTS database29;
CREATE DATABASE database29;
USE database29;
CREATE TABLE t0(c0 NUMERIC ZEROFILL NOT NULL );
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v0(c0, c1, c2, c3, c4) AS SELECT DISTINCT t0.c0, ((((t0.c0)OR(((t0.c0) IS NULL))))NOT LIKE('')), IF(t0.c0, -1458386991, CAST((~ ((BINARY (t0.c0)))) AS UNSIGNED)), 1749963300, t0.c0 FROM t0;
UPDATE t0 SET c0='0' WHERE t0.c0;
INSERT IGNORE INTO t0(c0) VALUES (NULL);
INSERT IGNORE INTO t0(c0) VALUES (NULL);
INSERT IGNORE INTO t0 VALUES (1);
REPLACE INTO t0(c0) VALUES (140995754);
INSERT IGNORE INTO t0 VALUES (-1531537654), (-622776969);
-- tidb_cardinality: 2 MySQL/OceanBase/MariaDB_cardinality: 2
(SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) INTERSECT (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))));
-- tidb_cardinality: 4 MySQL/OceanBase/MariaDB_cardinality: 2
(SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) UNION SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) EXCEPT ((SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) EXCEPT SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) UNION (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) EXCEPT SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))));
### 2. What did you expect to see? (Required)
```shell
mysql> -- tidb_cardinality: 2 MySQL/OceanBase/MariaDB_cardinality: 2
XCEPT SELECT DISmysql> (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) INTERSECT (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))));
)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.461055522530741
+------------+-------------+-----------+-----------+----+
| c3 | c2 | c0 | c4 | c1 |
+------------+-------------+-----------+-----------+----+
| 1749963300 | -1458386991 | 140995754 | 140995754 | 1 |
| 1749963300 | -1458386991 | 1 | 1 | 1 |
+------------+-------------+-----------+-----------+----+
2 rows in set, 16 warnings (0.00 sec)
mysql> -- cardinality: 4 MySQL/OceanBase/MariaDB_cardinality: 2
mysql> (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) UNION SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) EXCEPT ((SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) EXCEPT SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) UNION (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) EXCEPT SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))));
+------------+-------------+-----------+-----------+------+
| c3 | c2 | c0 | c4 | c1 |
+------------+-------------+-----------+-----------+------+
| 1749963300 | -1458386991 | 140995754 | 140995754 | 1 |
| 1749963300 | -1458386991 | 1 | 1 | 1 |
+------------+-------------+-----------+-----------+------+
2 rows in set, 48 warnings (0.01 sec)
```
### 3. What did you see instead (Required)
```shell
mysql> -- tidb_cardinality: 2 MySQL/OceanBase/MariaDB_cardinality: 2
mysql> (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) INTERSECT (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))));
+------------+-------------+-----------+-----------+------+
| c3 | c2 | c0 | c4 | c1 |
+------------+-------------+-----------+-----------+------+
| 1749963300 | -1458386991 | 1 | 1 | 1 |
| 1749963300 | -1458386991 | 140995754 | 140995754 | 1 |
+------------+-------------+-----------+-----------+------+
2 rows in set (0.02 sec)
mysql> -- cardinality: 4 MySQL/OceanBase/MariaDB_cardinality: 2
mysql> (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) UNION SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) EXCEPT ((SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) EXCEPT SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))) UNION (SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 RIGHT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END ))))) EXCEPT SELECT DISTINCT v0.c3, v0.c2, v0.c0, v0.c4, v0.c1 FROM t0 LEFT JOIN v0 ON v0.c0 WHERE (~ (((((1710930304)NOT REGEXP('-826673140')))AND((CASE v0.c2 WHEN -1.472566621E9 THEN v0.c4 WHEN 0.4610555225307418 THEN 1961126733 ELSE v0.c4 END )))))));
+------------+-------------+-----------+-----------+------+
| c3 | c2 | c0 | c4 | c1 |
+------------+-------------+-----------+-----------+------+
| 1749963300 | -1458386991 | 140995754 | 140995754 | 1 |
| 1749963300 | -1458386991 | 1 | 1 | 1 |
| 1749963300 | -1458386991 | 140995754 | 140995754 | 1 |
| 1749963300 | -1458386991 | 1 | 1 | 1 |
+------------+-------------+-----------+-----------+------+
4 rows in set (0.04 sec)
```
### 4. What is your TiDB version? (Required)
TiDB
```shell
mysql> select version();
+--------------------------------------------+
| version() |
+--------------------------------------------+
| 8.0.11-TiDB-v9.0.0-beta.2.pre-193-g4852c06 |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+--------------------+
| version() |
+--------------------+
| 8.0.11-TiDB-v7.5.1 |
+--------------------+
1 row in set (0.00 sec)
```
MySQL
```shell
mysql> select version();
+-----------+
| version() |
+-----------+
| 9.2.0 |
+-----------+
1 row in set (0.00 sec)
```
MariaDB
```shell
version(): 10.11.11-MariaDB-ubu2204
```
OceanBase
```shell
obclient(root@test)[database29]> select version();
+-------------------------------+
| version() |
+-------------------------------+
| 5.7.25-OceanBase_CE-v4.2.1.10 |
+-------------------------------+
1 row in set (0.003 sec)
```
Contributor guide
Assessment
This issue has not been assessed yet.