mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-25 18:38:00 +03:00 
			
		
		
		
	* Provide backwards compatibility extension to name resolution of
  coalesced columns. The patch allows such columns to be qualified
  with a table (and db) name, as it is in 4.1.
  Based on a patch from Monty.
* Adjusted tests accordingly to test both backwards compatible name
  resolution of qualified columns, and ANSI-style resolution of
  non-qualified columns.
  For this, each affected test has two versions - one with qualified
  columns, and one without. 
mysql-test/include/ps_query.inc:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/bdb.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/innodb.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/join.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/join_nested.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/join_outer.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/null_key.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/order_by.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/ps_2myisam.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/ps_3innodb.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/ps_4heap.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/ps_5merge.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/ps_6bdb.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/ps_7ndb.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/select.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/subselect.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/r/type_ranges.result:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/bdb.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/innodb.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/join.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/join_nested.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/join_outer.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/null_key.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/order_by.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/select.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/subselect.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
mysql-test/t/type_ranges.test:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
sql/sql_base.cc:
  * Applied Monty's patch for backwards compatible name resolution
    of qualified columns. The idea is:
    - When a column is qualified, search for the column in all
      tables/views underlying each natural join. In this case
      natural joins are *not* considered leaves.
    - If a column is not qualified, then consider natural joins
      as leaves, thus directly search the result columns of
      natural joins.
  * Simplified 'find_field_in_tables()' - unified two similar
    loops into one.
sql/table.cc:
  - Removed method & members not needed after Monty's patch.
sql/table.h:
  - Removed method & members not needed after Monty's patch.
tests/mysql_client_test.c:
  Put back old tests to test that coalesced columns of natural joins can be qualified.
		
	
		
			
				
	
	
		
			804 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			804 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t0,t1,t2,t3,t4,t5,t6,t7,t8,t9;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE t0 (a int, b int, c int);
 | |
| CREATE TABLE t1 (a int, b int, c int);
 | |
| CREATE TABLE t2 (a int, b int, c int);
 | |
| CREATE TABLE t3 (a int, b int, c int);
 | |
| CREATE TABLE t4 (a int, b int, c int);
 | |
| CREATE TABLE t5 (a int, b int, c int);
 | |
| CREATE TABLE t6 (a int, b int, c int);
 | |
| CREATE TABLE t7 (a int, b int, c int);
 | |
| CREATE TABLE t8 (a int, b int, c int);
 | |
| CREATE TABLE t9 (a int, b int, c int);
 | |
| 
 | |
| INSERT INTO t0 VALUES (1,1,0), (1,2,0), (2,2,0);
 | |
| INSERT INTO t1 VALUES (1,3,0), (2,2,0), (3,2,0);
 | |
| INSERT INTO t2 VALUES (3,3,0), (4,2,0), (5,3,0);
 | |
| INSERT INTO t3 VALUES (1,2,0), (2,2,0);
 | |
| INSERT INTO t4 VALUES (3,2,0), (4,2,0);
 | |
| INSERT INTO t5 VALUES (3,1,0), (2,2,0), (3,3,0);
 | |
| INSERT INTO t6 VALUES (3,2,0), (6,2,0), (6,1,0);
 | |
| INSERT INTO t7 VALUES (1,1,0), (2,2,0);
 | |
| INSERT INTO t8 VALUES (0,2,0), (1,2,0);
 | |
| INSERT INTO t9 VALUES (1,1,0), (1,2,0), (3,3,0);
 | |
| 
 | |
| 
 | |
| SELECT t2.a,t2.b
 | |
|   FROM t2;
 | |
| 
 | |
| SELECT t3.a,t3.b
 | |
|   FROM t3;
 | |
| 
 | |
| SELECT t4.a,t4.b
 | |
|   FROM t4;
 | |
| 
 | |
| SELECT t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t3,t4;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t2.b=t4.b;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t3.a=1 AND t2.b=t4.b;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE t3.a=1 OR t3.c IS NULL;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE t3.a=1 OR t3.c IS NULL;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE t3.a>1 OR t3.c IS NULL;
 | |
| 
 | |
| SELECT t5.a,t5.b
 | |
|   FROM t5;
 | |
| 
 | |
| SELECT t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
 | |
|   FROM t3,t4,t5;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4, t5)
 | |
|        ON t2.b=t4.b;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4, t5)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE t3.a>1 OR t3.c IS NULL;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4, t5)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE t3.a>1 OR t3.c IS NULL;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4, t5)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE (t3.a>1 OR t3.c IS NULL) AND 
 | |
|           (t5.a<3 OR t5.c IS NULL);
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4, t5)
 | |
|        ON t2.b=t4.b
 | |
|     WHERE (t3.a>1 OR t3.c IS NULL) AND 
 | |
|           (t5.a<3 OR t5.c IS NULL);
 | |
| 
 | |
| SELECT t6.a,t6.b
 | |
|   FROM t6;
 | |
| 
 | |
| SELECT t7.a,t7.b
 | |
|   FROM t7;
 | |
| 
 | |
| SELECT t6.a,t6.b,t7.a,t7.b
 | |
|   FROM t6,t7;
 | |
| 
 | |
| SELECT t8.a,t8.b
 | |
|   FROM t8;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM (t6, t7)
 | |
|        LEFT JOIN 
 | |
|        t8
 | |
|        ON t7.b=t8.b AND t6.b < 10;
 | |
| 
 | |
| SELECT t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM (t6, t7)
 | |
|        LEFT JOIN 
 | |
|        t8
 | |
|        ON t7.b=t8.b AND t6.b < 10;
 | |
| 
 | |
| SELECT t5.a,t5.b
 | |
|   FROM t5;
 | |
| 
 | |
| SELECT t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t5 
 | |
|        LEFT JOIN 
 | |
|        ( 
 | |
|          (t6, t7)
 | |
|          LEFT JOIN 
 | |
|          t8
 | |
|          ON t7.b=t8.b AND t6.b < 10
 | |
|        )
 | |
|        ON t6.b >= 2 AND t5.b=t7.b;
 | |
| 
 | |
| SELECT t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t5 
 | |
|        LEFT JOIN 
 | |
|        ( 
 | |
|          (t6, t7)
 | |
|          LEFT JOIN 
 | |
|          t8
 | |
|          ON t7.b=t8.b AND t6.b < 10
 | |
|        )
 | |
|        ON t6.b >= 2 AND t5.b=t7.b AND
 | |
|           (t8.a < 1 OR t8.c IS NULL);
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t3.a=1 AND t2.b=t4.b;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t3.a=1 AND t2.b=t4.b,
 | |
|        t5 
 | |
|        LEFT JOIN 
 | |
|        ( 
 | |
|          (t6, t7)
 | |
|          LEFT JOIN 
 | |
|          t8
 | |
|          ON t7.b=t8.b AND t6.b < 10
 | |
|        )
 | |
|        ON t6.b >= 2 AND t5.b=t7.b; 
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t2
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t3.a=1 AND t2.b=t4.b,
 | |
|        t5 
 | |
|        LEFT JOIN 
 | |
|        ( 
 | |
|          (t6, t7)
 | |
|          LEFT JOIN 
 | |
|          t8
 | |
|          ON t7.b=t8.b AND t6.b < 10
 | |
|        )
 | |
|        ON t6.b >= 2 AND t5.b=t7.b
 | |
|     WHERE t2.a > 3 AND
 | |
|           (t6.a < 6 OR t6.c IS NULL);
 | |
| 
 | |
| SELECT t1.a,t1.b
 | |
|   FROM t1;
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2);
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2)
 | |
|     WHERE (t2.a >= 4 OR t2.c IS NULL);
 | |
|    
 | |
| SELECT t0.a,t0.b
 | |
|   FROM t0;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2)
 | |
|     WHERE t0.a=1 AND
 | |
|           t0.b=t1.b AND          
 | |
|           (t2.a >= 4 OR t2.c IS NULL); 
 | |
| 
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2)
 | |
|     WHERE t0.a=1 AND
 | |
|           t0.b=t1.b AND          
 | |
|           (t2.a >= 4 OR t2.c IS NULL); 
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| SELECT t9.a,t9.b
 | |
|   FROM t9;
 | |
| 
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| SELECT t1.a,t1.b
 | |
|   FROM t1;
 | |
| 
 | |
| SELECT t2.a,t2.b
 | |
|   FROM t2;
 | |
| 
 | |
| SELECT t3.a,t3.b
 | |
|   FROM t3;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b
 | |
|   FROM t2 
 | |
|        LEFT JOIN              
 | |
|        t3
 | |
|        ON t2.b=t3.b;
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b
 | |
|   FROM t1, t2 
 | |
|        LEFT JOIN              
 | |
|        t3
 | |
|        ON t2.b=t3.b
 | |
|     WHERE t1.a <= 2;
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b
 | |
|   FROM t1, t3 
 | |
|        RIGHT JOIN              
 | |
|        t2
 | |
|        ON t2.b=t3.b
 | |
|     WHERE t1.a <= 2;
 | |
| 
 | |
| SELECT t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t3,t4;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t2 
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t3.a=1 AND t2.b=t4.b;
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t1, t2 
 | |
|        LEFT JOIN              
 | |
|        (t3, t4)
 | |
|        ON t3.a=1 AND t2.b=t4.b
 | |
|     WHERE t1.a <= 2;
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t1, (t3, t4) 
 | |
|        RIGHT JOIN              
 | |
|        t2
 | |
|        ON t3.a=1 AND t2.b=t4.b
 | |
|     WHERE t1.a <= 2;
 | |
| 
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t1, (t3, t4)
 | |
|        RIGHT JOIN              
 | |
|        t2
 | |
|        ON t3.a=1 AND t2.b=t4.b
 | |
|     WHERE t1.a <= 2;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM t1, (t3, t4)
 | |
|        RIGHT JOIN
 | |
|        t2
 | |
|        ON t3.a=1 AND t2.b=t4.b
 | |
|     WHERE t1.a <= 2;
 | |
| 
 | |
| CREATE INDEX idx_b ON t2(b);
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM (t3,t4)
 | |
|        LEFT JOIN              
 | |
|        (t1,t2)
 | |
|        ON t3.a=1 AND t3.b=t2.b AND t2.b=t4.b;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
 | |
|   FROM (t3,t4)
 | |
|        LEFT JOIN              
 | |
|        (t1,t2)
 | |
|        ON t3.a=1 AND t3.b=t2.b AND t2.b=t4.b;
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| CREATE INDEX idx_b ON t4(b);
 | |
| CREATE INDEX idx_b ON t5(b);
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| CREATE INDEX idx_b ON t8(b);
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| CREATE INDEX idx_b ON t1(b);
 | |
| CREATE INDEX idx_a ON t0(a);
 | |
| 
 | |
| EXPLAIN EXTENDED
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
 | |
|        t5.a,t5.b,t6.a,t6.b,t7.a,t7.b,t8.a,t8.b,t9.a,t9.b
 | |
|   FROM t0,t1
 | |
|        LEFT JOIN                
 | |
|        ( 
 | |
|          t2
 | |
|          LEFT JOIN              
 | |
|          (t3, t4)
 | |
|          ON t3.a=1 AND t2.b=t4.b,
 | |
|          t5 
 | |
|          LEFT JOIN 
 | |
|          ( 
 | |
|            (t6, t7)
 | |
|            LEFT JOIN 
 | |
|            t8
 | |
|            ON t7.b=t8.b AND t6.b < 10
 | |
|          )
 | |
|          ON t6.b >= 2 AND t5.b=t7.b 
 | |
|        )
 | |
|        ON (t3.b=2 OR t3.c IS NULL) AND (t6.b=2 OR t6.c IS NULL) AND
 | |
|           (t1.b=t5.b OR t3.c IS NULL OR t6.c IS NULL or t8.c IS NULL) AND
 | |
|           (t1.a != 2),
 | |
|        t9
 | |
|      WHERE t0.a=1 AND
 | |
|            t0.b=t1.b AND          
 | |
|            (t2.a >= 4 OR t2.c IS NULL) AND
 | |
|            (t3.a < 5 OR t3.c IS NULL) AND
 | |
|            (t3.b=t4.b OR t3.c IS NULL OR t4.c IS NULL) AND
 | |
|            (t5.a >=2 OR t5.c IS NULL) AND
 | |
|            (t6.a >=4 OR t6.c IS NULL) AND
 | |
|            (t7.a <= 2 OR t7.c IS NULL) AND
 | |
|            (t8.a < 1 OR t8.c IS NULL) AND
 | |
|            (t8.b=t9.b OR t8.c IS NULL) AND
 | |
|            (t9.a=1); 
 | |
| 
 | |
| SELECT t2.a,t2.b
 | |
|   FROM t2;
 | |
| 
 | |
| SELECT t3.a,t3.b
 | |
|   FROM t3;
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b
 | |
|   FROM t2 LEFT JOIN t3 ON t2.b=t3.b
 | |
|     WHERE t2.a = 4 OR (t2.a > 4 AND t3.a IS NULL);
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a,t3.b
 | |
|   FROM t2 LEFT JOIN (t3) ON t2.b=t3.b
 | |
|     WHERE t2.a = 4 OR (t2.a > 4 AND t3.a IS NULL);
 | |
| 
 | |
| ALTER TABLE t3
 | |
|   CHANGE COLUMN a a1 int,
 | |
|   CHANGE COLUMN c c1 int; 
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a1,t3.b
 | |
|   FROM t2 LEFT JOIN t3 ON t2.b=t3.b
 | |
|     WHERE t2.a = 4 OR (t2.a > 4 AND t3.a1 IS NULL);
 | |
| 
 | |
| SELECT t2.a,t2.b,t3.a1,t3.b
 | |
|   FROM t2 NATURAL LEFT JOIN t3
 | |
|     WHERE t2.a = 4 OR (t2.a > 4 AND t3.a1 IS NULL);
 | |
| 
 | |
| DROP TABLE t0,t1,t2,t3,t4,t5,t6,t7,t8,t9;
 | |
| 
 | |
| CREATE TABLE t1 (a int);
 | |
| CREATE TABLE t2 (a int);
 | |
| CREATE TABLE t3 (a int);
 | |
| 
 | |
| INSERT INTO t1 VALUES (1);
 | |
| INSERT INTO t2 VALUES (2);
 | |
| INSERT INTO t3 VALUES (2);
 | |
| INSERT INTO t1 VALUES (2);
 | |
| 
 | |
| #check proper syntax for nested outer joins
 | |
| 
 | |
| SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.a=t3.a) ON t1.a=t3.a;
 | |
| 
 | |
| #must be equivalent to:
 | |
| 
 | |
| SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t2.a=t3.a ON t1.a=t3.a;
 | |
| 
 | |
| #check that everything is al right when all tables contain not more than 1 row
 | |
| #(bug #4922)
 | |
| 
 | |
| DELETE FROM t1 WHERE a=2;
 | |
| SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t2.a=t3.a ON t1.a=t3.a;
 | |
| DELETE FROM t2;
 | |
| SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t2.a=t3.a ON t1.a=t3.a;
 | |
| 
 | |
| DROP TABLE t1,t2,t3;
 | |
| 
 | |
| #on expression for a nested outer join does not depend on the outer table
 | |
| #bug #4976
 | |
| 
 | |
| CREATE TABLE t1(a int, key (a));                                              
 | |
| CREATE TABLE t2(b int, key (b));                                               
 | |
| CREATE TABLE t3(c int, key (c));                                               
 | |
| 
 | |
| INSERT INTO t1 VALUES (NULL), (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
 | |
| (10), (11), (12), (13), (14), (15), (16), (17), (18), (19);
 | |
| 
 | |
| INSERT INTO t2 VALUES (NULL), (0), (1), (2), (3), (4), (5), (6), (7), (8), (9),
 | |
| (10), (11), (12), (13), (14), (15), (16), (17), (18), (19);
 | |
| 
 | |
| INSERT INTO t3 VALUES (0), (1), (2), (3), (4), (5);
 | |
|  
 | |
| EXPLAIN SELECT a, b, c FROM t1 LEFT JOIN (t2, t3) ON c < 3 and b = c;
 | |
| EXPLAIN SELECT a, b, c FROM t1 LEFT JOIN (t2, t3) ON b < 3 and b = c;
 | |
| SELECT a, b, c FROM t1 LEFT JOIN (t2, t3) ON b < 3 and b = c;
 | |
| 
 | |
| DELETE FROM t3;
 | |
| EXPLAIN SELECT a, b, c FROM t1 LEFT JOIN (t2, t3) ON b < 3 and b = c;
 | |
| SELECT a, b, c FROM t1 LEFT JOIN (t2, t3) ON b < 3 and b = c;
 | |
| 
 | |
| DROP TABLE t1,t2,t3;
 | |
| 
 | |
| #
 | |
| # Test for bug #11284: empty table in a nested left join
 | |
| # 
 | |
| 
 | |
| CREATE TABLE t1 (c11 int);
 | |
| CREATE TABLE t2 (c21 int);
 | |
| CREATE TABLE t3 (c31 int);
 | |
| 
 | |
| INSERT INTO t1 VALUES (4), (5);
 | |
| 
 | |
| SELECT * FROM t1 LEFT JOIN t2 ON c11=c21;
 | |
| EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON c11=c21;
 | |
| 
 | |
| SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON c21=c31) ON c11=c21;
 | |
| EXPLAIN SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON c21=c31) ON c11=c21;
 | |
| 
 | |
| DROP TABLE t1,t2,t3;
 | |
| 
 | |
| #
 | |
| # Bug #12154: creation of temp table for a query with nested outer join
 | |
| # 
 | |
| 
 | |
| CREATE TABLE t1 (goods int(12) NOT NULL, price varchar(128) NOT NULL);
 | |
| INSERT INTO t1 VALUES (23, 2340), (26, 9900);
 | |
| 
 | |
| CREATE TABLE t2 (goods int(12), name varchar(50), shop char(2));
 | |
| INSERT INTO t2 VALUES (23, 'as300', 'fr'), (26, 'as600', 'fr');
 | |
| 
 | |
| create table t3 (groupid int(12) NOT NULL, goodsid int(12) NOT NULL);
 | |
| INSERT INTO t3 VALUES (3,23), (6,26);
 | |
| 
 | |
| CREATE TABLE t4 (groupid int(12));
 | |
| INSERT INTO t4 VALUES (1), (2), (3), (4), (5), (6);
 | |
| 
 | |
| SELECT * FROM
 | |
| (SELECT DISTINCT gl.groupid, gp.price
 | |
|   FROM t4 gl 
 | |
|        LEFT JOIN
 | |
|        (t3 g INNER JOIN t2 p ON g.goodsid = p.goods 
 | |
|              INNER JOIN t1 gp ON p.goods = gp.goods)
 | |
|        ON gl.groupid = g.groupid and p.shop = 'fr') t;
 | |
| 
 | |
| CREATE VIEW v1 AS
 | |
| SELECT g.groupid groupid, p.goods goods,  
 | |
|        p.name name, p.shop shop, 
 | |
|        gp.price price
 | |
|   FROM t3 g INNER JOIN t2 p ON g.goodsid = p.goods
 | |
|             INNER JOIN t1 gp on p.goods = gp.goods;
 | |
| 
 | |
| CREATE VIEW v2 AS
 | |
| SELECT DISTINCT g.groupid, fr.price
 | |
|   FROM t4 g
 | |
|        LEFT JOIN
 | |
|        v1 fr on g.groupid = fr.groupid and fr.shop = 'fr';
 | |
| 
 | |
| SELECT * FROM v2;
 | |
| 
 | |
| SELECT * FROM 
 | |
| (SELECT DISTINCT g.groupid, fr.price
 | |
|   FROM t4 g
 | |
|        LEFT JOIN
 | |
|        v1 fr on g.groupid = fr.groupid and fr.shop = 'fr') t;
 | |
| 
 | |
| DROP VIEW v1,v2;
 | |
| DROP TABLE t1,t2,t3,t4;
 |