Inconsistent result with MySQL for cross-type comparison DATE < BOOLEAN in WHERE clause, leading to incorrect query results.
- 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)
**The following test sample returns inconsistent results in TiDB in both MySQL and MariaDB, as the two SELECT statements in TiDB return 5 rows of data, but in both MySQL and MariaDB it is empty set.**
**The versions of MySQL and MariaDB that we tested are given below.**
```sql
USE test;
DROP DATABASE IF EXISTS database17;
CREATE DATABASE database17;
USE database17;
CREATE TABLE t0(c0 DECIMAL NOT NULL );
CREATE TABLE t6(c0 DOUBLE UNSIGNED ZEROFILL NOT NULL );
REPLACE INTO t0 VALUES (324735628);
UPDATE t6 SET c0=false;
ALTER TABLE t0 ADD PRIMARY KEY(c0);
CREATE INDEX i86 ON t6(c0 DESC);
INSERT IGNORE INTO t6 VALUES (0.8191472976429324) ON DUPLICATE KEY UPDATE c0=(((CASE (BINARY (-1724554201)) WHEN (BINARY (-9.23685195E8)) THEN ((true)^('{v眺☊i')) ELSE t6.c0 END ))!=(-1329242120));
INSERT INTO t0(c0) VALUES (1950573506);
INSERT INTO t6(c0) VALUES (0.47473235440296313);
INSERT IGNORE INTO t6 VALUES (0.7321342756874027) ON DUPLICATE KEY UPDATE c0=t6.c0;
INSERT IGNORE INTO t0 VALUES (-1725746229);
ALTER TABLE t6 DISABLE KEYS;
REPLACE INTO t6 VALUES (0.1186623716704105);
INSERT INTO t0 VALUES (312556011), (-1256909012) ON DUPLICATE KEY UPDATE c0=((-973758698)NOT REGEXP(0.2090427313766725));
INSERT IGNORE INTO t6(c0) VALUES (0.41724478025661405), (0.4182454682984229);
INSERT IGNORE INTO t0 VALUES (NULL) ON DUPLICATE KEY UPDATE c0=CAST(((t0.c0)LIKE(374735245)) AS DATE);
INSERT IGNORE INTO t6 VALUES (0.645146703673624) ON DUPLICATE KEY UPDATE c0='';
UPDATE t0 SET c0=t0.c0;
REPLACE INTO t6 VALUES (0.033377990415503156), (0.759263308095218);
INSERT INTO t0(c0) VALUES (1028913688);
REPLACE INTO t6(c0) VALUES (0.6723133987795121);
REPLACE INTO t0(c0) VALUES (-1689729959), (1233085217), (-1116404875);
ALTER TABLE t6 MODIFY c0 FLOAT NOT NULL;
INSERT INTO t0(c0) VALUES (-604594297);
INSERT INTO t6(c0) VALUES (0.2732782226489656);
TRUNCATE t6;
ALTER TABLE t6 ENABLE KEYS;
UPDATE t6 SET c0='[' WHERE -1036791629;
REPLACE INTO t0(c0) VALUES (-956200131);
INSERT INTO t6 VALUES (0.7704446183248939), (0.9626755010180835) ON DUPLICATE KEY UPDATE c0=-1816346620;
CREATE ALGORITHM=TEMPTABLE VIEW v0(c0) AS SELECT DISTINCT t6.c0 FROM t6;
INSERT IGNORE INTO t0 VALUES (-1770734776), (235520032) ON DUPLICATE KEY UPDATE c0=(CASE false WHEN 'qh' THEN ((CAST(t0.c0 AS CHAR)) IS NOT NULL) WHEN (BINARY ((- (t0.c0)))) THEN t0.c0 ELSE (CASE ((t0.c0)>=(-205832836)) WHEN ((t0.c0)>>(t0.c0)) THEN t0.c0 ELSE (+ ('[Kl?f<')) END ) END );
REPLACE INTO t0(c0) VALUES (2062913270);
ALTER TABLE t0 ENABLE KEYS;
REPLACE INTO t0 VALUES (892333581);
REPLACE INTO t6(c0) VALUES (0.40438490381208525);
REPLACE INTO t6(c0) VALUES (0.5453661508831553);
REPLACE INTO t6(c0) VALUES (0.6870351789145348);
INSERT INTO t6(c0) VALUES (0.6344781623545988);
INSERT INTO t6(c0) VALUES (0.7815733088311685), (0.2742923404910067), (0.48446713566660327) ON DUPLICATE KEY UPDATE c0=(((('-V')AND('1327901895')))LIKE(CAST(t6.c0 AS DECIMAL)));
REPLACE INTO t6 VALUES (0.940026952601919);
REPLACE INTO t0(c0) VALUES (-999984801);
REPLACE INTO t0(c0) VALUES (615105012);
REPLACE INTO t6 VALUES (0.1361545306216595);
REPLACE INTO t6(c0) VALUES (0.6271247837674543);
INSERT INTO t0 VALUES (-2132893923);
INSERT IGNORE INTO t0(c0) VALUES (-869389129) ON DUPLICATE KEY UPDATE c0=NULL;
INSERT IGNORE INTO t6 VALUES (0.8359667196796086), (-1.059368682E9) ON DUPLICATE KEY UPDATE c0=-2143834165;
INSERT IGNORE INTO t6 VALUES (1.87247682E9) ON DUPLICATE KEY UPDATE c0=-456238745;
REPLACE INTO t0(c0) VALUES (1861358582), (1466239031);
REPLACE INTO t0 VALUES (2128609706);
ALTER TABLE t0 ORDER BY c0;
REPLACE INTO t0 VALUES (-1376668725);
REPLACE INTO t6 VALUES (0.8574932208661153);
INSERT INTO t0(c0) VALUES (-407960703);
UPDATE t6 SET c0=626616558 WHERE ((t6.c0)REGEXP(NULL));
INSERT INTO t6 VALUES (0.21818023071127957) ON DUPLICATE KEY UPDATE c0='N';
INSERT IGNORE INTO t0(c0) VALUES (-994794086);
INSERT INTO t0(c0) VALUES (-648129583) ON DUPLICATE KEY UPDATE c0=t0.c0;
INSERT IGNORE INTO t0 VALUES (-928469097) ON DUPLICATE KEY UPDATE c0=t0.c0;
-- cardinality: 5 || expect: 0
SELECT DISTINCT t6.c0 FROM t6 INNER JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY);
-- cardinality: 5 || expect: 0
(SELECT DISTINCT t6.c0 FROM t6 LEFT JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY)) INTERSECT (SELECT DISTINCT t6.c0 FROM t6 RIGHT JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY));
```
### 2. What did you expect to see? (Required)
```shell
mysql> SELECT DISTINCT t6.c0 FROM t6 INNER JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY);
Empty set, 17 warnings (0.00 sec)
mysql> (SELECT DISTINCT t6.c0 FROM t6 LEFT JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY)) INTERSECT (SELECT DISTINCT t6.c0 FROM t6 RIGHT JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY));
Empty set, 289 warnings (0.00 sec)
```
### 3. What did you see instead (Required)
```shell
mysql> SELECT DISTINCT t6.c0 FROM t6 INNER JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY);
+------------+
| c0 |
+------------+
| 0.48446715 |
| 0.21818022 |
| 0.27429235 |
| 0.4043849 |
| 0.13615453 |
+------------+
5 rows in set, 12 warnings (0.00 sec)
mysql> (SELECT DISTINCT t6.c0 FROM t6 LEFT JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY)) INTERSECT (SELECT DISTINCT t6.c0 FROM t6 RIGHT JOIN v0 ON v0.c0 WHERE CAST(((CAST(t6.c0 AS DATE))<(((v0.c0) IS NOT NULL))) AS BINARY));
+------------+
| c0 |
+------------+
| 0.21818022 |
| 0.27429235 |
| 0.48446715 |
| 0.4043849 |
| 0.13615453 |
+------------+
5 rows in set, 216 warnings (0.01 sec)
mysql> select version();
+--------------------------------------------+
| version() |
+--------------------------------------------+
| 8.0.11-TiDB-v9.0.0-beta.2.pre-193-g4852c06 |
+--------------------------------------------+
1 row in set (0.00 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 [database17]> select version();
+--------------------------+
| version() |
+--------------------------+
| 10.11.11-MariaDB-ubu2204 |
+--------------------------+
1 row in set (0.000 sec)
```
Contributor guide
Assessment
This issue has not been assessed yet.