diff options
-rw-r--r-- | sql/log_event_old.cc | 1 | ||||
-rw-r--r-- | sql/sp_head.cc | 1 | ||||
-rw-r--r-- | sql/sql_delete.cc | 3 | ||||
-rw-r--r-- | sql/sql_explain.cc | 6 | ||||
-rw-r--r-- | sql/sql_insert.cc | 1 | ||||
-rw-r--r-- | sql/sql_lex.cc | 2 | ||||
-rw-r--r-- | sql/sql_lex.h | 1 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_select.cc | 1 | ||||
-rw-r--r-- | sql/sql_union.cc | 6 | ||||
-rw-r--r-- | sql/sql_update.cc | 1 |
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); |