Bug #115146 Inconsistent Results in SQL Query
| Submitted: | 28 May 2024 2:38 | Modified: | 28 May 2024 10:07 |
|---|---|---|---|
| Reporter: | Wenqian Deng | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 8.0 | OS: | Any |
| Assigned to: | CPU Architecture: | Any |
[28 May 2024 10:07]
MySQL Verification Team
HI Mr. Deng, Thank you for your bug report. Indeed, we managed to repeat your bug report: First query c_0 8124-01-25 second query This is a very small bug in our Optimiser, but it is still a bug. Thank you for your contribution. This is now a fully verified bug report for versions 8.0 and 8.4.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.038 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: The results vary unexpectedly based on a conditional statement within the query. Specifically, changing a constant TRUE to a condition involving TO_DAYS leads to a different result set. How to repeat: Set up the table: CREATE TABLE t1 (c_0 DATE, c_1 MEDIUMINT); INSERT INTO t1 VALUES ('8124-01-25', 2967254); Execute the following SQL query: SELECT t1.c_0 FROM t1 WHERE ( EXISTS ( SELECT (TO_DAYS(t1.c_0)) FROM t1 WHERE ( (TO_DAYS(t1.c_0)) <> -2.5698771209691616e+38 AND t1.c_0 BETWEEN -2.8264431170269555e+38 AND (CASE WHEN (TRUE AND TRUE) THEN ('6263-05-09 13:00:11.000000') ELSE ('6263-05-09 13:00:11.000000') END) ) ) AND t1.c_0 BETWEEN -9223372036854775808 AND '0001-01-01 00:00:00' ); Returns: +------------+ | c_0 | +------------+ | 8124-01-25 | +------------+ Modify the SQL query by replacing the TRUE condition in line 10 with (TO_DAYS(t1.c_0) = TO_DAYS(t1.c_0)): SELECT t1.c_0 FROM t1 WHERE ( EXISTS ( SELECT (TO_DAYS(t1.c_0)) FROM t1 WHERE ( (TO_DAYS(t1.c_0)) <> -2.5698771209691616e+38 AND t1.c_0 BETWEEN -2.8264431170269555e+38 AND (CASE WHEN (TRUE AND (TO_DAYS(t1.c_0) = TO_DAYS(t1.c_0))) THEN ('6263-05-09 13:00:11.000000') ELSE ('6263-05-09 13:00:11.000000') END) ) ) AND t1.c_0 BETWEEN -9223372036854775808 AND '0001-01-01 00:00:00' ); The modified query returns: Empty set What I expected is that both queries should return the same result set.