From a9d43d70f5d83ac652fd970f5b2b8dfdb77c1136 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Tue, 12 Aug 2014 18:14:56 +0400 Subject: EXPLAIN FORMAT=JSON: produce the 'ref' column. --- sql/sql_explain.cc | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'sql/sql_explain.cc') diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index 846868197ac..f7fc3b106ce 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -253,7 +253,7 @@ static void push_string(List *item_list, String *str) system_charset_info)); } -static void push_string_list(List *item_list, List &lines, +static void push_string_list(List *item_list, String_list &lines, String *buf) { List_iterator_fast it(lines); @@ -677,10 +677,11 @@ int Explain_table_access::print_explain(select_result_sink *output, uint8 explai item_list.push_back(item_null); /* `ref` */ - if (ref_set) - push_string(&item_list, &ref); - else + StringBuffer<64> ref_list_buf; + if (ref_list.is_empty()) item_list.push_back(item_null); + else + push_string_list(&item_list, ref_list, &ref_list_buf); /* `rows` */ if (rows_set) @@ -772,6 +773,18 @@ int Explain_table_access::print_explain(select_result_sink *output, uint8 explai } +bool String_list::append_str(MEM_ROOT *mem_root, const char *str) +{ + size_t len= strlen(str); + char *cp; + if (!(cp = (char*)alloc_root(mem_root, len))) + return 1; + memcpy(cp, str, len+1); + push_back(cp); + return 0; +} + + static void write_item(Json_writer *writer, Item *item) { THD *thd= current_thd; @@ -857,12 +870,26 @@ void Explain_table_access::print_explain_json(Json_writer *writer, /* `used_key_parts` */ if (key_str.length()) writer->add_member("used_key_parts").add_str("TODO"); - + + /* `key_length` */ StringBuffer<64> key_len_str; fill_key_len_str(&key_len_str); if (key_len_str.length()) writer->add_member("key_length").add_str(key_len_str); + + /* `ref` */ + // TODO: need to print this as an array. + if (!ref_list.is_empty()) + { + List_iterator_fast it(ref_list); + const char *str; + writer->add_member("ref").start_array(); + while ((str= it++)) + writer->add_str(str); + writer->end_array(); + } + /* `rows` */ if (rows_set) writer->add_member("rows").add_ll(rows); @@ -873,6 +900,7 @@ void Explain_table_access::print_explain_json(Json_writer *writer, writer->add_member("r_rows").add_ll(avg_rows); } + /* `filtered` */ if (filtered_set) writer->add_member("filtered").add_double(filtered); -- cgit v1.2.1