pingcap / pingcap/tidb

Date value change caused by the combination of (JOIN,LIKE,BIN,DATE_SUB)

Open
#38,747 1 comment 0 reactions 0 assignees View on GitHub
affects-5.0 affects-5.1 affects-5.2 affects-5.3 affects-5.4 affects-6.0 affects-6.1 affects-6.2 affects-6.3 affects-6.4 affects-6.5 affects-6.6 affects-7.0 affects-7.1 affects-7.5 affects-8.1 affects-8.5 severity/major sig/execution type/bug
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

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.