| Bug #89819 | Equivalent queries produce different results with LEFT JOIN | ||
|---|---|---|---|
| Submitted: | 27 Feb 2018 7:17 | Modified: | 27 Feb 2018 8:37 |
| Reporter: | Jaime Sicam | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 5.7.20 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[27 Feb 2018 7:17]
Jaime Sicam
[27 Feb 2018 7:18]
Jaime Sicam
Table structure and test data
Attachment: test_case.sql (application/octet-stream, text), 587 bytes.
[27 Feb 2018 8:37]
MySQL Verification Team
Thank you for the bug report. I was able to repeat with current released version but no anymore with recent source server so it was fixed so what.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.21 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> USE `test`;
Database changed
mysql>
mysql> DROP TABLE IF EXISTS `datetimetest`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
mysql> CREATE TABLE `datetimetest` (
-> `thedate` datetime DEFAULT NULL,
-> `id` varchar(15) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into `datetimetest`(`thedate`,`id`) values
('2018-01-31 00:00:00','1');
DROP TABLE IF EXISTS `joindatetime`;
CREATE TABLE `joindatetime` (
`thedate` datetime DEFAULT NULL,
`id` varchar(15) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into `joindatetime`(`thedate`,`id`) values
('2018-01-31 00:00:00','1');
Query OK, 0 rows affected (0.76 sec)
mysql>
mysql> insert into `datetimetest`(`thedate`,`id`) values
-> ('2018-01-31 00:00:00','1');
Query OK, 1 row affected (0.16 sec)
mysql>
mysql> DROP TABLE IF EXISTS `joindatetime`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
mysql> CREATE TABLE `joindatetime` (
-> `thedate` datetime DEFAULT NULL,
-> `id` varchar(15) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.62 sec)
mysql>
mysql> insert into `joindatetime`(`thedate`,`id`) values
-> ('2018-01-31 00:00:00','1');
Query OK, 1 row affected (0.09 sec)
mysql> SELECT * FROM test.`datetimetest` t
-> LEFT JOIN test.`joindatetime` j
-> ON t.`id` = j.`id` AND t.`thedate` = j.`thedate`
-> WHERE t.id = '1' AND t.`thedate` = '2018-01-31';
+---------------------+----+---------+------+
| thedate | id | thedate | id |
+---------------------+----+---------+------+
| 2018-01-31 00:00:00 | 1 | NULL | NULL |
+---------------------+----+---------+------+
1 row in set (0.00 sec)
mysql>
mysql>
mysql>
mysql> SELECT * FROM test.`datetimetest` t IGNORE INDEX(PRIMARY)
-> LEFT JOIN test.`joindatetime` j IGNORE INDEX(PRIMARY)
-> ON t.`id` = j.`id` AND t.`thedate` = j.`thedate`
-> WHERE t.id = '1' AND t.`thedate` = '2018-01-31';
+---------------------+----+---------------------+------+
| thedate | id | thedate | id |
+---------------------+----+---------------------+------+
| 2018-01-31 00:00:00 | 1 | 2018-01-31 00:00:00 | 1 |
+---------------------+----+---------------------+------+
1 row in set (0.01 sec)
mysql>
----------------------------------------------------------------------------------------------
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.22 Source distribution 2018-FEB-12
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql 5.7 > USE `test`;
Database changed
mysql 5.7 >
mysql 5.7 > DROP TABLE IF EXISTS `datetimetest`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql 5.7 >
mysql 5.7 > CREATE TABLE `datetimetest` (
-> `thedate` datetime DEFAULT NULL,
-> `id` varchar(15) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into `datetimetest`(`thedate`,`id`) values
('2018-01-31 00:00:00','1');
DROP TABLE IF EXISTS `joindatetime`;
CREATE TABLE `joindatetime` (
`thedate` datetime DEFAULT NULL,
`id` varchar(15) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
insert into `joindatetime`(`thedate`,`id`) values
('2018-01-31 00:00:00','1');
Query OK, 0 rows affected (0.62 sec)
mysql 5.7 >
mysql 5.7 > insert into `datetimetest`(`thedate`,`id`) values
-> ('2018-01-31 00:00:00','1');
Query OK, 1 row affected (0.09 sec)
mysql 5.7 >
mysql 5.7 > DROP TABLE IF EXISTS `joindatetime`;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql 5.7 >
mysql 5.7 > CREATE TABLE `joindatetime` (
-> `thedate` datetime DEFAULT NULL,
-> `id` varchar(15) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.65 sec)
mysql 5.7 >
mysql 5.7 > insert into `joindatetime`(`thedate`,`id`) values
-> ('2018-01-31 00:00:00','1');
Query OK, 1 row affected (0.09 sec)
mysql 5.7 > SELECT * FROM test.`datetimetest` t
-> LEFT JOIN test.`joindatetime` j
-> ON t.`id` = j.`id` AND t.`thedate` = j.`thedate`
-> WHERE t.id = '1' AND t.`thedate` = '2018-01-31';
+---------------------+----+---------------------+------+
| thedate | id | thedate | id |
+---------------------+----+---------------------+------+
| 2018-01-31 00:00:00 | 1 | 2018-01-31 00:00:00 | 1 |
+---------------------+----+---------------------+------+
1 row in set (0.00 sec)
mysql 5.7 >
mysql 5.7 > SELECT * FROM test.`datetimetest` t IGNORE INDEX(PRIMARY)
-> LEFT JOIN test.`joindatetime` j IGNORE INDEX(PRIMARY)
-> ON t.`id` = j.`id` AND t.`thedate` = j.`thedate`
-> WHERE t.id = '1' AND t.`thedate` = '2018-01-31';
+---------------------+----+---------------------+------+
| thedate | id | thedate | id |
+---------------------+----+---------------------+------+
| 2018-01-31 00:00:00 | 1 | 2018-01-31 00:00:00 | 1 |
+---------------------+----+---------------------+------+
1 row in set (0.00 sec)
mysql 5.7 > SELECT * FROM test.`datetimetest` t
-> LEFT JOIN test.`joindatetime` j
-> ON t.`id` = j.`id` AND t.`thedate` = j.`thedate`
-> WHERE t.id = '1' AND t.`thedate` = '2018-01-31';
+---------------------+----+---------------------+------+
| thedate | id | thedate | id |
+---------------------+----+---------------------+------+
| 2018-01-31 00:00:00 | 1 | 2018-01-31 00:00:00 | 1 |
+---------------------+----+---------------------+------+
1 row in set (0.00 sec)
mysql 5.7 >
