diff options
author | Sergei Petrunia <psergey@askmonty.org> | 2014-12-02 01:40:10 +0300 |
---|---|---|
committer | Sergei Petrunia <psergey@askmonty.org> | 2014-12-02 01:40:10 +0300 |
commit | 0000695025dea9740842ea57a5d79cd56d880405 (patch) | |
tree | a3dab25aa3464ce8619cf87f4775cc6bdfba9230 /sql/sql_explain.cc | |
parent | a35b05399ef20de3c0d5e521a62b5e297c6ccd1e (diff) | |
download | mariadb-git-0000695025dea9740842ea57a5d79cd56d880405.tar.gz |
EXPLAIN FORMAT=JSON
Add support for semi-join strategies: FirstMatch, DuplicateWeedout,
LooseScan.
Diffstat (limited to 'sql/sql_explain.cc')
-rw-r--r-- | sql/sql_explain.cc | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index c4f8002494f..7e6c1c6cf5c 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -732,7 +732,13 @@ void Explain_basic_join::print_explain_json(Explain_query *query, writer->add_member("select_id").add_ll(select_id); for (uint i=0; i< n_join_tabs; i++) { + if (join_tabs[i]->start_dups_weedout) + writer->add_member("duplicates_removal").start_object(); + join_tabs[i]->print_explain_json(query, writer, is_analyze); + + if (join_tabs[i]->end_dups_weedout) + writer->end_object(); } print_explain_json_for_children(query, writer, is_analyze); writer->end_object(); @@ -1089,9 +1095,7 @@ void Explain_table_access::tag_to_json(Json_writer *writer, enum explain_extra_t write_item(writer, pushed_index_cond); break; case ET_USING_WHERE: - if (where_cond) { - writer->add_member("attached_condition"); /* We are printing the condition that is checked when scanning this table. @@ -1099,7 +1103,11 @@ void Explain_table_access::tag_to_json(Json_writer *writer, enum explain_extra_t - in other cases, it is where_cond. */ Item *item= bka_type.is_using_jbuf()? cache_cond: where_cond; - write_item(writer, item); + if (item) + { + writer->add_member("attached_condition"); + write_item(writer, item); + } } break; case ET_USING_INDEX: @@ -1110,6 +1118,15 @@ void Explain_table_access::tag_to_json(Json_writer *writer, enum explain_extra_t break; case ET_USING_JOIN_BUFFER: /* Do nothing. Join buffer is handled differently */ + case ET_START_TEMPORARY: + case ET_END_TEMPORARY: + /* Handled as "duplicates_removal: { ... } */ + break; + case ET_FIRST_MATCH: + writer->add_member("first_match").add_str(firstmatch_table_name.c_ptr()); + break; + case ET_LOOSESCAN: + writer->add_member("loose_scan").add_bool(true); break; default: DBUG_ASSERT(0); |