summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/log_event_old.cc1
-rw-r--r--sql/sp_head.cc1
-rw-r--r--sql/sql_delete.cc3
-rw-r--r--sql/sql_explain.cc6
-rw-r--r--sql/sql_insert.cc1
-rw-r--r--sql/sql_lex.cc2
-rw-r--r--sql/sql_lex.h1
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_select.cc1
-rw-r--r--sql/sql_union.cc6
-rw-r--r--sql/sql_update.cc1
11 files changed, 18 insertions, 7 deletions
diff --git a/sql/log_event_old.cc b/sql/log_event_old.cc
index 698118e3bda..1aa7dfba635 100644
--- a/sql/log_event_old.cc
+++ b/sql/log_event_old.cc
@@ -86,6 +86,7 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
call might reset the value of current_stmt_binlog_format, so
we need to do any changes to that value after this function.
*/
+ delete_explain_query(thd->lex);
lex_start(ev_thd);
mysql_reset_thd_for_next_command(ev_thd, 0);
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 5926f56d644..4cf4a0731a8 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -3246,7 +3246,6 @@ sp_instr_set::execute(THD *thd, uint *nextp)
int
sp_instr_set::exec_core(THD *thd, uint *nextp)
{
- create_explain_query(thd->lex, thd->mem_root);
int res= thd->spcont->set_variable(thd, m_offset, &m_value);
if (res)
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index fae44a72205..e1cd8bed44c 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -228,6 +228,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
query_plan.using_filesort= FALSE;
DBUG_ENTER("mysql_delete");
+ create_explain_query(thd->lex, thd->mem_root);
if (open_and_lock_tables(thd, table_list, TRUE, 0))
DBUG_RETURN(TRUE);
@@ -457,7 +458,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
*/
if (thd->lex->describe)
goto exit_without_my_ok;
-
+
query_plan.save_explain_data(thd->lex->explain);
DBUG_EXECUTE_IF("show_explain_probe_delete_exec_start",
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc
index d20e2b2e4ef..c2ec0481460 100644
--- a/sql/sql_explain.cc
+++ b/sql/sql_explain.cc
@@ -946,3 +946,9 @@ void create_explain_query(LEX *lex, MEM_ROOT *mem_root)
lex->explain->mem_root= mem_root;
}
+void create_explain_query_if_not_exists(LEX *lex, MEM_ROOT *mem_root)
+{
+ if (!lex->explain)
+ create_explain_query(lex, mem_root);
+}
+
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 24b43442e2a..b21650dc559 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -719,6 +719,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
Item *unused_conds= 0;
DBUG_ENTER("mysql_insert");
+ create_explain_query(thd->lex, thd->mem_root);
/*
Upgrade lock type if the requested lock is incompatible with
the current connection mode or table operation.
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 6eb09580ce9..0d7c81deabb 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -448,7 +448,7 @@ void lex_start(THD *thd)
lex->thd= lex->unit.thd= thd;
- lex->explain= NULL;
+ DBUG_ASSERT(!lex->explain);
lex->context_stack.empty();
lex->unit.init_query();
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index c033c0f990b..18be450caf2 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -622,6 +622,7 @@ class Explain_query;
void delete_explain_query(LEX *lex);
void create_explain_query(LEX *lex, MEM_ROOT *mem_root);
+void create_explain_query_if_not_exists(LEX *lex, MEM_ROOT *mem_root);
bool print_explain_query(LEX *lex, THD *thd, String *str);
class st_select_lex_unit: public st_select_lex_node {
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index a28cafe524a..36c70daae72 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2201,8 +2201,6 @@ mysql_execute_command(THD *thd)
thd->mdl_context.release_transactional_locks();
}
- create_explain_query(thd->lex, thd->mem_root);
-
#ifndef DBUG_OFF
if (lex->sql_command != SQLCOM_SET_OPTION)
DEBUG_SYNC(thd,"before_execute_sql_command");
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 2d6f92db646..457e8d5b8cd 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1020,6 +1020,7 @@ int JOIN::optimize()
*/
if (was_optimized != optimized && !res && have_query_plan != QEP_DELETED)
{
+ create_explain_query_if_not_exists(thd->lex, thd->mem_root);
have_query_plan= QEP_AVAILABLE;
save_explain_data(thd->lex->explain, false /* can overwrite */,
need_tmp,
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 48611554987..cf7fd4f8280 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -631,8 +631,10 @@ bool st_select_lex_unit::exec()
item->make_const();
saved_error= optimize();
+
+ create_explain_query_if_not_exists(thd->lex, thd->mem_root);
- if (!saved_error && !was_executed && thd->lex->explain)
+ if (!saved_error && !was_executed)
save_union_explain(thd->lex->explain);
if (uncacheable || !item || !item->assigned() || describe)
@@ -782,7 +784,7 @@ bool st_select_lex_unit::exec()
if (!fake_select_lex->ref_pointer_array)
fake_select_lex->n_child_sum_items+= global_parameters->n_sum_items;
- if (!was_executed && thd->lex->explain)
+ if (!was_executed)
save_union_explain_part2(thd->lex->explain);
saved_error= mysql_select(thd, &fake_select_lex->ref_pointer_array,
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 786e058c99d..a97ad727d14 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -281,6 +281,7 @@ int mysql_update(THD *thd,
query_plan.using_filesort= FALSE;
DBUG_ENTER("mysql_update");
+ create_explain_query(thd->lex, thd->mem_root);
if (open_tables(thd, &table_list, &table_count, 0))
DBUG_RETURN(1);