diff options
author | Igor Babaev <igor@askmonty.org> | 2013-03-31 09:10:01 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2013-03-31 09:10:01 -0700 |
commit | 2713bab291095ae8558fa6c0a649c1991c5aa250 (patch) | |
tree | 3111fbce4038ea7318a7e9f2385a16d1d025bc11 /sql/opt_subselect.cc | |
parent | 78bab7839502e02d6d62b50d99ac9b0637acb4a1 (diff) | |
parent | 993ea79f2df42292eceeee394e8ece9f4a3f6cf2 (diff) | |
download | mariadb-git-2713bab291095ae8558fa6c0a649c1991c5aa250.tar.gz |
Merge 10.0-base -> mwl253.
Diffstat (limited to 'sql/opt_subselect.cc')
-rw-r--r-- | sql/opt_subselect.cc | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 36ab3a9a2e0..31d3ad337d8 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -2549,6 +2549,10 @@ void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx, /* Mark strategy as used */ (*strategy)->mark_used(); pos->sj_strategy= sj_strategy; + if (sj_strategy == SJ_OPT_MATERIALIZE) + join->sjm_lookup_tables |= handled_fanout; + else + join->sjm_lookup_tables &= ~handled_fanout; *current_read_time= read_time; *current_record_count= rec_count; join->cur_dups_producing_tables &= ~handled_fanout; @@ -3073,6 +3077,13 @@ void restore_prev_sj_state(const table_map remaining_tables, const JOIN_TAB *tab, uint idx) { TABLE_LIST *emb_sj_nest; + + if (tab->emb_sj_nest) + { + table_map subq_tables= tab->emb_sj_nest->sj_inner_tables; + tab->join->sjm_lookup_tables &= ~subq_tables; + } + if ((emb_sj_nest= tab->emb_sj_nest)) { /* If we're removing the last SJ-inner table, remove the sj-nest */ @@ -3250,6 +3261,7 @@ void fix_semijoin_strategies_for_picked_join_order(JOIN *join) uint tablenr; table_map remaining_tables= 0; table_map handled_tabs= 0; + join->sjm_lookup_tables= 0; for (tablenr= table_count - 1 ; tablenr != join->const_tables - 1; tablenr--) { POSITION *pos= join->best_positions + tablenr; @@ -3275,6 +3287,7 @@ void fix_semijoin_strategies_for_picked_join_order(JOIN *join) first= tablenr - sjm->tables + 1; join->best_positions[first].n_sj_tables= sjm->tables; join->best_positions[first].sj_strategy= SJ_OPT_MATERIALIZE; + join->sjm_lookup_tables|= s->table->map; } else if (pos->sj_strategy == SJ_OPT_MATERIALIZE_SCAN) { |