Bug #78497 | Large select with nested subqueries return 0 rows | ||
---|---|---|---|
Submitted: | 21 Sep 2015 8:44 | Modified: | 21 Sep 2015 9:09 |
Reporter: | Jose Ignacio Andrés | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S3 (Non-critical) |
Version: | 5.6, 5.6.26, 5.6.28, 5.7.10 | OS: | Ubuntu |
Assigned to: | CPU Architecture: | Any | |
Tags: | IN, subquery |
[21 Sep 2015 8:44]
Jose Ignacio Andrés
[21 Sep 2015 9:09]
MySQL Verification Team
Hello Jose Ignacio Andrés, Thank you for the report and test case. Verified as described with 5.6.26, 5.6.28, and 5.7.10 builds. Thanks, Umesh
[21 Sep 2015 9:09]
MySQL Verification Team
// 5.6.28 - affected [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.28: bin/mysql -uroot -S /tmp/mysql_ushastry.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.28-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2015, 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> DROP TABLE IF EXISTS `list_1`; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `list_1` ( -> `uid` int(11) NOT NULL, -> UNIQUE KEY `uid` (`uid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) mysql> mysql> INSERT INTO list_1 SELECT @row := @row + 1 as row FROM -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t5, -> (select 0 union all select 1) t6, -> (SELECT @row:=0) t7; DROP TABLE IF EXISTS `list_2`; CREATE TABLE IF NOT EXISTS `list_2` ( `uid` int(11) NOT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `list_2` SELECT @row := @row + 1 as row FROM (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, (select 0 union all select 1 union all select 2) t5, (SELECT @row:=0) t6; DROP TABLE IF EXISTS `list_3`; CREATE TABLE IF NOT EXISTS `list_3` ( `uid` int(11) NOT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `list_3` VALUES (1);Query OK, 200000 rows affected (0.82 sec) Records: 200000 Duplicates: 0 Warnings: 0 mysql> mysql> DROP TABLE IF EXISTS `list_2`; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `list_2` ( -> `uid` int(11) NOT NULL, -> UNIQUE KEY `uid` (`uid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) mysql> mysql> INSERT INTO `list_2` SELECT @row := @row + 1 as row FROM -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, -> (select 0 union all select 1 union all select 2) t5, -> (SELECT @row:=0) t6; Query OK, 30000 rows affected (0.16 sec) Records: 30000 Duplicates: 0 Warnings: 0 mysql> mysql> DROP TABLE IF EXISTS `list_3`; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `list_3` ( -> `uid` int(11) NOT NULL, -> UNIQUE KEY `uid` (`uid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.00 sec) mysql> mysql> INSERT INTO `list_3` VALUES (1); Query OK, 1 row affected (0.00 sec) mysql> SELECT uid -> FROM list_1 -> WHERE (select (select IF(count(list_3.uid) = 0, 0, 1) from list_3 where list_3.uid = list_1.uid)) = 1 AND list_1.uid IN (SELECT list_2.uid FROM list_2)LIMIT 10; Empty set (0.13 sec) mysql>
[21 Sep 2015 9:09]
MySQL Verification Team
// 5.7.10 - affected [umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.7.10: bin/mysql -uroot -S /tmp/mysql_ushastry.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.10-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2015, 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 database test; Query OK, 1 row affected (0.00 sec) mysql> use test Database changed mysql> DROP TABLE IF EXISTS `list_1`; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `list_1` ( -> `uid` int(11) NOT NULL, -> UNIQUE KEY `uid` (`uid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.00 sec) mysql> mysql> INSERT INTO list_1 SELECT @row := @row + 1 as row FROM -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t5, -> (select 0 union all select 1) t6, -> (SELECT @row:=0) t7; DROP TABLE IF EXISTS `list_2`; CREATE TABLE IF NOT EXISTS `list_2` ( `uid` int(11) NOT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `list_2` SELECT @row := @row + 1 as row FROM (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, (select 0 union all select 1 union all select 2) t5, (SELECT @row:=0) t6; DROP TABLE IF EXISTS `list_3`; CREATE TABLE IF NOT EXISTS `list_3` ( `uid` int(11) NOT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `list_3` VALUES (1);Query OK, 200000 rows affected (1.22 sec) Records: 200000 Duplicates: 0 Warnings: 0 mysql> mysql> DROP TABLE IF EXISTS `list_2`; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `list_2` ( -> `uid` int(11) NOT NULL, -> UNIQUE KEY `uid` (`uid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.00 sec) mysql> mysql> INSERT INTO `list_2` SELECT @row := @row + 1 as row FROM -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, -> (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, -> (select 0 union all select 1 union all select 2) t5, -> (SELECT @row:=0) t6; Query OK, 30000 rows affected (0.19 sec) Records: 30000 Duplicates: 0 Warnings: 0 mysql> mysql> DROP TABLE IF EXISTS `list_3`; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `list_3` ( -> `uid` int(11) NOT NULL, -> UNIQUE KEY `uid` (`uid`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) mysql> mysql> INSERT INTO `list_3` VALUES (1); Query OK, 1 row affected (0.00 sec) mysql> SELECT uid -> FROM list_1 -> WHERE (select (select IF(count(list_3.uid) = 0, 0, 1) from list_3 where list_3.uid = list_1.uid)) = 1 AND list_1.uid IN (SELECT list_2.uid FROM list_2)LIMIT 10; Empty set (0.18 sec) mysql>