pingcap / pingcap/tidb

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)

Open
#63,636 1 comment 2 reactions 0 assignees View on GitHub
contribution 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
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

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.