Bug #64002 | Aggregate queries with multiple columns and no GROUP BY produce bogus results | ||
---|---|---|---|
Submitted: | 11 Jan 2012 20:01 | Modified: | 12 Jan 2012 10:24 |
Reporter: | Daniel Grace | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S1 (Critical) |
Version: | 5.5.19 | OS: | Any (Debian, Windows XP) |
Assigned to: | CPU Architecture: | Any | |
Tags: | aggregate group by myisam, regression |
[11 Jan 2012 20:01]
Daniel Grace
[12 Jan 2012 10:24]
Valeriy Kravchuk
Thank you for the bug report. Verified just as described on Windows XP: C:\Program Files\MySQL\MySQL Server 5.5\bin>mysql -uroot -proot -P3312 test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 20 Server version: 5.5.19 MySQL Community Server (GPL) Copyright (c) 2000, 2011, 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 `calendar_week` ( -> `year` smallint(6) NOT NULL, -> `startdate` date NOT NULL, -> `enddate` date NOT NULL, -> `start` datetime NOT NULL, -> `end` datetime NOT NULL, -> `startmonth` date NOT NULL, -> `endmonth` date NOT NULL, -> `in_session` tinyint(4) NOT NULL, -> PRIMARY KEY (`year`,`startdate`), -> UNIQUE KEY `year_start` (`year`,`start`), -> UNIQUE KEY `year_end` (`year`,`end`), -> UNIQUE KEY `year_enddate` (`year`,`enddate`), -> KEY `year_startmonth` (`year`,`startmonth`), -> KEY `year_endmonth` (`year`,`endmonth`), -> KEY `start` (`start`), -> KEY `startdate` (`startdate`), -> KEY `startmonth` (`startmonth`), -> KEY `end` (`end`), -> KEY `enddate` (`enddate`), -> KEY `endmonth` (`endmonth`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.22 sec) mysql> INSERT INTO `calendar_week` VALUES -> (2012,'2012-04-22','2012-04-28','2012-04-22 00:00:00','2012-04-28 23:59:5 9','2012-04-01','2012-04-01',1), -> (2012,'2012-04-29','2012-05-05','2012-04-29 00:00:00','2012-05-05 23:59:5 9','2012-04-01','2012-05-01',1), -> (2012,'2012-05-06','2012-05-12','2012-05-06 00:00:00','2012-05-12 23:59:5 9','2012-05-01','2012-05-01',1), -> (2012,'2012-05-13','2012-05-19','2012-05-13 00:00:00','2012-05-19 23:59:5 9','2012-05-01','2012-05-01',1), -> (2012,'2012-05-20','2012-05-26','2012-05-20 00:00:00','2012-05-26 23:59:5 9','2012-05-01','2012-05-01',1), -> (2012,'2012-05-27','2012-06-02','2012-05-27 00:00:00','2012-06-02 23:59:5 9','2012-05-01','2012-06-01',1), -> (2012,'2012-06-03','2012-06-09','2012-06-03 00:00:00','2012-06-09 23:59:5 9','2012-06-01','2012-06-01',1), -> (2012,'2012-06-10','2012-06-16','2012-06-10 00:00:00','2012-06-16 23:59:5 9','2012-06-01','2012-06-01',1), -> (2012,'2012-06-17','2012-06-23','2012-06-17 00:00:00','2012-06-23 23:59:5 9','2012-06-01','2012-06-01',1); Query OK, 9 rows affected (0.09 sec) Records: 9 Duplicates: 0 Warnings: 0 mysql> SELECT startdate, enddate, start, end, UNIX_TIMESTAMP(startdate), UNIX_TI MESTAMP(enddate) -> FROM calendar_week; +------------+------------+---------------------+---------------------+--------- ------------------+-------------------------+ | startdate | enddate | start | end | UNIX_TIM ESTAMP(startdate) | UNIX_TIMESTAMP(enddate) | +------------+------------+---------------------+---------------------+--------- ------------------+-------------------------+ | 2012-04-22 | 2012-04-28 | 2012-04-22 00:00:00 | 2012-04-28 23:59:59 | 1335042000 | 1335560400 | | 2012-04-29 | 2012-05-05 | 2012-04-29 00:00:00 | 2012-05-05 23:59:59 | 1335646800 | 1336165200 | | 2012-05-06 | 2012-05-12 | 2012-05-06 00:00:00 | 2012-05-12 23:59:59 | 1336251600 | 1336770000 | | 2012-05-13 | 2012-05-19 | 2012-05-13 00:00:00 | 2012-05-19 23:59:59 | 1336856400 | 1337374800 | | 2012-05-20 | 2012-05-26 | 2012-05-20 00:00:00 | 2012-05-26 23:59:59 | 1337461200 | 1337979600 | | 2012-05-27 | 2012-06-02 | 2012-05-27 00:00:00 | 2012-06-02 23:59:59 | 1338066000 | 1338584400 | | 2012-06-03 | 2012-06-09 | 2012-06-03 00:00:00 | 2012-06-09 23:59:59 | 1338670800 | 1339189200 | | 2012-06-10 | 2012-06-16 | 2012-06-10 00:00:00 | 2012-06-16 23:59:59 | 1339275600 | 1339794000 | | 2012-06-17 | 2012-06-23 | 2012-06-17 00:00:00 | 2012-06-23 23:59:59 | 1339880400 | 1340398800 | +------------+------------+---------------------+---------------------+--------- ------------------+-------------------------+ 9 rows in set (0.03 sec) mysql> SELECT COUNT(*), MIN(start), MAX(end), UNIX_TIMESTAMP(MIN(start)), -> UNIX_TIMESTAMP(MAX(end)), COUNT(*) FROM calendar_week WHERE year=2012 AND start BETWEEN -> FROM_UNIXTIME(1335078000) AND FROM_UNIXTIME(1336201200); +----------+------------+----------+----------------------------+--------------- -----------+----------+ | COUNT(*) | MIN(start) | MAX(end) | UNIX_TIMESTAMP(MIN(start)) | UNIX_TIMESTAMP (MAX(end)) | COUNT(*) | +----------+------------+----------+----------------------------+--------------- -----------+----------+ | 0 | NULL | NULL | 1335646800 | NULL | 0 | +----------+------------+----------+----------------------------+--------------- -----------+----------+ 1 row in set (0.06 sec) mysql> SELECT MIN(start) FROM calendar_week WHERE year=2012 AND start BETWEEN -> FROM_UNIXTIME(1335078000) AND FROM_UNIXTIME(1336201200); +---------------------+ | MIN(start) | +---------------------+ | 2012-04-29 00:00:00 | +---------------------+ 1 row in set (0.00 sec) mysql> SELECT COUNT(*) FROM calendar_week WHERE year=2012 AND start BETWEEN -> FROM_UNIXTIME(1335078000) AND FROM_UNIXTIME(1336201200); +----------+ | COUNT(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql> SELECT * FROM calendar_week WHERE year=2012 AND start BETWEEN FROM_UNIXTI ME(1335078000) -> AND FROM_UNIXTIME(1336201200); +------+------------+------------+---------------------+---------------------+-- ----------+------------+------------+ | year | startdate | enddate | start | end | s tartmonth | endmonth | in_session | +------+------------+------------+---------------------+---------------------+-- ----------+------------+------------+ | 2012 | 2012-04-29 | 2012-05-05 | 2012-04-29 00:00:00 | 2012-05-05 23:59:59 | 2 012-04-01 | 2012-05-01 | 1 | +------+------------+------------+---------------------+---------------------+-- ----------+------------+------------+ 1 row in set (0.00 sec) Workaround really helps: mysql> SELECT MIN(start) FROM calendar_week WHERE year=2012 AND start BETWEEN -> FROM_UNIXTIME(1335078000) AND FROM_UNIXTIME(1336201200) group by 'nothing '; +---------------------+ | MIN(start) | +---------------------+ | 2012-04-29 00:00:00 | +---------------------+ 1 row in set (0.00 sec)
[12 Jan 2012 10:24]
Valeriy Kravchuk
Test case for copy/paste
Attachment: bug64002.sql (text/x-sql), 2.44 KiB.