| Bug #68473 | A simple select query returns random data | ||
|---|---|---|---|
| Submitted: | 23 Feb 2013 15:49 | Modified: | 25 Mar 2013 18:32 |
| Reporter: | Balázs Hinel | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 5.5.24, 5.5.29, 5.5.30 | OS: | Any |
| Assigned to: | Jørgen Løland | CPU Architecture: | Any |
[23 Feb 2013 15:49]
Balázs Hinel
[23 Feb 2013 17:30]
Valeriy Kravchuk
5.6.10 is also affected:
C:\Program Files\MySQL\MySQL Server 5.5\bin>mysql -uroot -proot -P3314 test
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.10 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, 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> CREATE TABLE `faulty` (
-> `a` int(11) unsigned NOT NULL AUTO_INCREMENT,
-> `b` int(11) unsigned NOT NULL,
-> `c` datetime NOT NULL,
-> PRIMARY KEY (`a`),
-> UNIQUE KEY `b_and_c` (`b`,`c`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
Query OK, 0 rows affected (4.12 sec)
mysql>
mysql> INSERT INTO `faulty` (`b`, `c`) VALUES
-> (1801, '2013-02-15 09:00:00'),
-> (1802, '2013-02-28 09:00:00'),
-> (1802, '2013-03-01 09:00:00'),
-> (5, '1990-02-15 09:00:00'),
-> (5, '2013-02-15 09:00:00'),
-> (5, '2009-02-15 17:00:00');
Query OK, 6 rows affected (0.53 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> SELECT DISTINCT b, c FROM faulty WHERE b='1802' ORDER BY c;
+---+---------------------+
| b | c |
+---+---------------------+
| 0 | 1897-01-04 17:40:00 |
| 0 | 1897-01-04 17:40:00 |
+---+---------------------+
2 rows in set (0.19 sec)
There is a workaround (use proper data type):
mysql> SELECT DISTINCT b, c FROM faulty WHERE b=1802 ORDER BY c;
+------+---------------------+
| b | c |
+------+---------------------+
| 1802 | 2013-02-28 09:00:00 |
| 1802 | 2013-03-01 09:00:00 |
+------+---------------------+
2 rows in set (0.00 sec)
Here is the difference:
mysql> explain SELECT DISTINCT b, c FROM faulty WHERE b='1802' ORDER BY c;
+----+-------------+--------+-------+---------------+---------+---------+------+
------+-------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |
rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+
------+-------------------------------------------------------+
| 1 | SIMPLE | faulty | range | b_and_c | b_and_c | 9 | NULL |
2 | Using where; Using index for group-by; Using filesort |
+----+-------------+--------+-------+---------------+---------+---------+------+
------+-------------------------------------------------------+
1 row in set (0.03 sec)
mysql> explain SELECT DISTINCT b, c FROM faulty WHERE b=1802 ORDER BY c;
+----+-------------+--------+-------+---------------+---------+---------+------+
------+---------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |
rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+------+
------+---------------------------------------+
| 1 | SIMPLE | faulty | range | b_and_c | b_and_c | 9 | NULL |
2 | Using where; Using index for group-by |
+----+-------------+--------+-------+---------------+---------+---------+------+
------+---------------------------------------+
1 row in set (0.00 sec)
[24 Feb 2013 15:14]
Jørgen Løland
Thank you for the bug report. Verified as described
[25 Mar 2013 18:32]
Paul DuBois
Noted in 5.5.32, 5.6.12, 5.7.2 changelogs. If Loose Index Scan was used to evaluate a query that compared an integer column to an integer specified as a quoted string (for example, col_name = '1'), the query could return incorrect results.
