In TiDB, a logically equivalent INNER JOIN query and a LEFT JOIN INTERSECT RIGHT JOIN query return different numbers of results (80rows vs 64rows, but MySQL v9.2.0 returns 80 rows)
- 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
DROP DATABASE IF EXISTS database14;
CREATE DATABASE database14;
USE database14;
CREATE TABLE t0(c0 TEXT(381) NOT NULL );
-- CREATE TABLE t1(c0 FLOAT NOT NULL CHECK (-1922651244) DEFAULT -5.8100329E8 ); 这个再MySQL报错,因为check
CREATE TABLE t1(c0 FLOAT NOT NULL DEFAULT -5.8100329E8 );
REPLACE INTO t1(c0) VALUES (1.80757265E9);
INSERT IGNORE INTO t0 VALUES ('-961728580');
INSERT IGNORE INTO t0 VALUES ('') ON DUPLICATE KEY UPDATE c0=t0.c0;
INSERT INTO t0 VALUES ('0.8164141728236117');
REPLACE INTO t1(c0) VALUES (0.6278665743125483);
INSERT INTO t0(c0) VALUES ('');
INSERT IGNORE INTO t1 VALUES (0.4837593867720348);
REPLACE INTO t0 VALUES ('0.7991974597952785');
ALTER TABLE t1 ORDER BY c0;
REPLACE INTO t0(c0) VALUES ('sl');
TRUNCATE t1;
ALTER TABLE t1 CHANGE c0 c0 FLOAT NOT NULL ;
INSERT INTO t0 VALUES ('s7') ON DUPLICATE KEY UPDATE c0=((0.30592746903586665)<=(t0.c0));
REPLACE INTO t0(c0) VALUES ('6拋f##?R)');
INSERT IGNORE INTO t1(c0) VALUES (0.9278234902585017) ON DUPLICATE KEY UPDATE c0=t1.c0;
REPLACE INTO t1 VALUES (1.368862154E9);
INSERT INTO t0(c0) VALUES ('-865537461');
INSERT IGNORE INTO t0 VALUES ('0.048242720046977605') ON DUPLICATE KEY UPDATE c0=t0.c0;
REPLACE INTO t0(c0) VALUES ('122445359');
REPLACE INTO t1 VALUES (0.8047971278346036);
REPLACE INTO t0 VALUES ('-1422720469');
INSERT IGNORE INTO t0(c0) VALUES ('') ON DUPLICATE KEY UPDATE c0=80396966;
REPLACE INTO t1 VALUES (0.1330300805922071);
INSERT INTO t1(c0) VALUES (-1.241753585E9), (0.6670256958857832), (0.012978619162774763);
INSERT INTO t1(c0) VALUES (-1.391257045E9) ON DUPLICATE KEY UPDATE c0=CAST((CASE 853296368 WHEN t1.c0 THEN NULL ELSE ((t1.c0)&(-1257322213)) END ) AS DECIMAL);
REPLACE INTO t0 VALUES ('Z');
INSERT IGNORE INTO t1 VALUES (0.2622023584794554) ON DUPLICATE KEY UPDATE c0='';
REPLACE INTO t1(c0) VALUES (0.7524988884308718), (0.7183164315407768);
REPLACE INTO t0 VALUES ('-1634818174');
UPDATE t1 SET c0='-521705288';
INSERT IGNORE INTO t1 VALUES (0.9944165493247532), (0.8645105368237196) ON DUPLICATE KEY UPDATE c0=((1192436255)OR((('ᮯ')REGEXP(t1.c0))));
INSERT IGNORE INTO t0(c0) VALUES (NULL);
INSERT IGNORE INTO t1 VALUES (0.9812753355003389);
REPLACE INTO t1 VALUES (0.4498988552826053), (0.5426725112835016);
REPLACE INTO t1 VALUES (0.619245018660929);
REPLACE INTO t0 VALUES ('9'), (''), ('2043516210');
INSERT IGNORE INTO t1 VALUES (0.7186094232810393);
INSERT INTO t0 VALUES ('jw1o'), ('lIG');
-- cardinality: 80
SELECT DISTINCT t0.c0, t1.c0 FROM t0 INNER JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true;
-- cardinality: 64
(SELECT DISTINCT t0.c0, t1.c0 FROM t0 LEFT JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true)
INTERSECT
(SELECT DISTINCT t0.c0, t1.c0 FROM t0 RIGHT JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true);
```
### 2. What did you expect to see? (Required)
```shell
mysql> SELECT DISTINCT t0.c0, t1.c0 FROM t0 INNER JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true;
+----------------------+------------+
| c0 | c0 |
+----------------------+------------+
| ... | .......... |
+----------------------+------------+
80 rows in set, 12 warnings (0.00 sec)
mysql> (SELECT DISTINCT t0.c0, t1.c0 FROM t0 LEFT JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true)
-> INTERSECT
-> (SELECT DISTINCT t0.c0, t1.c0 FROM t0 RIGHT JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true);
+----------------------+------------+
| c0 | c0 |
+----------------------+------------+
| ... | .......... |
+----------------------+------------+
80 rows in set, 240 warnings (0.00 sec)
```
### 3. What did you see instead (Required)
```shell
mysql> SELECT DISTINCT t0.c0, t1.c0 FROM t0 INNER JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true;
+----------------------+------------+
| c0 | c0 |
+----------------------+------------+
| ... | .......... |
+----------------------+------------+
80 rows in set, 17 warnings (0.00 sec)
mysql> (SELECT DISTINCT t0.c0, t1.c0 FROM t0 LEFT JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true)
-> INTERSECT
-> (SELECT DISTINCT t0.c0, t1.c0 FROM t0 RIGHT JOIN t1 ON ((CAST(((t0.c0) IS NULL) AS TIME))<=>(CAST(t0.c0 AS DECIMAL))) WHERE true);
+----------------------+------------+
| c0 | c0 |
+----------------------+------------+
| ... | .......... |
+----------------------+------------+
64 rows in set, 30 warnings (0.01 sec)
```
### 4. What is your TiDB version? (Required)
```shell
mysql> select version();
+--------------------------------------------+
| version() |
+--------------------------------------------+
| 8.0.11-TiDB-v9.0.0-beta.2.pre-193-g4852c06 |
+--------------------------------------------+
1 row in set (0.00 sec)
```
Contributor guide
Assessment
This issue has not been assessed yet.