Bug #46227 | Wrong result on DISTINCT + aggregate + JOIN + InnoDB | ||
---|---|---|---|
Submitted: | 16 Jul 2009 14:43 | Modified: | 16 Jul 2009 16:38 |
Reporter: | Philip Stoev | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
Version: | 5.0,5.1,5.4 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[16 Jul 2009 14:43]
Philip Stoev
[16 Jul 2009 16:38]
Valeriy Kravchuk
Thank you for the bug report. Verified just as described on recent bzr threes: valeriy-kravchuks-macbook-pro:5.0 openxs$ bin/mysql -uroot test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.0.85 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE TABLE `C` ( -> `pk` int(11) NOT NULL AUTO_INCREMENT, -> `time_key` time NOT NULL, -> `datetime_nokey` datetime NOT NULL, -> PRIMARY KEY (`pk`), -> KEY `time_key` (`time_key`) -> ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO `C` VALUES (1,'20:53:30','0000-00-00 00:00:00'),(2,'00:00:00','2008-04-19 07:51:37'),(3,'12:37:08','2006-06-03 00:00:00'),(4,'00:00:00','0000-00-00 00:00:00'), -> (5,'15:59:14','2000-10-03 15:17:43'),(6,'04:43:51','2009-04-25 16:10:46'), -> (7,'00:00:00','2005-01-11 03:31:23'),(8,'09:51:25','0000-00-00 00:00:00'), -> (9,'00:00:00','2000-03-07 00:00:00'),(10,'00:00:00','2001-06-14 20:33:16'), -> (11,'00:00:00','2005-03-06 05:45:38'),(12,'18:50:55','0000-00-00 00:00:00'), -> (13,'00:00:00','0000-00-00 00:00:00'),(14,'08:22:36','2002-02-13 21:59:10'), -> (15,'00:00:00','0000-00-00 00:00:00'),(16,'09:37:21','0000-00-00 00:00:00'), -> (17,'05:15:03','2001-12-23 00:00:00'),(18,'20:11:43','2004-05-16 00:00:00'), -> (19,'00:00:00','2004-04-02 00:00:00'),(20,'00:00:00','2003-11-26 00:00:00'); Query OK, 20 rows affected (0.00 sec) Records: 20 Duplicates: 0 Warnings: 0 mysql> CREATE TABLE `B` ( -> `pk` int(11) NOT NULL AUTO_INCREMENT, -> `time_key` time NOT NULL, -> `datetime_nokey` datetime NOT NULL, -> PRIMARY KEY (`pk`), -> KEY `time_key` (`time_key`) -> ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO `B` VALUES (1,'09:33:50','0000-00-00 00:00:00'), -> (2,'00:00:00','2007-03-03 01:12:45'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT DISTINCT SUM( OUTR .`pk` ) -> FROM C OUTR2 JOIN B OUTR ON OUTR2 .`time_key` <= OUTR .`datetime_nokey`; +--------------------+ | SUM( OUTR .`pk` ) | +--------------------+ | 50 | +--------------------+ 1 row in set (0.02 sec) The above result is wrong! Look: mysql> SELECT SUM( OUTR .`pk` ) FROM C OUTR2 JOIN B OUTR ON OUTR2 .`time_key` <= OUTR .`datetime_nokey`; +--------------------+ | SUM( OUTR .`pk` ) | +--------------------+ | 30 | +--------------------+ 1 row in set (0.00 sec) mysql> explain SELECT SUM( OUTR .`pk` ) FROM C OUTR2 JOIN B OUTR ON OUTR2 .`time_key` <= OUTR .`datetime_nokey`\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: OUTR type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2 Extra: *************************** 2. row *************************** id: 1 select_type: SIMPLE table: OUTR2 type: ALL possible_keys: time_key key: NULL key_len: NULL ref: NULL rows: 20 Extra: Range checked for each record (index map: 0x2) 2 rows in set (0.00 sec) mysql> explain SELECT DISTINCT SUM( OUTR .`pk` ) FROM C OUTR2 JOIN B OUTR ON OUTR2 .`time_key` <= OUTR .`datetime_nokey`\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: OUTR type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2 Extra: *************************** 2. row *************************** id: 1 select_type: SIMPLE table: OUTR2 type: index possible_keys: time_key key: time_key key_len: 3 ref: NULL rows: 20 Extra: Using where; Using index 2 rows in set (0.00 sec) mysql> SELECT OUTR .`pk` FROM C OUTR2 JOIN B OUTR ON OUTR2 .`time_key` <= OUTR .`datetime_nokey`; +----+ | pk | +----+ | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 1 | | 2 | | 2 | | 2 | | 2 | | 2 | | 2 | | 2 | | 2 | | 2 | | 2 | +----+ 20 rows in set (0.00 sec)
[16 Jul 2013 11:26]
Hartmut Holzgraefe
Not reproducible with 5.6.12, similar to #46127