From: Tor Didriksen Date: May 12 2010 2:12pm Subject: bzr commit into mysql-next-mr-bugfixing branch (tor.didriksen:3169) Bug#48868 List-Archive: http://lists.mysql.com/commits/108151 X-Bug: 48868 Message-Id: <20100512141206.DCADB3529@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1938655117358092714==" --===============1938655117358092714== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/didrik/mysqldev-next-mr/next-mr-opt-backporting-br1/ based on revid:sergey.glukhov@stripped 3169 Tor Didriksen 2010-05-12 Bug #48868 Left outer join in subquery causes segmentation fault in make_join_select Backport of tor.didriksen@stripped This problem with left outer join in IN-subqueries that surfaced when the left table was pulled out because it was constant (one row). The problem was related to a loop at the end of make_join_select for (tab= join->join_tab+join->const_tables; tab <= last_tab ; tab++) The problem was that the 'tab' loop variable was also the loop variable of an outer loop. There was code below this inner loop that used tab that gets into trouble because of this. The inner loop was only used for inner tables of outer joins. Hence the problem only surfaced for outer joins. Solution: split make_join_select() in two, and put the condition-push-down code into a separate utility function. @ mysql-test/r/subselect_sj.result Add test case result. @ mysql-test/r/subselect_sj_jcl6.result Add test case result. @ mysql-test/t/subselect_sj.test Add test case. @ sql/sql_select.cc Split make_join_select() in two, and put the condition-push-down code into a separate utility function pushdown_on_conditions(). modified: mysql-test/r/subselect_sj.result mysql-test/r/subselect_sj_jcl6.result mysql-test/t/subselect_sj.test sql/sql_select.cc === modified file 'mysql-test/r/subselect_sj.result' --- a/mysql-test/r/subselect_sj.result 2010-05-07 17:44:52 +0000 +++ b/mysql-test/r/subselect_sj.result 2010-05-12 14:12:01 +0000 @@ -206,6 +206,14 @@ drop table t10, t11, t12; CREATE TABLE t1 (i INTEGER); CREATE TABLE t2 (i INTEGER); CREATE TABLE t3 (i INTEGER); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 0 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -215,6 +223,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 0 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -224,6 +240,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 0 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -235,6 +259,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 1 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -244,6 +276,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 1 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -253,6 +293,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 1 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -264,6 +312,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 2 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -273,6 +329,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 2 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -282,6 +346,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 2 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -295,6 +367,14 @@ DELETE FROM t3; INSERT INTO t2 VALUES (0); DELETE FROM t2; INSERT INTO t1 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 0 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -304,6 +384,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 0 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -313,6 +401,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 0 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -324,6 +420,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 1 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -333,6 +437,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 1 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -342,6 +454,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 1 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -353,6 +473,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 2 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -362,6 +490,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 2 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -371,6 +507,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 2 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -384,6 +528,14 @@ DELETE FROM t3; INSERT INTO t2 VALUES (0); DELETE FROM t2; INSERT INTO t1 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 0 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -393,6 +545,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 0 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -402,6 +562,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 0 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -413,6 +581,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 1 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -422,6 +598,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 1 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -431,6 +615,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 1 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -442,6 +634,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 2 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -451,6 +651,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 2 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -460,6 +668,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 2 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -474,6 +690,23 @@ INSERT INTO t2 VALUES (0); DELETE FROM t2; INSERT INTO t1 VALUES (0); DROP TABLE t1, t2, t3; +# +# Bug#48868: Left outer join in subquery causes segmentation fault in +# make_join_select. +# +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (i INTEGER); +INSERT INTO t2 VALUES(1); +CREATE TABLE t3 (i INTEGER); +INSERT INTO t3 VALUES (1); +INSERT INTO t3 VALUES (2); +SELECT * FROM t1 WHERE (t1.i) IN +(SELECT t2.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i +1 +DROP TABLE t1, t2, t3; BUG#37120 optimizer_switch allowable values not according to specification === modified file 'mysql-test/r/subselect_sj_jcl6.result' --- a/mysql-test/r/subselect_sj_jcl6.result 2010-05-07 17:44:52 +0000 +++ b/mysql-test/r/subselect_sj_jcl6.result 2010-05-12 14:12:01 +0000 @@ -210,6 +210,14 @@ drop table t10, t11, t12; CREATE TABLE t1 (i INTEGER); CREATE TABLE t2 (i INTEGER); CREATE TABLE t3 (i INTEGER); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 0 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -219,6 +227,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 0 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -228,6 +244,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 0 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -239,6 +263,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 1 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -248,6 +280,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 1 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -257,6 +297,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 1 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -268,6 +316,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 2 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -277,6 +333,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 2 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -286,6 +350,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +0 2 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -299,6 +371,14 @@ DELETE FROM t3; INSERT INTO t2 VALUES (0); DELETE FROM t2; INSERT INTO t1 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 0 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -308,6 +388,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 0 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -317,6 +405,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 0 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -328,6 +424,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 1 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -337,6 +441,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 1 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -346,6 +458,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 1 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -357,6 +477,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 2 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -366,6 +494,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 2 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -375,6 +511,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +1 2 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -388,6 +532,14 @@ DELETE FROM t3; INSERT INTO t2 VALUES (0); DELETE FROM t2; INSERT INTO t1 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 0 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -397,6 +549,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 0 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -406,6 +566,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 0 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -417,6 +585,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 1 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -426,6 +602,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 1 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -435,6 +619,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 1 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -446,6 +638,14 @@ i INSERT INTO t3 VALUES (0); DELETE FROM t3; INSERT INTO t2 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 2 0 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -455,6 +655,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (2); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 2 1 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -464,6 +672,14 @@ i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 STRAIGHT_JOIN t3); i INSERT INTO t3 VALUES (1); +SELECT (SELECT COUNT(*) from t1), +(SELECT COUNT(*) from t2), +(SELECT COUNT(*) from t3); +(SELECT COUNT(*) from t1) (SELECT COUNT(*) from t2) (SELECT COUNT(*) from t3) +2 2 2 +SELECT * FROM t1 WHERE (11) IN +(SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i SELECT * FROM t1 WHERE (11) IN (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); i @@ -478,6 +694,23 @@ INSERT INTO t2 VALUES (0); DELETE FROM t2; INSERT INTO t1 VALUES (0); DROP TABLE t1, t2, t3; +# +# Bug#48868: Left outer join in subquery causes segmentation fault in +# make_join_select. +# +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (i INTEGER); +INSERT INTO t2 VALUES(1); +CREATE TABLE t3 (i INTEGER); +INSERT INTO t3 VALUES (1); +INSERT INTO t3 VALUES (2); +SELECT * FROM t1 WHERE (t1.i) IN +(SELECT t2.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); +i +1 +DROP TABLE t1, t2, t3; BUG#37120 optimizer_switch allowable values not according to specification === modified file 'mysql-test/t/subselect_sj.test' --- a/mysql-test/t/subselect_sj.test 2010-05-07 12:19:46 +0000 +++ b/mysql-test/t/subselect_sj.test 2010-05-12 14:12:01 +0000 @@ -111,11 +111,16 @@ while ($i) let $k=3; while ($k) { -# TODO: LEFT JOIN queries are disabled due to Bug#48868 -# SELECT * FROM t1 WHERE (11) IN + SELECT (SELECT COUNT(*) from t1), + (SELECT COUNT(*) from t2), + (SELECT COUNT(*) from t3); +# TODO: This still crashes when t1 has two rows, t2 and t3 are empty. +# SELECT * FROM t1 WHERE (t1.i) 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 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.i); + (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); + SELECT * FROM t1 WHERE (11) IN + (SELECT t3.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i WHERE t1.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); @@ -132,6 +137,24 @@ while ($i) } DROP TABLE t1, t2, t3; +--echo # +--echo # Bug#48868: Left outer join in subquery causes segmentation fault in +--echo # make_join_select. +--echo # +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (i INTEGER); +INSERT INTO t2 VALUES(1); +CREATE TABLE t3 (i INTEGER); +INSERT INTO t3 VALUES (1); +INSERT INTO t3 VALUES (2); + +SELECT * FROM t1 WHERE (t1.i) IN + (SELECT t2.i FROM t2 LEFT JOIN t3 ON t2.i=t3.i); + +DROP TABLE t1, t2, t3; + --echo --echo BUG#37120 optimizer_switch allowable values not according to specification --echo === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-05-11 16:56:38 +0000 +++ b/sql/sql_select.cc 2010-05-12 14:12:01 +0000 @@ -8549,7 +8549,7 @@ JOIN::make_simple_join(JOIN *parent, TAB join_tab->cache_select= 0; join_tab->table=tmp_table; join_tab->select=0; - join_tab->select_cond=0; + join_tab->select_cond= NULL; join_tab->quick=0; join_tab->type= JT_ALL; /* Map through all records */ join_tab->keys.init(); @@ -8822,6 +8822,111 @@ make_outerjoin_info(JOIN *join) DBUG_VOID_RETURN; } +static bool extend_select_cond(JOIN_TAB *cond_tab, COND *tmp_cond) +{ + DBUG_ENTER("extend_select_cond"); + + COND *new_cond= !cond_tab->select_cond ? tmp_cond : + new Item_cond_and(cond_tab->select_cond, tmp_cond); + cond_tab->set_select_cond(new_cond, __LINE__); + if (!cond_tab->select_cond) + DBUG_RETURN(1); + cond_tab->select_cond->update_used_tables(); + cond_tab->select_cond->quick_fix_field(); + if (cond_tab->select) + cond_tab->select->cond= cond_tab->select_cond; + + DBUG_RETURN(0); +} + + +/** + Local helper function for make_join_select(). + + Push down conditions from all on expressions. + Each of these conditions are guarded by a variable + that turns if off just before null complemented row for + outer joins is formed. Thus, the condition from an + 'on expression' are guaranteed not to be checked for + the null complemented row. +*/ +static bool pushdown_on_conditions(JOIN* join, JOIN_TAB *last_tab) +{ + DBUG_ENTER("pushdown_on_conditions"); + + /* First push down constant conditions from on expressions */ + for (JOIN_TAB *join_tab= join->join_tab+join->const_tables; + join_tab < join->join_tab+join->tables ; join_tab++) + { + if (*join_tab->on_expr_ref) + { + JOIN_TAB *cond_tab= join_tab->first_inner; + COND *tmp_cond= make_cond_for_table(*join_tab->on_expr_ref, + join->const_table_map, + (table_map) 0, 0); + if (!tmp_cond) + continue; + tmp_cond= new Item_func_trig_cond(tmp_cond, &cond_tab->not_null_compl); + if (!tmp_cond) + DBUG_RETURN(1); + tmp_cond->quick_fix_field(); + + if (extend_select_cond(cond_tab, tmp_cond)) + DBUG_RETURN(1); + } + } + + JOIN_TAB *first_inner_tab= last_tab->first_inner; + + /* Push down non-constant conditions from on expressions */ + while (first_inner_tab && first_inner_tab->last_inner == last_tab) + { + /* + Table last_tab is the last inner table of an outer join. + An on expression is always attached to it. + */ + COND *on_expr= *first_inner_tab->on_expr_ref; + + table_map used_tables= (join->const_table_map | + OUTER_REF_TABLE_BIT | RAND_TABLE_BIT); + for (JOIN_TAB *join_tab= join->join_tab+join->const_tables; + join_tab <= last_tab ; join_tab++) + { + table_map current_map= join_tab->table->map; + used_tables|= current_map; + COND *tmp_cond= make_cond_for_table(on_expr, used_tables, current_map, 0); + if (!tmp_cond) + continue; + + JOIN_TAB *cond_tab= + join_tab < first_inner_tab ? first_inner_tab : join_tab; + /* + First add the guards for match variables of + all embedding outer join operations. + */ + if (!(tmp_cond= add_found_match_trig_cond(cond_tab->first_inner, + tmp_cond, + first_inner_tab))) + DBUG_RETURN(1); + /* + Now add the guard turning the predicate off for + the null complemented row. + */ + tmp_cond= new Item_func_trig_cond(tmp_cond, + &first_inner_tab->not_null_compl); + if (tmp_cond) + tmp_cond->quick_fix_field(); + + /* Add the predicate to other pushed down predicates */ + if (extend_select_cond(cond_tab, tmp_cond)) + DBUG_RETURN(1); + } + first_inner_tab= first_inner_tab->first_upper; + } + DBUG_RETURN(0); +} + + static bool make_join_select(JOIN *join, Item *cond) { THD *thd= join->thd; @@ -9148,100 +9253,8 @@ static bool make_join_select(JOIN *join, } } - /* - Push down conditions from all on expressions. - Each of these conditions are guarded by a variable - that turns if off just before null complemented row for - outer joins is formed. Thus, the condition from an - 'on expression' are guaranteed not to be checked for - the null complemented row. - */ - JOIN_TAB *last_tab; - /* First push down constant conditions from on expressions */ - for (JOIN_TAB *join_tab= join->join_tab+join->const_tables; - join_tab < join->join_tab+join->tables ; join_tab++) - { - if (*join_tab->on_expr_ref) - { - JOIN_TAB *cond_tab= join_tab->first_inner; - COND *tmp= make_cond_for_table(*join_tab->on_expr_ref, - join->const_table_map, - (table_map) 0, 0); - if (!tmp) - continue; - //goto end; - tmp= new Item_func_trig_cond(tmp, &cond_tab->not_null_compl); - if (!tmp) - DBUG_RETURN(1); - tmp->quick_fix_field(); - COND *new_cond= !cond_tab->select_cond ? tmp : - new Item_cond_and(cond_tab->select_cond, tmp); - cond_tab->set_select_cond(new_cond, __LINE__); - if (!cond_tab->select_cond) - DBUG_RETURN(1); - cond_tab->select_cond->update_used_tables(); - cond_tab->select_cond->quick_fix_field(); - if (cond_tab->select) - cond_tab->select->cond= cond_tab->select_cond; - } - } - - /* Push down non-constant conditions from on expressions */ - last_tab= tab; - while (first_inner_tab && first_inner_tab->last_inner == last_tab) - { - /* - Table tab is the last inner table of an outer join. - An on expression is always attached to it. - */ - COND *on_expr= *first_inner_tab->on_expr_ref; - - table_map used_tables2= (join->const_table_map | - OUTER_REF_TABLE_BIT | RAND_TABLE_BIT); - for (tab= join->join_tab+join->const_tables; tab <= last_tab ; tab++) - { - current_map= tab->table->map; - used_tables2|= current_map; - COND *tmp_cond= make_cond_for_table(on_expr, used_tables2, - current_map, 0); - if (tmp_cond) - { - JOIN_TAB *cond_tab= tab < first_inner_tab ? first_inner_tab : tab; - /* - First add the guards for match variables of - all embedding outer join operations. - */ - if (!(tmp_cond= add_found_match_trig_cond(cond_tab->first_inner, - tmp_cond, - first_inner_tab))) - DBUG_RETURN(1); - /* - Now add the guard turning the predicate off for - the null complemented row. - */ - DBUG_PRINT("info", ("Item_func_trig_cond")); - tmp_cond= new Item_func_trig_cond(tmp_cond, - &first_inner_tab-> - not_null_compl); - DBUG_PRINT("info", ("Item_func_trig_cond 0x%lx", - (ulong) tmp_cond)); - if (tmp_cond) - tmp_cond->quick_fix_field(); - /* Add the predicate to other pushed down predicates */ - DBUG_PRINT("info", ("Item_cond_and")); - COND *new_cond= !cond_tab->select_cond ? tmp_cond : - new Item_cond_and(cond_tab->select_cond, tmp_cond); - cond_tab->set_select_cond(new_cond, __LINE__); - if (!cond_tab->select_cond) - DBUG_RETURN(1); - cond_tab->select_cond->update_used_tables(); - cond_tab->select_cond->quick_fix_field(); - if (cond_tab->select) - cond_tab->select->cond= cond_tab->select_cond; - } - } - first_inner_tab= first_inner_tab->first_upper; - } + if (pushdown_on_conditions(join, tab)) + DBUG_RETURN(1); if (save_used_tables && !(used_tables & ~(tab->emb_sj_nest->sj_inner_tables | --===============1938655117358092714== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/tor.didriksen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: tor.didriksen@stripped # target_branch: file:///export/home/didrik/mysqldev-next-mr/next-mr-\ # opt-backporting-br1/ # testament_sha1: 4f0eccd64089b174d73817ebb9a47c91a20539d3 # timestamp: 2010-05-12 16:12:06 +0200 # source_branch: file:///export/home/didrik/mysqldev-6.0-codebase/6.0-\ # codebase-bf/ # base_revision_id: sergey.glukhov@stripped\ # 72pus5rvzo85iku2 # # Begin bundle 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 5tHEcL6Xh9ZxkvRJNIj/4u5IpwoSGp5WvCA= --===============1938655117358092714==--