pingcap / pingcap/tidb

The same logical SQL query, written in the third way on TiDB (simulating INTERSECT with UNION and EXCEPT) appears to have duplicate data, with different results than the first two (JOIN / INTERSECT) and MySQL/MariaDB

Open
#63,635 1 comment 1 reaction 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)

```sql
DROP DATABASE IF EXISTS database13;
CREATE DATABASE database13;
USE database13;
CREATE TABLE t92(c0 DECIMAL NOT NULL );
CREATE TABLE t0(c0 CHAR NOT NULL , c1 DECIMAL NOT NULL , c2 CHAR NOT NULL , PRIMARY KEY(c2));
INSERT IGNORE INTO t0 VALUES ('z', -1799703688, '9') ON DUPLICATE KEY UPDATE c2=t0.c1;
CREATE VIEW v0(c0) AS SELECT DISTINCT CAST('>' AS DECIMAL) FROM t0;
INSERT INTO t92(c0) VALUES (520541487);

REPLACE INTO t92 VALUES (1770006261), (-1867855007);
ALTER TABLE t0 DROP c0;

ALTER TABLE t0 CHANGE c2 c2 CHAR NOT NULL ;

UPDATE t92 SET c0='\r[*[y' WHERE (((((('4')^(t92.c0)))|(NULL)))<=>(((((t92.c0) IS NULL))>>('-1465973542'))));

ALTER TABLE t92 MODIFY c0 DOUBLE NOT NULL;

REPLACE INTO t92 VALUES (0.1948047735894446);
INSERT IGNORE INTO t92 VALUES (0.6326933717349136), (1.48498502E9), (5.20541487E8);

-- cardinality: 1
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END );

-- cardinality: 1
(SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END ))
INTERSECT
(SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END ));

-- cardinality: 2
(
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
UNION
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
)
EXCEPT
(
(
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
EXCEPT
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
)
UNION
(
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
EXCEPT
SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
)
);
```
### 2. What did you expect to see? (Required)
```shell
mysql> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END );
+----+----+-------------+
| c2 | c0 | c1 |
+----+----+-------------+
| 9 | 0 | -1799703688 |
+----+----+-------------+
1 row in set, 2 warnings (0.00 sec)

mysql>
mysql> -- cardinality: 1
mysql> (SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END ))
-> INTERSECT
-> (SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END ));
+----+----+-------------+
| c2 | c0 | c1 |
+----+----+-------------+
| 9 | 0 | -1799703688 |
+----+----+-------------+
1 row in set, 4 warnings (0.01 sec)

mysql> -- cardinality: 2
mysql> (
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> UNION
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> )
-> EXCEPT
-> (
-> (
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> EXCEPT
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> )
-> UNION
-> (
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> EXCEPT
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> )
-> );
+------+------+-------------+
| c2 | c0 | c1 |
+------+------+-------------+
| 9 | 0 | -1799703688 |
+------+------+-------------+
1 row in set, 12 warnings (0.00 sec)
```
### 3. What did you see instead (Required)
```shell
mysql> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END );
+----+----------------------------------+-------------+
| c2 | c0 | c1 |
+----+----------------------------------+-------------+
| 9 | 0.000000000000000000000000000000 | -1799703688 |
+----+----------------------------------+-------------+
1 row in set, 2 warnings (0.00 sec)

mysql>
mysql> -- cardinality: 1
mysql> (SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END ))
-> INTERSECT
-> (SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END ));
+------+----------------------------------+-------------+
| c2 | c0 | c1 |
+------+----------------------------------+-------------+
| 9 | 0.000000000000000000000000000000 | -1799703688 |
+------+----------------------------------+-------------+
1 row in set, 4 warnings (0.01 sec)

mysql> -- cardinality: 2
mysql> (
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> UNION
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> )
-> EXCEPT
-> (
-> (
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> EXCEPT
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> )
-> UNION
-> (
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL RIGHT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> EXCEPT
-> SELECT DISTINCT t0.c2, v0.c0, t0.c1 FROM v0 NATURAL LEFT JOIN t0 WHERE (CASE (('s')<(v0.c0)) WHEN NULL THEN ATAN2(v0.c0, '') ELSE CRC32((((CASE v0.c0 WHEN -200474309 THEN '0' ELSE '' END ))NOT LIKE(220370698))) END )
-> )
-> );
+------+------+-------------+
| c2 | c0 | c1 |
+------+------+-------------+
| 9 | 0 | -1799703688 |
| 9 | 0 | -1799703688 |
+------+------+-------------+
2 rows in set, 12 warnings (0.02 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**
```shell
mysql> select version();
+-----------+
| version() |
+-----------+
| 9.2.0 |
+-----------+
1 row in set (0.00 sec)
```

**MariaDB**
```shell
MariaDB [database13]> select version();
+--------------------------+
| version() |
+--------------------------+
| 10.11.11-MariaDB-ubu2204 |
+--------------------------+
1 row in set (0.000 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.