EXCEPT with Semantically equivalent left/right queries isn't eliminated
- Dominant language
- Go
- Stars
- 40.5k
- Forks
- 6.2k
- PR merge metrics
- PR metrics pending
Description
## Bug Report
Dear TiDB Developer,
This is another situation, which is different from q1 EXCEPT q1. Since the following three queries (q1, q2, and q3) are semantically equivalent, q1 EXCEPT q2, q1 EXCEPT q3 or q2 EXCEPT q3 should always return empty set.
q1: SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME **!=** COLUMNS.TABLE_NAME;
q2: SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME **<>** COLUMNS.TABLE_NAME;
q3: SELECT * FROM TABLES **STRAIGHT** JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Best regard,
### 1. Minimal reproduce step (Required)
```
mysql> use INFORMATION_SCHEMA;
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME <> COLUMNS.TABLE_NAME;
Empty set (3 min 40.15 sec)
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES STRAIGHT JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Empty set (3 min 44.65 sec)
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME <> COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES STRAIGHT_JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Empty set (3 min 22.49 sec)
```
### 2. What did you expect to see? (Required)
```
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME <> COLUMNS.TABLE_NAME;
Empty set (0.00sec)
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES STRAIGHT JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Empty set (0.00sec)
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME <> COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES STRAIGHT_JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Empty set (0.00sec)
```
### 3. What did you see instead (Required)
```
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME <> COLUMNS.TABLE_NAME;
Empty set (3 min 40.15 sec)
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES STRAIGHT JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Empty set (3 min 44.65 sec)
mysql> SELECT * FROM TABLES CROSS JOIN COLUMNS ON TABLES.TABLE_NAME <> COLUMNS.TABLE_NAME
EXCEPT
SELECT * FROM TABLES STRAIGHT_JOIN COLUMNS ON TABLES.TABLE_NAME != COLUMNS.TABLE_NAME;
Empty set (3 min 22.49 sec)
```
### 4. What is your TiDB version? (Required)
| Release Version: v8.5.1
Edition: Community
Git Commit Hash: https://github.com/pingcap/tidb/commit/fea86c8e35ad4a86a5e1160701f99493c2ee547c
Git Branch: HEAD
UTC Build Time: 2025-01-16 07:38:34
GoVersion: go1.23.4
Race Enabled: false
Check Table Before Drop: false
Store: tikv |
Contributor guide
Assessment
This issue has not been assessed yet.