diff options
Diffstat (limited to 'sql/sql_explain.cc')
-rw-r--r-- | sql/sql_explain.cc | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index 857c292630c..693235c79e6 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -29,6 +29,11 @@ const char * STR_DELETING_ALL_ROWS= "Deleting all rows"; const char * STR_IMPOSSIBLE_WHERE= "Impossible WHERE"; const char * STR_NO_ROWS_AFTER_PRUNING= "No matching rows after partition pruning"; +const char *unit_operation_text[4]= +{ + "UNIT RESULT","UNION RESULT","INTERSECT RESULT","EXCEPT RESULT" +}; + static void write_item(Json_writer *writer, Item *item); static void append_item_to_str(String *out, Item *item); @@ -418,8 +423,28 @@ int print_explain_row(select_result_sink *result, uint Explain_union::make_union_table_name(char *buf) { uint childno= 0; - uint len= 6, lastop= 0; - memcpy(buf, STRING_WITH_LEN("<union")); + uint len, lastop= 0; + switch (operation) + { + case OP_MIX: + len= 5; + memcpy(buf, STRING_WITH_LEN("<unit")); + break; + case OP_UNION: + len= 6; + memcpy(buf, STRING_WITH_LEN("<union")); + break; + case OP_INTERSECT: + len= 10; + memcpy(buf, STRING_WITH_LEN("<intersect")); + break; + case OP_EXCEPT: + len= 7; + memcpy(buf, STRING_WITH_LEN("<except")); + break; + default: + DBUG_ASSERT(0); + } for (; childno < union_members.elements() && len + lastop + 5 < NAME_LEN; childno++) @@ -462,7 +487,7 @@ int Explain_union::print_explain(Explain_query *query, if (!using_tmp) return 0; - /* Print a line with "UNION RESULT" */ + /* Print a line with "UNIT RESULT" */ List<Item> item_list; Item *item_null= new (mem_root) Item_null(thd); @@ -816,20 +841,24 @@ int Explain_basic_join::print_explain(Explain_query *query, void Explain_select::add_linkage(Json_writer *writer) { + const char *operation= NULL; switch (linkage) { case UNION_TYPE: - writer->add_member("operation").add_str("UNION"); + operation= "UNION"; break; case INTERSECT_TYPE: - writer->add_member("operation").add_str("INTERSECT"); + operation= "INTERSECT"; break; case EXCEPT_TYPE: - writer->add_member("operation").add_str("EXCEPT"); + operation= "EXCEPT"; break; default: + // It is the first or the only SELECT => no operation break; } + if (operation) + writer->add_member("operation").add_str(operation); } void Explain_select::print_explain_json(Explain_query *query, |