List:Commits« Previous MessageNext Message »
From:Oystein.Grovlen Date:November 18 2009 5:36pm
Subject:bzr commit into mysql-6.0-codebase-bugfixing branch
(oystein.grovlen:3717) Bug#46692
View as plain text  
#At file:///home/oysteing/mysql/mysql-6.0-codebase-bugfixing-2/ based on revid:tor.didriksen@stripped

 3717 oystein.grovlen@stripped	2009-11-18
      Bug#46692 Crash occurring on queries with nested FROM subqueries 
                using materialization
      
      Subqueries with STRAIGHT_JOIN prevents pull-out of tables that would normally
      be pulled out of the subquery.  This created scenarioes which the plan search
      was not prepared for, and one ended up without any valid plan.  This caused
      segmentation fault in optimize_semijoin_nests when trying to access the best
      plan.
      
      The problem may occur with either const tables or eq_ref relations that 
      does not have any matches.  Bug#46692 reports the problem for FROM subqueries,
      but ordinary IN subqueries will have the same issue.
      
      The following changes are needed to handle this problem:
      1. Do not include const tables in the set of tables to be considered
         by optimize_semijon_nests().  This will make sure cost estimation is
         not skipped for tables that depend on const tables.  (This is
         consistent with what is done for top level joins where const tables
         are filtered out from the set out tables considered by
         choose_plan.)
      
      2. Currently, when the table that is added to the join prefix, is
         empty, fanout will become zero since it is the product of the
         number of records of all tables.  A zero fanout will cause the
         computed cost to become infinite.  Hence, in order to get a valid
         cost, we need to skip empty tables when computing the fanout.
      
      The fanout issue (issue 2 above) is also present with the duplicate weedout
      strategy, and this patch contains the necessary changes to handle fanout
      in this scenario, too.
      
      A number of bug reports have been marked as duplicate of this bug report
      based on that this fix also fixes these issues.  Those bug reports show
      that this is not just an issue for STRAIGHT_JOIN, but also for both right 
      and left outer join.  This patch also adds some test cases for these
      duplicate reports as well as general testing of outer joins in subqueries
      when constant tables are involved.
     @ mysql-test/r/subselect3.result
        Updated results for test for subqueries with STRAIGHT_JOIN and outer join for 
        different permutations of const and non-const tables.
     @ mysql-test/r/subselect3_jcl6.result
        Updated results for test for subqueries with STRAIGHT_JOIN and outer join for 
        different permutations of const and non-const tables.
     @ mysql-test/r/subselect4.result
        Updated with results for Bug#46692 test case and test cases for duplicate
        bug reports.
     @ mysql-test/t/subselect3.test
        Add test cases to check that subqueries with STRAIGHT_JOIN or outer
        join work for different permutations of const and non-const tables. Similar
        checking is also done for the duplicate weedout strategy (by turning off FirstMatch and Materialization).
        Note that due to a still existing bug, left outer join is not tested.
     @ mysql-test/t/subselect4.test
        Added a test case that is similar to the query reported in Bug#46692.
        Also adds a few test cases for duplicate bug reports.
     @ sql/sql_select.cc
        1. Do not include const tables in the set of tables to be considered
           by optimize_semijon_nests().  This will make sure cost estimation is
           not skipped for tables that depend on const tables.  (This is
           consistent with what is done for top level joins where const tables
           are filtered out from the set out tables considered by
           choose_plan.)
        
        2. Make sure fanout is always >= 1 when computing plan cost.  
           A zero fanout will cause the computed cost to become infinite.  
           Hence, in order to get a valid cost, we need to skip empty tables when
           computing the fanout.

    modified:
      mysql-test/r/subselect3.result
      mysql-test/r/subselect3_jcl6.result
      mysql-test/r/subselect4.result
      mysql-test/t/subselect3.test
      mysql-test/t/subselect4.test
      sql/sql_select.cc
=== modified file 'mysql-test/r/subselect3.result'
--- a/mysql-test/r/subselect3.result	2009-11-18 06:14:20 +0000
+++ b/mysql-test/r/subselect3.result	2009-11-18 17:36:15 +0000
@@ -1306,6 +1306,327 @@ id	select_type	table	type	possible_keys	
 1	PRIMARY	Y	ALL	NULL	NULL	NULL	NULL	6	Using join buffer
 1	PRIMARY	Z	ALL	NULL	NULL	NULL	NULL	6	End materialize; Using join buffer
 drop table t0,t1,t2;
+CREATE TABLE t1 (i INTEGER);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (2);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (1);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (0);
+DROP TABLE t1;
+set @@optimizer_switch='firstmatch=off,materialization=off';
+CREATE TABLE t1 (i INTEGER);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (2);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (1);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (0);
+DROP TABLE t1;
+set @@optimizer_switch=default;
 
 BUG#37842: Assertion in DsMrr_impl::dsmrr_init, at handler.cc:4307
 

=== modified file 'mysql-test/r/subselect3_jcl6.result'
--- a/mysql-test/r/subselect3_jcl6.result	2009-11-18 06:14:20 +0000
+++ b/mysql-test/r/subselect3_jcl6.result	2009-11-18 17:36:15 +0000
@@ -1311,6 +1311,327 @@ id	select_type	table	type	possible_keys	
 1	PRIMARY	Y	ALL	NULL	NULL	NULL	NULL	6	Using join buffer
 1	PRIMARY	Z	ALL	NULL	NULL	NULL	NULL	6	End materialize; Using join buffer
 drop table t0,t1,t2;
+CREATE TABLE t1 (i INTEGER);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (2);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (1);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN 
+(SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+i
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (0);
+DROP TABLE t1;
+set @@optimizer_switch='firstmatch=off,materialization=off';
+CREATE TABLE t1 (i INTEGER);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (2);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (1);
+CREATE TABLE t2 (i INTEGER);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (2);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (1);
+CREATE TABLE t3 (i INTEGER);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (2);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (1);
+SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+i
+INSERT INTO t3 VALUES (0);
+DROP TABLE t3;
+INSERT INTO t2 VALUES (0);
+DROP TABLE t2;
+INSERT INTO t1 VALUES (0);
+DROP TABLE t1;
+set @@optimizer_switch=default;
 
 BUG#37842: Assertion in DsMrr_impl::dsmrr_init, at handler.cc:4307
 

=== modified file 'mysql-test/r/subselect4.result'
--- a/mysql-test/r/subselect4.result	2009-11-03 09:42:49 +0000
+++ b/mysql-test/r/subselect4.result	2009-11-18 17:36:15 +0000
@@ -131,3 +131,82 @@ set @@session.optimizer_switch          
 @@session.optimizer_use_mrr         = @old_optimizer_use_mrr,
 @@session.engine_condition_pushdown = @old_engine_condition_pushdown;
 DROP TABLE t1;
+#
+# Bug#46692 "Crash occurring on queries with nested FROM subqueries 
+# using materialization."
+#
+CREATE TABLE t1 (
+pk INTEGER PRIMARY KEY,
+int_key INTEGER,
+KEY int_key(int_key)
+);
+INSERT INTO t1 VALUES (10,186),(11,NULL),(12,2),(13,3),(14,0),(15,133),(16,1);
+CREATE TABLE t2 (
+pk INTEGER PRIMARY KEY,
+int_key INTEGER,
+KEY int_key(int_key)
+);
+INSERT INTO t2 VALUES (1,7),(2,2);
+SELECT int_key FROM 
+(SELECT * FROM t1 WHERE (140, 4) IN 
+(SELECT t2.int_key, t2 .pk FROM t2 STRAIGHT_JOIN t1 ON t2.int_key)) table1;
+int_key
+DROP TABLE t1, t2;
+#
+# Bug#42353 "SELECT ... WHERE oe IN (SELECT w/ LEFT JOIN) query
+# causes crash."
+#
+CREATE TABLE t1 (
+pk INTEGER PRIMARY KEY,
+int_nokey INTEGER,
+int_key INTEGER,
+date_key DATE,
+datetime_nokey DATETIME,
+varchar_nokey VARCHAR(1)
+);
+CREATE TABLE t2 (
+date_nokey DATE
+);
+CREATE TABLE t3 (
+pk INTEGER PRIMARY KEY,
+int_nokey INTEGER,
+date_key date,
+varchar_key VARCHAR(1),
+varchar_nokey VARCHAR(1),
+KEY date_key (date_key)
+);
+SELECT DISTINCT date_key FROM t1
+WHERE (int_key, int_nokey)
+IN (SELECT  t3.int_nokey, t3.pk
+FROM t2 LEFT JOIN t3 ON (t2.date_nokey < t3.date_key) 
+WHERE t3.varchar_key <= t3.varchar_nokey OR t3.int_nokey <= t3.pk
+)
+AND (varchar_nokey <> 'f' OR NOT int_key < 7) 
+HAVING date_key < '2001-11-14 00:43:55'
+ORDER BY datetime_nokey, pk;
+date_key
+#
+# Bug#45933 "Crash in optimize_semijoin_nests on JOIN in subquery 
+# + AND in outer query".
+#
+INSERT INTO t1 VALUES (10,7,5,'2009-06-16','2002-04-10 14:25:30','w'),
+(11,7,0,'0000-00-00','0000-00-00 00:00:00','s'), 
+(12,4,0,'2003-07-14','2006-09-14 04:01:02','y'), 
+(13,0,4,'2002-07-25','0000-00-00 00:00:00','c'), 
+(14,1,8,'2007-07-03','0000-00-00 00:00:00','q'), 
+(15,6,5,'2001-11-12','0000-00-00 00:00:00',''), 
+(16,2,9,'0000-00-00','0000-00-00 00:00:00','j'), 
+(29,9,1,'0000-00-00','2003-08-11 00:00:00','m');
+INSERT INTO t3 VALUES (1,9,'0000-00-00','b','b'),
+(2,2,'2002-09-17','h','h');
+SELECT t1.varchar_nokey FROM t1 JOIN t3 ON t1.datetime_nokey
+WHERE t1.varchar_nokey 
+IN (SELECT varchar_nokey FROM t1 
+WHERE (pk) 
+IN (SELECT t3.int_nokey
+FROM t3 LEFT JOIN t1 ON t1.varchar_nokey
+WHERE t3.date_key BETWEEN '2008-06-07' AND '2006-06-26'
+           )  
+);
+varchar_nokey
+DROP TABLE t1, t2, t3;

=== modified file 'mysql-test/t/subselect3.test'
--- a/mysql-test/t/subselect3.test	2009-11-09 10:27:46 +0000
+++ b/mysql-test/t/subselect3.test	2009-11-18 17:36:15 +0000
@@ -1074,6 +1074,75 @@ explain select * from t1 where (a,b,c) i
 
 drop table t0,t1,t2;
 
+
+#
+# Check that subqueries with outer joins or straight_join work for 
+# different permutations of const and non-const tables.  (Ref. Bug#46692)
+#
+CREATE TABLE t1 (i INTEGER);
+let $i=3;
+while ($i)
+{
+   CREATE TABLE t2 (i INTEGER);
+   let $j=3;
+   while ($j)
+   {
+       CREATE TABLE t3 (i INTEGER);
+       let $k=3;
+       while ($k)
+       {
+#        TODO: LEFT JOIN queries are disabled due to Bug#48868
+#        SELECT * FROM t1 WHERE (11) IN 
+#          (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i);
+         SELECT * FROM t1 WHERE (11) IN 
+           (SELECT t3.i FROM t2 RIGHT JOIN t3 ON t2.i=t3.i);
+         SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+	 dec $k;
+	 eval INSERT INTO t3 VALUES ($k);
+       }
+       DROP TABLE t3;
+       dec $j;
+       eval INSERT INTO t2 VALUES ($j);	
+   }
+   DROP TABLE t2;
+   dec $i;
+   eval INSERT INTO t1 VALUES ($i);
+}
+DROP TABLE t1;
+
+#
+# Check that subqueries with straight_join work for different permutations
+# of const and non-const tables with duplicate weedout strategy 
+# (by turning off FirstMatch and Materialization).
+#
+set @@optimizer_switch='firstmatch=off,materialization=off';
+CREATE TABLE t1 (i INTEGER);
+let $i=3;
+while ($i)
+{
+   CREATE TABLE t2 (i INTEGER);
+   let $j=3;
+   while ($j)
+   {
+       CREATE TABLE t3 (i INTEGER);
+       let $k=3;
+       while ($k)
+       {
+         SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3);
+	 dec $k;
+	 eval INSERT INTO t3 VALUES ($k);
+       }
+       DROP TABLE t3;
+       dec $j;
+       eval INSERT INTO t2 VALUES ($j);	
+   }
+   DROP TABLE t2;
+   dec $i;
+   eval INSERT INTO t1 VALUES ($i);
+}
+DROP TABLE t1;
+set @@optimizer_switch=default;
+
 --echo
 --echo BUG#37842: Assertion in DsMrr_impl::dsmrr_init, at handler.cc:4307
 --echo

=== modified file 'mysql-test/t/subselect4.test'
--- a/mysql-test/t/subselect4.test	2009-10-25 13:41:27 +0000
+++ b/mysql-test/t/subselect4.test	2009-11-18 17:36:15 +0000
@@ -121,3 +121,90 @@ set @@session.optimizer_switch          
     @@session.engine_condition_pushdown = @old_engine_condition_pushdown;
 
 DROP TABLE t1;
+
+--echo #
+--echo # Bug#46692 "Crash occurring on queries with nested FROM subqueries 
+--echo # using materialization."
+--echo #
+CREATE TABLE t1 (
+  pk INTEGER PRIMARY KEY,
+  int_key INTEGER,
+  KEY int_key(int_key)
+);
+INSERT INTO t1 VALUES (10,186),(11,NULL),(12,2),(13,3),(14,0),(15,133),(16,1);
+
+CREATE TABLE t2 (
+  pk INTEGER PRIMARY KEY,
+  int_key INTEGER,
+  KEY int_key(int_key)
+);
+INSERT INTO t2 VALUES (1,7),(2,2);
+
+SELECT int_key FROM 
+  (SELECT * FROM t1 WHERE (140, 4) IN 
+    (SELECT t2.int_key, t2 .pk FROM t2 STRAIGHT_JOIN t1 ON t2.int_key)) table1;
+
+DROP TABLE t1, t2;
+
+--echo #
+--echo # Bug#42353 "SELECT ... WHERE oe IN (SELECT w/ LEFT JOIN) query
+--echo # causes crash."
+--echo #
+CREATE TABLE t1 (
+  pk INTEGER PRIMARY KEY,
+  int_nokey INTEGER,
+  int_key INTEGER,
+  date_key DATE,
+  datetime_nokey DATETIME,
+  varchar_nokey VARCHAR(1)
+);
+
+CREATE TABLE t2 (
+  date_nokey DATE
+);
+
+CREATE TABLE t3 (
+  pk INTEGER PRIMARY KEY,
+  int_nokey INTEGER,
+  date_key date,
+  varchar_key VARCHAR(1),
+  varchar_nokey VARCHAR(1),
+  KEY date_key (date_key)
+);
+
+SELECT DISTINCT date_key FROM t1
+WHERE (int_key, int_nokey)
+  IN (SELECT  t3.int_nokey, t3.pk
+      FROM t2 LEFT JOIN t3 ON (t2.date_nokey < t3.date_key) 
+      WHERE t3.varchar_key <= t3.varchar_nokey OR t3.int_nokey <= t3.pk
+     )
+  AND (varchar_nokey <> 'f' OR NOT int_key < 7) 
+HAVING date_key < '2001-11-14 00:43:55'
+ORDER BY datetime_nokey, pk;
+
+--echo #
+--echo # Bug#45933 "Crash in optimize_semijoin_nests on JOIN in subquery 
+--echo # + AND in outer query".
+--echo #
+INSERT INTO t1 VALUES (10,7,5,'2009-06-16','2002-04-10 14:25:30','w'),
+                      (11,7,0,'0000-00-00','0000-00-00 00:00:00','s'), 
+		      (12,4,0,'2003-07-14','2006-09-14 04:01:02','y'), 
+		      (13,0,4,'2002-07-25','0000-00-00 00:00:00','c'), 
+		      (14,1,8,'2007-07-03','0000-00-00 00:00:00','q'), 
+		      (15,6,5,'2001-11-12','0000-00-00 00:00:00',''), 
+		      (16,2,9,'0000-00-00','0000-00-00 00:00:00','j'), 
+		      (29,9,1,'0000-00-00','2003-08-11 00:00:00','m');
+INSERT INTO t3 VALUES (1,9,'0000-00-00','b','b'),
+                      (2,2,'2002-09-17','h','h');
+
+SELECT t1.varchar_nokey FROM t1 JOIN t3 ON t1.datetime_nokey
+WHERE t1.varchar_nokey 
+  IN (SELECT varchar_nokey FROM t1 
+      WHERE (pk) 
+        IN (SELECT t3.int_nokey
+            FROM t3 LEFT JOIN t1 ON t1.varchar_nokey
+            WHERE t3.date_key BETWEEN '2008-06-07' AND '2006-06-26'
+           )  
+     );
+
+DROP TABLE t1, t2, t3;

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc	2009-11-17 10:12:07 +0000
+++ b/sql/sql_select.cc	2009-11-18 17:36:15 +0000
@@ -4511,7 +4511,7 @@ make_join_statistics(JOIN *join, TABLE_L
   if (join->const_tables != join->tables)
     optimize_keyuse(join, keyuse_array);
    
-  if (optimize_semijoin_nests(join, all_table_map))
+  if (optimize_semijoin_nests(join, all_table_map & ~join->const_table_map))
     DBUG_RETURN(TRUE); /* purecov: inspected */
 
   /* Find an optimal join order of the non-constant tables. */
@@ -13011,7 +13011,7 @@ void optimize_wo_join_buffering(JOIN *jo
     rec_count *= pos.records_read;
     cost += pos.read_time;
 
-    if (rs->emb_sj_nest)
+    if (rs->emb_sj_nest && pos.records_read > 1) // fanout should always be >= 1
       inner_fanout *= pos.records_read;
   }
 
@@ -13473,12 +13473,14 @@ void advance_sj_state(JOIN *join, table_
         dups_cost += p->read_time;
         if (p->table->emb_sj_nest)
         {
-          sj_inner_fanout *= p->records_read;
+          // fanout should always be >= 1
+          sj_inner_fanout *= p->records_read > 1 ? p->records_read : 1;
           dups_removed_fanout |= p->table->table->map;
         }
         else
         {
-          sj_outer_fanout *= p->records_read;
+          // fanout should always be >= 1
+          sj_outer_fanout *= p->records_read > 1 ? p->records_read : 1;
           temptable_rec_size += p->table->table->file->ref_length;
         }
       }


Attachment: [text/bzr-bundle]
Thread
bzr commit into mysql-6.0-codebase-bugfixing branch(oystein.grovlen:3717) Bug#46692Oystein.Grovlen18 Nov
  • Re: bzr commit into mysql-6.0-codebase-bugfixing branch(oystein.grovlen:3717) Bug#46692Roy Lyseng25 Nov
    • Re: bzr commit into mysql-6.0-codebase-bugfixing branch(oystein.grovlen:3717) Bug#46692Øystein Grøvlen25 Nov
    • Re: bzr commit into mysql-6.0-codebase-bugfixing branch(oystein.grovlen:3717) Bug#46692Øystein Grøvlen27 Nov
      • Re: bzr commit into mysql-6.0-codebase-bugfixing branch(oystein.grovlen:3717) Bug#46692Roy Lyseng27 Nov
        • Re: bzr commit into mysql-6.0-codebase-bugfixing branch(oystein.grovlen:3717) Bug#46692Øystein Grøvlen27 Nov