| Bug #69471 | UNION of derived tables returns wrong results with "1=0/false"-clauses | ||
|---|---|---|---|
| Submitted: | 14 Jun 2013 13:26 | Modified: | 17 Jul 2013 16:46 | 
| Reporter: | Christian Rijke | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) | 
| Version: | 5.6.10 | OS: | Any | 
| Assigned to: | CPU Architecture: | Any | |
| Tags: | 1=0, query, regression, UNION | ||
   [14 Jun 2013 13:34]
   Christian Rijke        
  Experienced this in 5.6.10 but not in 5.5-versions.
   [14 Jun 2013 14:23]
   MySQL Verification Team        
  Thank you for the bug report.
[miguel@tikal 5.6]$ 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 1                            
Server version: 5.6.13 Source distribution               
Copyright (c) 2000, 2013, 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 table1 ( a INT, b INT);
Query OK, 0 rows affected (0.44 sec)       
mysql> 
mysql> CREATE TABLE table2 ( a INT, b INT);
Query OK, 0 rows affected (0.43 sec)       
mysql> 
mysql> INSERT INTO table1 VALUES (1, 4);
Query OK, 1 row affected (0.05 sec)     
mysql> INSERT INTO table1 VALUES (2, 4);
Query OK, 1 row affected (0.04 sec)     
mysql> INSERT INTO table2 VALUES (1, 5);
Query OK, 1 row affected (0.23 sec)     
mysql> INSERT INTO table2 VALUES (2, 5);
Query OK, 1 row affected (0.04 sec)     
mysql> 
mysql> SELECT *
    -> FROM  ( 
    -> (SELECT *
    ->            FROM table1
    ->           WHERE 1=0)       
    -> UNION                      
    ->         (SELECT *          
    ->          FROM (SELECT * from table2) t2
    ->            WHERE t2.b = 5)             
    ->         ) a3                           
    -> ;                                      
+------+------+                               
| a    | b    |                               
+------+------+                               
|    2 |    5 |                               
+------+------+                               
1 row in set (0.00 sec)                       
mysql> exit
Bye        
[miguel@tikal 5.6]$ bin/mysqladmin -uroot shutdown
[miguel@tikal 5.6]$ cd ..                         
[miguel@tikal bzr]$ cd 5.5                        
[miguel@tikal 5.5]$ 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 1                            
Server version: 5.5.33-debug Source distribution         
Copyright (c) 2000, 2013, 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 table1 ( a INT, b INT);
Query OK, 0 rows affected (0.13 sec)       
mysql>
mysql> CREATE TABLE table2 ( a INT, b INT);
Query OK, 0 rows affected (0.11 sec)
mysql>
mysql> INSERT INTO table1 VALUES (1, 4);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO table1 VALUES (2, 4);
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO table2 VALUES (1, 5);
Query OK, 1 row affected (0.04 sec)
mysql> INSERT INTO table2 VALUES (2, 5);
Query OK, 1 row affected (0.06 sec)
mysql>
mysql> SELECT *
    -> FROM  (
    -> (SELECT *
    ->            FROM table1
    ->           WHERE 1=0)
    -> UNION
    ->         (SELECT *
    ->          FROM (SELECT * from table2) t2
    ->            WHERE t2.b = 5)
    ->         ) a3
    -> ;
+------+------+
| a    | b    |
+------+------+
|    1 |    5 |
|    2 |    5 |
+------+------+
2 rows in set (0.01 sec)
mysql>
 
   [24 Jun 2013 20:49]
   Rahul Gulati        
  This works correctly in 5.1 as well. I might take this up and provide a patch/fix.
   [17 Jul 2013 16:46]
   Paul DuBois        
  Noted in 5.6.13, 5.7.2 changelogs. When selecting a union of an empty result set (created with WHERE 1=0 or WHERE FALSE) with a derived table, incorrect filtering was applied to the derived table.


Description: When selecting a union of an empty result set (created with "where 1=0" or "where false"), with a derived table, wrong filtering is applied to the derived table. How to repeat: CREATE TABLE table1 ( a INT, b INT); CREATE TABLE table2 ( a INT, b INT); INSERT INTO table1 VALUES (1, 4); INSERT INTO table1 VALUES (2, 4); INSERT INTO table2 VALUES (1, 5); INSERT INTO table2 VALUES (2, 5); SELECT * FROM ( (SELECT * FROM table1 WHERE 1=0) UNION (SELECT * FROM (SELECT * from table2) t2 WHERE t2.b = 5) ) a3 ; This should return: 1 5 2 5 but returns: 1 5