From b3720ff7553ced6208737482d3410183cab4a545 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Sat, 4 May 2013 00:56:50 +0400 Subject: [PATCH] MDEV-621: LP:693329 - Assertion `!is_interleave_error' failed on low optimizer_search_depth - When restore_prev_nj_state() is called for the table that is the last remaining child of a nested join, do not leave that nested join's bit in join->cur_embedding_map. --- mysql-test/r/join_nested.result | 24 ++++++++++++++++++++++++ mysql-test/t/join_nested.test | 24 ++++++++++++++++++++++++ sql/sql_select.cc | 4 ++-- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/join_nested.result b/mysql-test/r/join_nested.result index 255714a7236..84b6ff640e9 100644 --- a/mysql-test/r/join_nested.result +++ b/mysql-test/r/join_nested.result @@ -1847,3 +1847,27 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t2`.`a` AS `a`,`test`.`t3`.`a` A DROP TABLE t1,t2,t3,t4; SET optimizer_switch=@save_optimizer_switch; End of 5.0 tests +# +# MDEV-621: LP:693329 - Assertion `!is_interleave_error' failed on low optimizer_search_depth +# +set @tmp_mdev621= @@optimizer_search_depth; +SET SESSION optimizer_search_depth = 4; +CREATE TABLE t1 (f1 int,f2 int,f3 int,f4 int) ; +INSERT IGNORE INTO t1 VALUES (0,0,2,0),(NULL,0,2,0); +CREATE TABLE t2 (f1 int) ; +CREATE TABLE t3 (f3 int,PRIMARY KEY (f3)) ; +CREATE TABLE t4 (f5 int) ; +CREATE TABLE t5 (f2 int) ; +SELECT alias2.f4 FROM t1 AS alias1 +LEFT JOIN t1 AS alias2 +LEFT JOIN t2 AS alias3 +LEFT JOIN t3 AS alias4 ON alias3.f1 = alias4.f3 +ON alias2.f1 +LEFT JOIN t4 AS alias5 +JOIN t5 ON alias5.f5 +ON alias2.f3 ON alias1.f2; +f4 +NULL +NULL +DROP TABLE t1,t2,t3,t4,t5; +set optimizer_search_depth= @tmp_mdev621; diff --git a/mysql-test/t/join_nested.test b/mysql-test/t/join_nested.test index 3168e95f620..7b7d9236835 100644 --- a/mysql-test/t/join_nested.test +++ b/mysql-test/t/join_nested.test @@ -1287,3 +1287,27 @@ SET optimizer_switch=@save_optimizer_switch; --echo End of 5.0 tests +--echo # +--echo # MDEV-621: LP:693329 - Assertion `!is_interleave_error' failed on low optimizer_search_depth +--echo # +set @tmp_mdev621= @@optimizer_search_depth; +SET SESSION optimizer_search_depth = 4; + +CREATE TABLE t1 (f1 int,f2 int,f3 int,f4 int) ; +INSERT IGNORE INTO t1 VALUES (0,0,2,0),(NULL,0,2,0); +CREATE TABLE t2 (f1 int) ; +CREATE TABLE t3 (f3 int,PRIMARY KEY (f3)) ; +CREATE TABLE t4 (f5 int) ; +CREATE TABLE t5 (f2 int) ; + +SELECT alias2.f4 FROM t1 AS alias1 +LEFT JOIN t1 AS alias2 + LEFT JOIN t2 AS alias3 + LEFT JOIN t3 AS alias4 ON alias3.f1 = alias4.f3 + ON alias2.f1 +LEFT JOIN t4 AS alias5 + JOIN t5 ON alias5.f5 +ON alias2.f3 ON alias1.f2; +DROP TABLE t1,t2,t3,t4,t5; +set optimizer_search_depth= @tmp_mdev621; + diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 6d80ea8d212..4843d7be400 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -13262,13 +13262,13 @@ static void restore_prev_nj_state(JOIN_TAB *last) bool was_fully_covered= nest->is_fully_covered(); + join->cur_embedding_map|= nest->nj_map; + if (--nest->counter == 0) join->cur_embedding_map&= ~nest->nj_map; if (!was_fully_covered) break; - - join->cur_embedding_map|= nest->nj_map; } } }