Commit ab44e892 authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-9652: EXPLAIN FORMAT=JSON should show outer_ref_cond

Show outer_ref_condition in EXPLAIN FORMAT=JSON output.
parent 0dbfc0fd
...@@ -1543,3 +1543,43 @@ ANALYZE ...@@ -1543,3 +1543,43 @@ ANALYZE
set optimizer_switch=@tmp_optimizer_switch; set optimizer_switch=@tmp_optimizer_switch;
set join_cache_level=@tmp_join_cache_level; set join_cache_level=@tmp_join_cache_level;
drop table t1,t2,t3,t4; drop table t1,t2,t3,t4;
#
# MDEV-9652: EXPLAIN FORMAT=JSON should show outer_ref_cond
#
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (a int, b int);
insert into t1 select a,a from t0;
explain format=json
select a, (select max(a) from t1 where t0.a<5 and t1.b<t0.a) from t0;
EXPLAIN
{
"query_block": {
"select_id": 1,
"table": {
"table_name": "t0",
"access_type": "ALL",
"rows": 10,
"filtered": 100
},
"subqueries": [
{
"expression_cache": {
"state": "uninitialized",
"query_block": {
"select_id": 2,
"outer_ref_condition": "(t0.a < 5)",
"table": {
"table_name": "t1",
"access_type": "ALL",
"rows": 10,
"filtered": 100,
"attached_condition": "((t0.a < 5) and (t1.b < t0.a))"
}
}
}
}
]
}
}
drop table t0,t1;
...@@ -394,5 +394,15 @@ set join_cache_level=@tmp_join_cache_level; ...@@ -394,5 +394,15 @@ set join_cache_level=@tmp_join_cache_level;
drop table t1,t2,t3,t4; drop table t1,t2,t3,t4;
--echo #
--echo # MDEV-9652: EXPLAIN FORMAT=JSON should show outer_ref_cond
--echo #
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (a int, b int);
insert into t1 select a,a from t0;
explain format=json
select a, (select max(a) from t1 where t0.a<5 and t1.b<t0.a) from t0;
drop table t0,t1;
...@@ -862,6 +862,12 @@ void Explain_select::print_explain_json(Explain_query *query, ...@@ -862,6 +862,12 @@ void Explain_select::print_explain_json(Explain_query *query,
writer->add_member("const_condition"); writer->add_member("const_condition");
write_item(writer, exec_const_cond); write_item(writer, exec_const_cond);
} }
if (outer_ref_cond)
{
writer->add_member("outer_ref_condition");
write_item(writer, outer_ref_cond);
}
/* we do not print HAVING which always evaluates to TRUE */ /* we do not print HAVING which always evaluates to TRUE */
if (having || (having_value == Item::COND_FALSE)) if (having || (having_value == Item::COND_FALSE))
{ {
......
...@@ -232,9 +232,10 @@ class Explain_select : public Explain_basic_join ...@@ -232,9 +232,10 @@ class Explain_select : public Explain_basic_join
/* Expensive constant condition */ /* Expensive constant condition */
Item *exec_const_cond; Item *exec_const_cond;
Item *outer_ref_cond;
/* HAVING condition */ /* HAVING condition */
COND *having; Item *having;
Item::cond_result having_value; Item::cond_result having_value;
/* Global join attributes. In tabular form, they are printed on the first row */ /* Global join attributes. In tabular form, they are printed on the first row */
......
...@@ -24252,6 +24252,7 @@ int JOIN::save_explain_data_intern(Explain_query *output, bool need_tmp_table, ...@@ -24252,6 +24252,7 @@ int JOIN::save_explain_data_intern(Explain_query *output, bool need_tmp_table,
xpl_sel->using_filesort= true; xpl_sel->using_filesort= true;
xpl_sel->exec_const_cond= exec_const_cond; xpl_sel->exec_const_cond= exec_const_cond;
xpl_sel->outer_ref_cond= outer_ref_cond;
if (tmp_having) if (tmp_having)
xpl_sel->having= tmp_having; xpl_sel->having= tmp_having;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment