From: Ole John Aske Date: May 2 2011 1:45pm Subject: bzr push into mysql-5.1-telco-7.0-spj-scan-vs-scan branch (ole.john.aske:3486 to 3487) List-Archive: http://lists.mysql.com/commits/136528 Message-Id: <20110502134501.D7467222@fimafeng09.norway.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3487 Ole John Aske 2011-05-02 SPJ: Fixed a regression introduced with recent refactoring of ha_ndbcluster_push.cc: As we now allow dependencies between (grand-)parents to be added such that all the dependent parents become (artificial) dependent on each other, we may also implicit introduce dependencies on outer joined tables. This is incorrect as it is only inner joined tables which can sequentially linked wo/ changing the sematics in the SQL statement. @ sql/abstract_query_plan.cc Removed a double ';;' terminating a line. modified: mysql-test/suite/ndb/r/ndb_join_pushdown.result mysql-test/suite/ndb/t/ndb_join_pushdown.test sql/abstract_query_plan.cc sql/ha_ndbcluster_push.cc 3486 Jonas Oreland 2011-04-29 [merge] ndb - merge 70 to 70-spj added: mysql-test/suite/rpl_ndb/r/rpl_ndb_ui.result mysql-test/suite/rpl_ndb/r/rpl_ndb_ui2.result mysql-test/suite/rpl_ndb/r/rpl_ndb_ui3.result mysql-test/suite/rpl_ndb/t/rpl_ndb_ui.test mysql-test/suite/rpl_ndb/t/rpl_ndb_ui2.test mysql-test/suite/rpl_ndb/t/rpl_ndb_ui3.test modified: mysql-test/suite/ndb/r/ndb_basic.result sql/ha_ndbcluster.cc storage/ndb/include/kernel/GlobalSignalNumbers.h storage/ndb/include/kernel/signaldata/FireTrigOrd.hpp storage/ndb/include/kernel/signaldata/LqhKey.hpp storage/ndb/include/kernel/signaldata/PackedSignal.hpp storage/ndb/include/kernel/signaldata/TcContinueB.hpp storage/ndb/include/kernel/signaldata/TcKeyReq.hpp storage/ndb/include/kernel/signaldata/TupKey.hpp storage/ndb/include/kernel/trigger_definitions.h storage/ndb/include/ndb_version.h.in storage/ndb/include/ndbapi/NdbOperation.hpp storage/ndb/src/common/debugger/signaldata/LqhKey.cpp storage/ndb/src/common/debugger/signaldata/PackedSignal.cpp storage/ndb/src/common/debugger/signaldata/TcKeyReq.cpp storage/ndb/src/kernel/blocks/ERROR_codes.txt storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp storage/ndb/src/kernel/blocks/dbtc/DbtcInit.cpp storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp storage/ndb/src/kernel/blocks/dbtux/Dbtux.hpp storage/ndb/src/kernel/blocks/dbtux/DbtuxBuild.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxGen.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxScan.cpp storage/ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp storage/ndb/src/ndbapi/NdbOperationDefine.cpp storage/ndb/src/ndbapi/NdbOperationExec.cpp storage/ndb/src/ndbapi/ndberror.c storage/ndb/test/ndbapi/testIndex.cpp storage/ndb/test/run-test/daily-basic-tests.txt === modified file 'mysql-test/suite/ndb/r/ndb_join_pushdown.result' --- a/mysql-test/suite/ndb/r/ndb_join_pushdown.result 2011-04-27 07:42:18 +0000 +++ b/mysql-test/suite/ndb/r/ndb_join_pushdown.result 2011-05-02 13:44:39 +0000 @@ -1434,6 +1434,92 @@ id select_type table type possible_keys 1 SIMPLE t4 eq_ref PRIMARY PRIMARY 8 test.t3x.c,test.t2x.c 1 100.00 Child of 't3x' in pushed join@1 Warnings: Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t2x`.`a` AS `a`,`test`.`t2x`.`b` AS `b`,`test`.`t2x`.`c` AS `c`,`test`.`t2x`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t3x`.`a` AS `a`,`test`.`t3x`.`b` AS `b`,`test`.`t3x`.`c` AS `c`,`test`.`t3x`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` join `test`.`t1` `t2` join `test`.`t1` `t2x` join `test`.`t1` `t3` join `test`.`t1` `t3x` join `test`.`t1` `t4` where ((`test`.`t2`.`a` = `test`.`t1`.`a`) and (`test`.`t2x`.`b` = `test`.`t2`.`d`) and (`test`.`t2x`.`a` = `test`.`t2`.`c`) and (`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t3`.`b` = `test`.`t1`.`b`) and (`test`.`t3x`.`b` = `test`.`t1`.`d`) and (`test`.`t3`.`a` = `test`.`t1`.`c`) and (`test`.`t3x`.`a` = `test`.`t1`.`c`) and (`test`.`t4`.`b` = `test`.`t2x`.`c`) and (`test`.`t4`.`a` = `test`.`t3x`.`c`)) +explain extended +select straight_join * +from t1 +left join t1 as t2 on t2.a = t1.a and t2.b = t1.b +join t1 as t3 on t3.a = t1.c and t3.b = t1.d +left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 16 100.00 Parent of 3 pushed join@1 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a,test.t1.b 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 8 test.t1.c,test.t1.d 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t4 eq_ref PRIMARY PRIMARY 8 test.t3.c,test.t2.c 1 100.00 +Warnings: +Note 1644 Can't push table 't4' as child of 't1', dependencies on outer joined grandparents not implemented +Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` left join `test`.`t1` `t2` on(((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t2`.`a` = `test`.`t1`.`a`))) join `test`.`t1` `t3` left join `test`.`t1` `t4` on(((`test`.`t4`.`b` = `test`.`t2`.`c`) and (`test`.`t4`.`a` = `test`.`t3`.`c`))) where ((`test`.`t3`.`b` = `test`.`t1`.`d`) and (`test`.`t3`.`a` = `test`.`t1`.`c`)) +explain extended +select straight_join * +from t1 +join t1 as t2 on t2.a = t1.a and t2.b = t1.b +left join t1 as t3 on t3.a = t1.c and t3.b = t1.d +left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 16 100.00 Parent of 4 pushed join@1 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a,test.t1.b 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t3 eq_ref PRIMARY PRIMARY 8 test.t1.c,test.t1.d 1 100.00 Child of 't2' in pushed join@1 +1 SIMPLE t4 eq_ref PRIMARY PRIMARY 8 test.t3.c,test.t2.c 1 100.00 Child of 't3' in pushed join@1 +Warnings: +Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` join `test`.`t1` `t2` left join `test`.`t1` `t3` on(((`test`.`t3`.`b` = `test`.`t1`.`d`) and (`test`.`t3`.`a` = `test`.`t1`.`c`))) left join `test`.`t1` `t4` on(((`test`.`t4`.`b` = `test`.`t2`.`c`) and (`test`.`t4`.`a` = `test`.`t3`.`c`))) where ((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t2`.`a` = `test`.`t1`.`a`)) +explain extended +select straight_join * +from t1 +left join t1 as t2 on t2.a = t1.a and t2.b = t1.b +join t1 as t3 on t3.a = t1.a +left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 16 100.00 Parent of 3 pushed join@1 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a,test.t1.b 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t1.a 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t4 eq_ref PRIMARY PRIMARY 8 test.t3.c,test.t2.c 1 100.00 +Warnings: +Note 1644 Can't push table 't4' as child of 't1', dependencies on outer joined grandparents not implemented +Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` left join `test`.`t1` `t2` on(((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t2`.`a` = `test`.`t1`.`a`))) join `test`.`t1` `t3` left join `test`.`t1` `t4` on(((`test`.`t4`.`b` = `test`.`t2`.`c`) and (`test`.`t4`.`a` = `test`.`t3`.`c`))) where (`test`.`t3`.`a` = `test`.`t1`.`a`) +explain extended +select straight_join * +from t1 +join t1 as t2 on t2.a = t1.a and t2.b = t1.b +left join t1 as t3 on t3.a = t1.a +left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 16 100.00 Parent of 2 pushed join@1 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a,test.t1.b 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t2.a 1 100.00 Parent of 2 pushed join@2 +1 SIMPLE t4 eq_ref PRIMARY PRIMARY 8 test.t3.c,test.t2.c 1 100.00 Child of 't3' in pushed join@2 +Warnings: +Note 1644 Can't push table 't3' as child of 't1', outer join with scan-ancestor 't1' not implemented +Note 1644 Can't push table 't4' as child of 't1', column 't3.c' is outside scope of pushable join +Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` join `test`.`t1` `t2` left join `test`.`t1` `t3` on(((`test`.`t2`.`a` = `test`.`t1`.`a`) and (`test`.`t3`.`a` = `test`.`t1`.`a`))) left join `test`.`t1` `t4` on(((`test`.`t4`.`b` = `test`.`t2`.`c`) and (`test`.`t4`.`a` = `test`.`t3`.`c`))) where ((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t2`.`a` = `test`.`t1`.`a`)) +explain extended +select straight_join * +from t1 +left join t1 as t2 on t2.a = t1.a and t2.b = t1.b +join t1 as t3 on t3.a = t1.a +left join t1 as t4 on t4.a = t3.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 16 100.00 Parent of 3 pushed join@1 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a,test.t1.b 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t1.a 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t4 ref PRIMARY PRIMARY 4 test.t3.c 1 100.00 +Warnings: +Note 1644 Can't push table 't4' as child of 't1', outer join with scan-ancestor 't3' not implemented +Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` left join `test`.`t1` `t2` on(((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t2`.`a` = `test`.`t1`.`a`))) join `test`.`t1` `t3` left join `test`.`t1` `t4` on((`test`.`t4`.`a` = `test`.`t3`.`c`)) where (`test`.`t3`.`a` = `test`.`t1`.`a`) +explain extended +select straight_join * +from t1 +join t1 as t2 on t2.a = t1.a and t2.b = t1.b +left join t1 as t3 on t3.a = t1.a +left join t1 as t4 on t4.a = t3.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL PRIMARY NULL NULL NULL 16 100.00 Parent of 2 pushed join@1 +1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 test.t1.a,test.t1.b 1 100.00 Child of 't1' in pushed join@1 +1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t2.a 1 100.00 +1 SIMPLE t4 ref PRIMARY PRIMARY 4 test.t3.c 1 100.00 +Warnings: +Note 1644 Can't push table 't3' as child of 't1', outer join with scan-ancestor 't1' not implemented +Note 1644 Can't push table 't4' as child of 't1', column 't3.c' is outside scope of pushable join +Note 1644 Can't push table 't4' as child of 't3', outer join with scan-ancestor 't3' not implemented +Note 1003 select straight_join `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`test`.`t3`.`d` AS `d`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c`,`test`.`t4`.`d` AS `d` from `test`.`t1` join `test`.`t1` `t2` left join `test`.`t1` `t3` on(((`test`.`t2`.`a` = `test`.`t1`.`a`) and (`test`.`t3`.`a` = `test`.`t1`.`a`))) left join `test`.`t1` `t4` on((`test`.`t4`.`a` = `test`.`t3`.`c`)) where ((`test`.`t2`.`b` = `test`.`t1`.`b`) and (`test`.`t2`.`a` = `test`.`t1`.`a`)) set ndb_join_pushdown=true; explain extended select * from t1 x, t1 y, t1 z, t1 where @@ -4998,13 +5084,13 @@ LOCAL+REMOTE READS_SENT drop table spj_counts_at_startup; drop table spj_counts_at_end; scan_count -2530 +2536 pruned_scan_count 8 sorted_scan_count 9 pushed_queries_defined -366 +373 pushed_queries_dropped 11 pushed_queries_executed === modified file 'mysql-test/suite/ndb/t/ndb_join_pushdown.test' --- a/mysql-test/suite/ndb/t/ndb_join_pushdown.test 2011-04-27 07:42:18 +0000 +++ b/mysql-test/suite/ndb/t/ndb_join_pushdown.test 2011-05-02 13:44:39 +0000 @@ -659,6 +659,50 @@ from t1 join t1 as t3x on t3x.a = t1.c and t3x.b = t1.d join t1 as t4 on t4.a = t3x.c and t4.b = t2x.c; +## It should not be possible to force grandparent dependencies +## via a previously outer joined table: +explain extended +select straight_join * +from t1 + left join t1 as t2 on t2.a = t1.a and t2.b = t1.b + join t1 as t3 on t3.a = t1.c and t3.b = t1.d + left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; + +explain extended +select straight_join * +from t1 + join t1 as t2 on t2.a = t1.a and t2.b = t1.b + left join t1 as t3 on t3.a = t1.c and t3.b = t1.d + left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; + +explain extended +select straight_join * +from t1 + left join t1 as t2 on t2.a = t1.a and t2.b = t1.b + join t1 as t3 on t3.a = t1.a + left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; + +explain extended +select straight_join * +from t1 + join t1 as t2 on t2.a = t1.a and t2.b = t1.b + left join t1 as t3 on t3.a = t1.a + left join t1 as t4 on t4.a = t3.c and t4.b = t2.c; + +explain extended +select straight_join * +from t1 + left join t1 as t2 on t2.a = t1.a and t2.b = t1.b + join t1 as t3 on t3.a = t1.a + left join t1 as t4 on t4.a = t3.c; + +explain extended +select straight_join * +from t1 + join t1 as t2 on t2.a = t1.a and t2.b = t1.b + left join t1 as t3 on t3.a = t1.a + left join t1 as t4 on t4.a = t3.c; + # Test a combination of pushed table scan (x, y) # & pushed EQ-bound (indexScan) (z, t1) === modified file 'sql/abstract_query_plan.cc' --- a/sql/abstract_query_plan.cc 2011-01-04 14:50:54 +0000 +++ b/sql/abstract_query_plan.cc 2011-05-02 13:44:39 +0000 @@ -167,7 +167,7 @@ namespace AQP } const TABLE_LIST* const child_embedding= - get_join_tab()->table->pos_in_table_list->embedding;; + get_join_tab()->table->pos_in_table_list->embedding; if (child_embedding == NULL) { === modified file 'sql/ha_ndbcluster_push.cc' --- a/sql/ha_ndbcluster_push.cc 2011-04-27 09:06:08 +0000 +++ b/sql/ha_ndbcluster_push.cc 2011-05-02 13:44:39 +0000 @@ -644,6 +644,36 @@ ndb_pushed_builder_ctx::is_pushable_as_c } } // scan operation + /** + * In order to allow multiple parents refs to be made grandparent referrences, + * none of the grandparents should be outer joins. + */ + ndb_table_access_map grandparents(depend_parents); + grandparents.clear_bit(root_no); + uint ancestor_no= root_no+1; + while (!grandparents.is_clear_all()) + { + if (grandparents.contain(ancestor_no)) + { + grandparents.clear_bit(ancestor_no); + if (grandparents.is_clear_all()) + break; // done + + const AQP::Table_access* const ancestor= + m_plan.get_table_access(ancestor_no); + + if (ancestor->get_join_type(m_join_root) == AQP::JT_OUTER_JOIN) + { + EXPLAIN_NO_PUSH("Can't push table '%s' as child of '%s', " + "dependencies on outer joined grandparents not implemented", + table->get_table()->alias, + m_join_root->get_table()->alias); + DBUG_RETURN(false); + } + } + ancestor_no++; + } + DBUG_ASSERT(m_join_scope.contain(common_parents)); DBUG_ASSERT(m_join_scope.contain(extend_parents)); DBUG_ASSERT(extend_parents.is_clear_all() || @@ -865,8 +895,7 @@ ndb_pushed_builder_ctx::optimize_query_p */ if (!table.m_depend_parents.is_clear_all()) { - ndb_table_access_map const &dependency - = table.m_depend_parents; + ndb_table_access_map const &dependency= table.m_depend_parents; DBUG_ASSERT(!dependency.contain(tab_no)); // Circular dependency! uint depends_on_parent= dependency.last_table(tab_no-1); @@ -876,6 +905,8 @@ ndb_pushed_builder_ctx::optimize_query_p if (table.m_extend_parents.is_overlapping(dependency_mask)) { table.m_extend_parents.subtract(dependency_mask); + DBUG_ASSERT(table.m_extend_parents.contain(depends_on_parent) || + m_plan.get_table_access(depends_on_parent)->get_join_type(m_join_root) == AQP::JT_INNER_JOIN); table.m_extend_parents.add(depends_on_parent); } if (table.m_common_parents.is_overlapping(dependency_mask)) @@ -886,7 +917,7 @@ ndb_pushed_builder_ctx::optimize_query_p /** * Select set to choose parent from, prefer a 'common' - * parent of available. + * parent if available. */ uint parent_no; ndb_table_access_map const &parents= @@ -1204,7 +1235,7 @@ ndb_pushed_builder_ctx::build_query() if (table->get_join_type(parent) == AQP::JT_INNER_JOIN) { options.setMatchType(NdbQueryOptions::MatchNonNull); - } + } } const NdbQueryOperationDef* query_op= NULL; No bundle (reason: useless for push emails).