pingcap / pingcap/tidb

EXCEPT with Semantically equivalent left/right queries isn't eliminated

Open
#60,851 1 comment 0 reactions 0 assignees View on GitHub
severity/minor sig/planner type/bug
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

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.