[MDEV-30250] Value changed after relaxing ON condition [5.5.54, 10.11.1] Created: 2022-12-17  Updated: 2023-11-28

Status: Confirmed
Project: MariaDB Server
Component/s: Optimizer
Affects Version/s: 5.5.54, 10.11.1
Fix Version/s: 10.4, 10.5, 10.6, 10.11

Type: Bug Priority: Major
Reporter: qaqcatz Assignee: Alexander Barkov
Resolution: Unresolved Votes: 0
Labels: datetime, on
Environment:

ubuntu 18.04


Issue Links:
Relates
relates to MDEV-30252 Value changed after adding DISTINCT [... Confirmed
relates to MDEV-30253 Value changed after adding DISTINCT [... Confirmed
relates to MDEV-30254 Value changed after adding DISTINCT [... Open
relates to MDEV-30257 Value changed after adding DISTINCT [... Confirmed

 Description   

Description:
In theory, the result of sql1 ⊆ the result of sql2:

SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON f1 != 0; -- sql1
SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON 1; -- sql2

Because the 'ON 1' in sql2 is always true, but the 'ON f1 != 0' in sql1 may be false.
However, some values changed after changing 'ON f1 != 0' to 'ON 1', seems like a logical bug:

mysql> select version();
+-----------------------------------------+
| version()                               |
+-----------------------------------------+
| 10.11.1-MariaDB-1:10.11.1+maria~ubu2204 |
+-----------------------------------------+
1 row in set (0.00 sec)
 
mysql> SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON f1 != 0; -- sql1
+----------+
| f1       |
+----------+
|   -11046 |
|     2018 |
| 2089.051 |
+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON 1; -- sql2
+-------------------+
| f1                |
+-------------------+
|  20180516222895.9 |
|  20180516235959.9 |
| 20180516236030.95 |
+-------------------+
3 rows in set (0.00 sec)

How to repeat:

drop table if exists t;
create table t (c1 double);
insert into t values (-13064),(0),(71.051);
 
SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON f1 != 0; -- sql1
SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON 1; -- sql2

Hope these can be helpful for your debugging:
We look for the first version of the bug in all docker images (with format x.x.x) of https://hub.docker.com/_/mariadb/tags
We found that the bug first occurred in mariadb:5.5.54, it cannot be reproduced in mariadb:5.5.53:

MariaDB [TEST]> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.5.54-MariaDB-1~wheezy |
+-------------------------+
1 row in set (0.00 sec)
 
MariaDB [TEST]> SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON f1 != 0; -- sql1
+----------+
| f1       |
+----------+
|   -11046 |
|     2018 |
| 2089.051 |
+----------+
3 rows in set (0.00 sec)
 
MariaDB [TEST]> SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON 1; -- sql2
+-------------------+
| f1                |
+-------------------+
|  20180516222895.9 |
|  20180516235959.9 |
| 20180516236030.95 |
+-------------------+
3 rows in set (0.00 sec)
 
MariaDB [TEST]> select version();   
+-------------------------+
| version()               |
+-------------------------+
| 5.5.53-MariaDB-1~wheezy |
+-------------------------+
1 row in set (0.00 sec)
 
MariaDB [TEST]> SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON f1 != 0; -- sql1
+-------------------+
| f1                |
+-------------------+
|  20180516222895.9 |
|  20180516235959.9 |
| 20180516236030.95 |
+-------------------+
3 rows in set (0.00 sec)
 
MariaDB [TEST]> SELECT f1 FROM (SELECT 1) AS t1 JOIN (SELECT (c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY_MICROSECOND)) AS f1 FROM t) AS t2 ON 1; -- sql2
+-------------------+
| f1                |
+-------------------+
|  20180516222895.9 |
|  20180516235959.9 |
| 20180516236030.95 |
+-------------------+
3 rows in set (0.00 sec)



 Comments   
Comment by Sergei Golubchik [ 2023-01-09 ]

without floating point and subqueries:

create table t1 (c1 int);
insert into t1 values (-13064),(0),(71);
SELECT c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY) AS f1 FROM t1 HAVING f1 != 0;
SELECT c1+DATE_SUB('2018-05-17', INTERVAL 1 DAY) AS f1 FROM t1;
drop table t1;

Generated at Thu Feb 08 10:14:49 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.