summaryrefslogtreecommitdiff
path: root/sql/sql_explain.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_explain.cc')
-rw-r--r--sql/sql_explain.cc41
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,