diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/opt_subselect.cc | 4 | ||||
-rw-r--r-- | sql/opt_trace.cc | 3 | ||||
-rw-r--r-- | sql/sql_base.cc | 2 | ||||
-rw-r--r-- | sql/sql_delete.cc | 4 | ||||
-rw-r--r-- | sql/sql_select.cc | 3 | ||||
-rw-r--r-- | sql/sql_update.cc | 11 |
6 files changed, 18 insertions, 9 deletions
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index bddaa1b21bc..87201f5dfe6 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -565,11 +565,11 @@ bool SELECT_LEX::is_sj_conversion_prohibited(THD *thd) switch (thd->lex->sql_command) { case SQLCOM_UPDATE: return - !((Sql_cmd_update *) cmd)->is_multitable() || + !((Sql_cmd_update *) cmd)->is_multitable() && ((Sql_cmd_update *) cmd)->processing_as_multitable_update_prohibited(thd); case SQLCOM_DELETE: return - !((Sql_cmd_delete *) cmd)->is_multitable() || + !((Sql_cmd_delete *) cmd)->is_multitable() && ((Sql_cmd_delete *) cmd)->processing_as_multitable_delete_prohibited(thd); default: return false; diff --git a/sql/opt_trace.cc b/sql/opt_trace.cc index 33209ff0a8c..4bc493940fb 100644 --- a/sql/opt_trace.cc +++ b/sql/opt_trace.cc @@ -491,8 +491,7 @@ void Opt_trace_start::init(THD *thd, !list_has_optimizer_trace_table(tbl) && !sets_var_optimizer_trace(sql_command, set_vars) && !thd->system_thread && - !ctx->disable_tracing_if_required() && - !(thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_PREPARE)) + !ctx->disable_tracing_if_required()) { ctx->start(thd, tbl, sql_command, query, query_length, query_charset, thd->variables.optimizer_trace_max_mem_size); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 477fe307e3a..1b1e7ac8e77 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1214,7 +1214,7 @@ retry: } } else if (thd->lex->sql_command == SQLCOM_DELETE) - { + { Sql_cmd_delete *cmd= (Sql_cmd_delete *) (thd->lex->m_sql_cmd); if (cmd->is_multitable() || derived->derived->outer_select()) materialize= false; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 42c8f7d00ce..7fc123efcc9 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -1662,6 +1662,10 @@ bool Sql_cmd_delete::prepare_inner(THD *thd) { goto err; } + + if (!multitable && + select_lex->sj_subselects.elements) + multitable= true; } if (multitable) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 19a487eec66..0b30dbfd8c5 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -5882,8 +5882,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list, s->needed_reg=select->needed_reg; select->quick=0; impossible_range= records == 0 && s->table->reginfo.impossible_range; - if (join->thd->lex->sql_command == SQLCOM_SELECT && - optimizer_flag(join->thd, OPTIMIZER_SWITCH_USE_ROWID_FILTER)) + if (optimizer_flag(join->thd, OPTIMIZER_SWITCH_USE_ROWID_FILTER)) s->table->init_cost_info_for_usable_range_rowid_filters(join->thd); } if (!impossible_range) diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 6e54e664152..22e08fc0784 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -2476,6 +2476,8 @@ int multi_update::do_updates() table = cur_table->table; if (table == table_to_update) continue; // Already updated + if (table->file->pushed_rowid_filter) + table->file->disable_pushed_rowid_filter(); org_updated= updated; tmp_table= tmp_tables[cur_table->shared]; tmp_table->file->extra(HA_EXTRA_CACHE); // Change to read cache @@ -2670,7 +2672,8 @@ int multi_update::do_updates() check_opt_it.rewind(); while (TABLE *tbl= check_opt_it++) tbl->file->ha_rnd_end(); - + if (table->file->save_pushed_rowid_filter) + table->file->enable_pushed_rowid_filter(); } DBUG_RETURN(0); @@ -2681,6 +2684,8 @@ err: } err2: + if (table->file->save_pushed_rowid_filter) + table->file->enable_pushed_rowid_filter(); if (table->file->inited) (void) table->file->ha_rnd_end(); if (tmp_table->file->inited) @@ -2984,7 +2989,9 @@ bool Sql_cmd_update::prepare_inner(THD *thd) { goto err; } - + if (!multitable && + select_lex->sj_subselects.elements) + multitable= true; } if (table_list->has_period()) |