| Bug #61799 | Wrong result with < ALL and subquery returning an empty list | ||
|---|---|---|---|
| Submitted: | 8 Jul 2011 9:15 | Modified: | 5 May 2018 14:54 |
| Reporter: | Philip Stoev | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
| Version: | 5.1,5.5 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[8 Jul 2011 9:15]
Philip Stoev
[8 Jul 2011 10:20]
Valeriy Kravchuk
Yes, manual (http://dev.mysql.com/doc/refman/5.1/en/all-subqueries.html) implicitly says that < ALL (<some select>) should evaluate to TRUE if <some select> returns no rows. It is easy to verify that in your case it does not happen: C:\Program Files\MySQL\MySQL Server 5.5\bin>mysql -uroot -proot -P3310 test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.1.56-community-log MySQL Community Server (GPL) Copyright (c) 2000, 2010, 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 t1 ( f1 int, f2 int, KEY (f2) ) ; Query OK, 0 rows affected (0.20 sec) mysql> INSERT INTO t1 VALUES (8,0); Query OK, 1 row affected (0.11 sec) mysql> CREATE TABLE t2 ( f2 int) ; Query OK, 0 rows affected (0.09 sec) mysql> CREATE TABLE t3 ( f2 int) ; Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO t3 VALUES (0); Query OK, 1 row affected (0.06 sec) mysql> SELECT f2 FROM t1 WHERE ( 0 ) IN ( -> SELECT f2 FROM t2); Empty set (0.09 sec) mysql> SELECT * -> FROM t3 -> WHERE f2 < ALL ( -> SELECT f2 FROM t1 WHERE ( 0 ) IN ( -> SELECT f2 FROM t2 -> ) -> ); Empty set (0.06 sec) while in more simple cases it works as expected: mysql> SELECT * -> FROM t3 -> WHERE f2 < ALL (select 1 from mysql.user where 1=0); +------+ | f2 | +------+ | 0 | +------+ 1 row in set (0.08 sec) So we definitely have a bug here.
[6 Feb 2018 12:43]
Sveta Smirnova
Seems it was fixed in 5.7:
mysql> SELECT *
-> FROM t3
-> WHERE f2 < ALL (
-> SELECT f2 FROM t1 WHERE ( 0 ) IN (
-> SELECT f2 FROM t2
-> )
-> );
+------+
| f2 |
+------+
| 0 |
+------+
1 row in set (0.01 sec)
[5 May 2018 14:54]
Jon Stephens
Documented fix as follows in the MySQL 5.6.40 changelog:
< ALL (select_expression) did not always evaluate as TRUE when the
select_expression did not return any rows.
Closed.
