Date value change caused by the combination of (JOIN,LIKE,BIN,DATE_SUB)
- Dominant language
- Go
- Stars
- 40.5k
- Forks
- 6.2k
- PR merge metrics
- PR metrics pending
Description
## Bug Report
### 1. Minimal reproduce step (Required)
```sql
drop table if exists t;
create table t (c1 double);
insert into t values (0.0001),(-1),(12.991),(2),(1.009);
SELECT (DATE_SUB(BIN(f1), INTERVAL 1 HOUR_MINUTE)) FROM (SELECT 1 FROM t) AS t1
JOIN (SELECT (REVERSE(c1)) AS f1 FROM t HAVING NOT (f1 LIKE '%0%')) AS t2; -- sql1
SELECT (DATE_SUB(BIN(f1), INTERVAL 1 HOUR_MINUTE)) FROM (SELECT 1 FROM t) AS t1
JOIN (SELECT (REVERSE(c1)) AS f1 FROM t HAVING 1) AS t2; -- sql2
```
I'm sorry for my long sql statements, but I've tried my best to simplify them.
The problem cannot be reproduced without any of (`JOIN`,`LIKE`,`BIN`,`DATE_SUB`).
### 2. What did you expect to see? (Required)
In theory, the result of `sql1` ⊆ the result of `sql2`, because the `HAVING 1` in `sql2` is always true, but the `HAVING NOT (f1 LIKE '%0%')` `in sql1` may be false. Moreover, the normal `JOIN` does not break this relationship.
### 3. What did you see instead (Required)
However, the date `1100-01-10 23:59:00` changed to `NULL` after changing `HAVING NOT (f1 LIKE '%0%')` to `HAVING 1`, seems like a logical bug.
```sql
mysql> SELECT (DATE_SUB(BIN(f1), INTERVAL 1 HOUR_MINUTE)) FROM (SELECT 1 FROM t) AS t1
-> JOIN (SELECT (REVERSE(c1)) AS f1 FROM t HAVING NOT (f1 LIKE '%0%')) AS t2; -- sql1
+---------------------------------------------+
| (DATE_SUB(BIN(f1), INTERVAL 1 HOUR_MINUTE)) |
+---------------------------------------------+
| NULL |
| 1100-01-10 23:59:00 |
| NULL |
| NULL |
| 1100-01-10 23:59:00 |
| NULL |
| NULL |
| 1100-01-10 23:59:00 |
| NULL |
| NULL |
| 1100-01-10 23:59:00 |
| NULL |
| NULL |
| 1100-01-10 23:59:00 |
| NULL |
+---------------------------------------------+
15 rows in set, 20 warnings (0.00 sec)
mysql> SELECT (DATE_SUB(BIN(f1), INTERVAL 1 HOUR_MINUTE)) FROM (SELECT 1 FROM t) AS t1
-> JOIN (SELECT (REVERSE(c1)) AS f1 FROM t HAVING 1) AS t2; -- sql2
+---------------------------------------------+
| (DATE_SUB(BIN(f1), INTERVAL 1 HOUR_MINUTE)) |
+---------------------------------------------+
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
+---------------------------------------------+
25 rows in set, 71 warnings (0.00 sec)
```
### 4. What is your TiDB version? (Required)
```sql
Release Version: v6.3.0-alpha-567-g312155afb
Edition: Community
Git Commit Hash: 312155afbd0f91a7526e9b2910cf2beb09bfc6f5
Git Branch: master
UTC Build Time: 2022-10-31 03:20:57
GoVersion: go1.19.1
Race Enabled: false
TiKV Min Version: 6.2.0-alpha
Check Table Before Drop: false
Store: unistore
```
Contributor guide
Assessment
This issue has not been assessed yet.