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
set optimizer_switch=@tmp_optimizer_switch;
set join_cache_level=@tmp_join_cache_level;
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;
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,
writer->add_member("const_condition");
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 */
if (having || (having_value == Item::COND_FALSE))
{
......
......@@ -232,9 +232,10 @@ class Explain_select : public Explain_basic_join
/* Expensive constant condition */
Item *exec_const_cond;
Item *outer_ref_cond;
/* HAVING condition */
COND *having;
Item *having;
Item::cond_result having_value;
/* 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,
xpl_sel->using_filesort= true;
xpl_sel->exec_const_cond= exec_const_cond;
xpl_sel->outer_ref_cond= outer_ref_cond;
if (tmp_having)
xpl_sel->having= tmp_having;
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