The query results provided by TiDB are unstable
Bug Report
Please answer these questions before submitting your issue. Thanks!
1. Minimal reproduce step (Required)
CREATE TABLE t0 (
c0 decimal(10, 0) NOT NULL,
c1 float unsigned zerofill NOT NULL,
PRIMARY KEY (c0, c1)
);
INSERT INTO t0 VALUES (-2068985011, 0.75245386), (-668435082, 0.19411194), (-500731198, 0.39079505), (0, 0), (0, 0.9938275), (12196703, 970789000), (919009011, 0.28699672), (1069380201, 0.2576304);
SELECT t0.c0 FROM t0 GROUP BY t0.c0, CAST(t0.c1 AS DATE), t0.c0 OR '' HAVING NOT (t0.c0);
2. What did you expect to see? (Required)
+----+
| c0 |
+----+
| 0 |
+----+
3. What did you see instead (Required)
The query results provided by TiDB are unstable, and there is a small probability of different results(Result 1 and Result 2) occurring when the same query is executed multiple times.
Result 1:
MySQL> SELECT t0.c0 FROM t0 GROUP BY t0.c0, CAST(t0.c1 AS DATE), t0.c0 OR '' HAVING NOT (t0.c0);
+----+
| c0 |
+----+
| 0 |
+----+
1 row in set (0.002 sec)
Result 2:
MySQL> SELECT t0.c0 FROM t0 GROUP BY t0.c0, CAST(t0.c1 AS DATE), t0.c0 OR '' HAVING NOT (t0.c0);
+----+
| c0 |
+----+
| 0 |
| 0 |
+----+
2 rows in set, 1 warning (0.005 sec)
4. What is your TiDB version? (Required)
MySQL> select tidb_version();
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tidb_version() |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Release Version: v8.0.0
Edition: Community
Git Commit Hash: 8ba1fa452b1ccdbfb85879ea94b9254aabba2916
Git Branch: HEAD
UTC Build Time: 2024-03-28 14:22:04
GoVersion: go1.21.6
Race Enabled: false
Check Table Before Drop: false
Store: tikv |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.002 sec)
The root cause is tikv's cast decimal as date is not consistent with tidb. If planner generates two-phase agg, then tikv will execute the cast decimal as date, otherwise, tidb will.
/label affects-8.1
/severity major
The bug is not just that TiKV's cast_real_as_time is inconsistent with TiDB, but that the TiDB and TiKV's cast_real_as_time are inconsistent with TiDB.
MySQL 8.3.0
mysql> select c1, cast(c1 as date) from t0 order by c1;
+--------------+------------------+
| c1 | cast(c1 as date) |
+--------------+------------------+
| 000000000000 | NULL |
| 00000.194112 | NULL |
| 000000.25763 | NULL |
| 00000.286997 | NULL |
| 00000.390795 | NULL |
| 00000.752454 | NULL |
| 00000.993828 | NULL |
| 000970789000 | NULL |
+--------------+------------------+
8 rows in set, 8 warnings (0.02 sec)
TiDB
mysql> select c1, cast(c1 as date) from t0 order by c1;
+------------+---------------------+
| c1 | cast(c1 as date) |
+------------+---------------------+
| 0 | 0000-00-00 00:00:00 |
| 0.19411194 | 0000-00-00 |
| 0.2576304 | 0000-00-00 |
| 0.28699672 | 0000-00-00 |
| 0.39079505 | 0000-00-00 |
| 0.75245386 | NULL |
| 0.9938275 | NULL |
| 970789000 | NULL |
+------------+---------------------+
8 rows in set, 3 warnings (0.01 sec)
TiKV
mysql> select c1, cast(c1 as date) from t0 order by c1;
+------------+------------------+
| c1 | cast(c1 as date) |
+------------+------------------+
| 0 | 0000-00-00 |
| 0.19411194 | 0000-00-00 |
| 0.2576304 | 0000-00-00 |
| 0.28699672 | 0000-00-00 |
| 0.39079505 | 0000-00-00 |
| 0.75245386 | 0000-00-00 |
| 0.9938275 | 0000-00-00 |
| 970789000 | NULL |
+------------+------------------+
8 rows in set, 1 warning (0.01 sec)