diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2017-09-14 09:12:47 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2017-09-14 09:12:47 +0300 |
commit | 348eaf425216fe927424220b1820da0e383cfa52 (patch) | |
tree | fb24590627585a4aeab98bbe1b7a1f77bd8d63d5 /sql/sql_select.cc | |
parent | 474f51711b1abbba799d93a0223ef38316b78f6c (diff) | |
parent | 2bd6ccae72306547fc89199342584cd4d6e9b939 (diff) | |
download | mariadb-git-348eaf425216fe927424220b1820da0e383cfa52.tar.gz |
Merge bb-10.2-ext into 10.3
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 96c8f65e29e..52544130918 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1111,7 +1111,7 @@ int JOIN::optimize() { int res= 0; join_optimization_state init_state= optimization_state; - if (optimization_state == JOIN::OPTIMIZATION_IN_STAGE_2) + if (optimization_state == JOIN::OPTIMIZATION_PHASE_1_DONE) res= optimize_stage2(); else { @@ -1123,7 +1123,7 @@ int JOIN::optimize() res= optimize_inner(); } if (!with_two_phase_optimization || - init_state == JOIN::OPTIMIZATION_IN_STAGE_2) + init_state == JOIN::OPTIMIZATION_PHASE_1_DONE) { if (!res && have_query_plan != QEP_DELETED) build_explain(); @@ -1341,6 +1341,11 @@ JOIN::optimize_inner() */ if (tbl->is_materialized_derived()) { + JOIN *join= tbl->get_unit()->first_select()->join; + if (join && + join->optimization_state == JOIN::OPTIMIZATION_PHASE_1_DONE && + join->with_two_phase_optimization) + continue; /* Do not push conditions from where into materialized inner tables of outer joins: this is not valid. @@ -1535,7 +1540,7 @@ JOIN::optimize_inner() setup_subq_exit: with_two_phase_optimization= check_two_phase_optimization(thd); if (with_two_phase_optimization) - optimization_state= JOIN::OPTIMIZATION_IN_STAGE_2; + optimization_state= JOIN::OPTIMIZATION_PHASE_1_DONE; else { if (optimize_stage2()) @@ -1556,7 +1561,7 @@ int JOIN::optimize_stage2() goto setup_subq_exit; if (select_lex->handle_derived(thd->lex, DT_OPTIMIZE)) - DBUG_RETURN(1); + DBUG_RETURN(1); if (thd->check_killed()) DBUG_RETURN(1); @@ -9070,12 +9075,10 @@ bool JOIN::push_splitting_cond_into_derived(THD *thd, Item *cond) { enum_reopt_result reopt_result= REOPT_NONE; table_map all_table_map= 0; - for (JOIN_TAB *tab= join_tab + const_tables; + for (JOIN_TAB *tab= join_tab; tab < join_tab + top_join_tab_count; tab++) - { all_table_map|= tab->table->map; - } - reopt_result= reoptimize(cond, all_table_map, NULL); + reopt_result= reoptimize(cond, all_table_map & ~const_table_map, NULL); if (reopt_result == REOPT_ERROR) return true; if (inject_cond_into_where(cond)) |