diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2012-05-11 18:13:06 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2012-05-11 18:13:06 +0400 |
commit | 6bce336624e84f5ec377926b105ec2002b38c96b (patch) | |
tree | 403415304e99e5f25617e4b75f401938aaae7d83 /sql/sql_select.cc | |
parent | 6fae4447f0873c159d94d1a3d8deafbd224d8100 (diff) | |
download | mariadb-git-6bce336624e84f5ec377926b105ec2002b38c96b.tar.gz |
MDEV-240: SHOW EXPLAIN: Assertion `this->optimized == 2' failed
- Fix the bug: SHOW EXPLAIN may hit a case where a join is partially
optimized.
- Change JOIN::optimized to use enum instead of numeric constants
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index f48f180d1dd..af7a06e424d 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -608,7 +608,7 @@ JOIN::prepare(Item ***rref_pointer_array, DBUG_ENTER("JOIN::prepare"); // to prevent double initialization on EXPLAIN - if (optimized) + if (optimized != JOIN::NOT_OPTIMIZED) DBUG_RETURN(0); conds= conds_init; @@ -936,7 +936,7 @@ err: int JOIN::optimize() { int res= optimize_inner(); - optimized= 2; + optimized= JOIN::OPTIMIZATION_DONE; return res; } /** @@ -960,9 +960,9 @@ JOIN::optimize_inner() DBUG_ENTER("JOIN::optimize"); do_send_rows = (unit->select_limit_cnt) ? 1 : 0; // to prevent double initialization on EXPLAIN - if (optimized) + if (optimized != JOIN::NOT_OPTIMIZED) DBUG_RETURN(0); - optimized= 1; + optimized= JOIN::OPTIMIZATION_IN_PROGRESS; thd_proc_info(thd, "optimizing"); set_allowed_join_cache_types(); @@ -1731,7 +1731,7 @@ int JOIN::init_execution() { DBUG_ENTER("JOIN::init_execution"); - DBUG_ASSERT(optimized); + DBUG_ASSERT(optimized == JOIN::OPTIMIZATION_DONE); DBUG_ASSERT(!(select_options & SELECT_DESCRIBE)); initialized= true; @@ -21187,7 +21187,7 @@ int JOIN::print_explain(select_result_sink *result, uint8 explain_flags, DBUG_PRINT("info", ("Select 0x%lx, type %s, message %s", (ulong)join->select_lex, join->select_lex->type, message ? message : "NULL")); - DBUG_ASSERT(this->optimized == 2); + /* Don't log this into the slow query log */ if (!on_the_fly) @@ -21204,6 +21204,10 @@ int JOIN::print_explain(select_result_sink *result, uint8 explain_flags, { item_list.push_back(new Item_int((int32) join->select_lex->select_number)); + + if (on_the_fly) + join->select_lex->set_explain_type(on_the_fly); + item_list.push_back(new Item_string(join->select_lex->type, strlen(join->select_lex->type), cs)); for (uint i=0 ; i < 7; i++) @@ -21227,6 +21231,7 @@ int JOIN::print_explain(select_result_sink *result, uint8 explain_flags, else if (!join->select_lex->master_unit()->derived || join->select_lex->master_unit()->derived->is_materialized_derived()) { + DBUG_ASSERT(optimized == JOIN::OPTIMIZATION_DONE); table_map used_tables=0; //if (!join->select_lex->type) if (on_the_fly) |