summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/opt_subselect.cc4
-rw-r--r--sql/opt_trace.cc3
-rw-r--r--sql/sql_base.cc2
-rw-r--r--sql/sql_delete.cc4
-rw-r--r--sql/sql_select.cc3
-rw-r--r--sql/sql_update.cc11
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())