Commit b9a45ba4 authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-23645: Optimizer trace: print conditions after substitute_for_best_equal_field

Print the conditions for WHERE, HAVING, and ON.
parent 00528a04
......@@ -153,9 +153,14 @@ select * from v1 {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = 1"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = 1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -299,9 +304,14 @@ select * from (select * from t1 where t1.a=1)q {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = 1"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = 1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -452,9 +462,14 @@ select * from v2 {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = 1"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = 1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -520,7 +535,6 @@ select * from v2 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -659,7 +673,6 @@ explain select * from v2 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -779,7 +792,6 @@ explain select * from v1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -845,7 +857,6 @@ explain select * from v1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -1103,9 +1114,14 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b {
{
"best_join_order": ["t1", "t2"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t2.a = t1.b and t1.a = t2.b + 2"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t2.a = t1.b and t1.a = t2.b + 2",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -1274,7 +1290,6 @@ EXPLAIN SELECT DISTINCT a FROM t1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -1465,9 +1480,14 @@ EXPLAIN SELECT MIN(d) FROM t1 where b=2 and c=3 group by a {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.b = 2 and t1.c = 3"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.b = 2 and t1.c = 3",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -1659,9 +1679,14 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a >= 20010104e0"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a >= 20010104e0",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -1842,9 +1867,14 @@ EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = 20010104e0"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = 20010104e0",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -2120,9 +2150,14 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = 1 and t1.b = 2"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = 1 and t1.b = 2",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -2360,12 +2395,17 @@ select t1.a from t1 left join t2 on t1.a=t2.a {
{
"best_join_order": ["t2", "t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "1"
}
},
{
"condition_on_constant_tables": "1"
},
{
"attaching_conditions_to_tables": {
"original_condition": "1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -2517,12 +2557,24 @@ explain select * from t1 left join t2 on t2.a=t1.a {
{
"best_join_order": ["t1", "t2"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "1"
}
},
{
"substitute_best_equal": {
"condition": "ON expr",
"attached_to": "t2",
"resulting_condition": "t2.a = t1.a"
}
},
{
"condition_on_constant_tables": "1"
},
{
"attaching_conditions_to_tables": {
"original_condition": "1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -2675,12 +2727,17 @@ explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and
{
"best_join_order": ["t3", "t2", "t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "1"
}
},
{
"condition_on_constant_tables": "1"
},
{
"attaching_conditions_to_tables": {
"original_condition": "1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -2988,12 +3045,17 @@ explain extended select * from t1 where a in (select pk from t10) {
{
"best_join_order": ["t1", "<subquery2>"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "1"
}
},
{
"condition_on_constant_tables": "1"
},
{
"attaching_conditions_to_tables": {
"original_condition": "1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -3349,9 +3411,14 @@ explain select * from t1 where pk = 2 and a=5 and b=1 {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.pk = 2 and t1.a = 5 and t1.b = 1"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.pk = 2 and t1.a = 5 and t1.b = 1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -3475,7 +3542,6 @@ select f1(a) from t1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -3573,7 +3639,6 @@ select f2(a) from t1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -3611,7 +3676,7 @@ a
2
select length(trace) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
length(trace)
2183
2141
set optimizer_trace_max_mem_size=100;
select * from t1;
a
......@@ -3625,7 +3690,7 @@ select * from t1 {
"join_preparation": {
"select_id": 1,
"steps": [
2083 0
2041 0
set optimizer_trace_max_mem_size=0;
select * from t1;
a
......@@ -3633,7 +3698,7 @@ a
2
select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES
select * from t1 2183 0
select * from t1 2141 0
drop table t1;
set optimizer_trace='enabled=off';
set @@optimizer_trace_max_mem_size= @save_optimizer_trace_max_mem_size;
......@@ -4041,9 +4106,14 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
{
"best_join_order": ["t0", "t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = t0.a and t0.a < 3"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = t0.a and t0.a < 3",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -4180,7 +4250,6 @@ explain select * from (select rand() from t1)q {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -4246,7 +4315,6 @@ explain select * from (select rand() from t1)q {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -4686,12 +4754,17 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_
{
"best_join_order": ["t1", "<subquery2>"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "1"
}
},
{
"condition_on_constant_tables": "1"
},
{
"attaching_conditions_to_tables": {
"original_condition": "1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -6255,9 +6328,14 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"t_inner_3"
]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t_inner_1.a = t_outer_1.a and t_inner_3.a = t_outer_2.a"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t_inner_1.a = t_outer_1.a and t_inner_3.a = t_outer_2.a",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -7332,12 +7410,17 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
"<subquery3>"
]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "1"
}
},
{
"condition_on_constant_tables": "1"
},
{
"attaching_conditions_to_tables": {
"original_condition": "1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -8644,7 +8727,6 @@ select count(*) from seq_1_to_10000000 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -8832,4 +8914,98 @@ S
"cause": "no predicate for first keypart"
}
drop table t1,t2,t3;
#
# MDEV-23645: Optimizer trace: print conditions after substitute_for_best_equal_field
#
create table t1 (a int, b int, c int);
insert into t1 values (1,1,1),(2,2,2);
create table t2 as select * from t1;
insert into t2 select * from t2;
create table t3 as select * from t2;
insert into t3 select * from t3;
# Check how HAVING is printed
explain
select
a,b, count(*)
from t1
where a=3
group by b,b
having a+b < 10;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where; Using temporary; Using filesort
select
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
from
information_schema.optimizer_trace;
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
[
{
"condition": "WHERE",
"resulting_condition": "t1.a = 3"
},
{
"condition": "HAVING",
"resulting_condition": "t1.a + t1.b < 10"
}
]
# Check ON expression
explain
select
*
from t1 left join t2 on t2.a=t1.a and t2.a<3
where
t1.b > 5555;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join)
select
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
from
information_schema.optimizer_trace;
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
[
{
"condition": "WHERE",
"resulting_condition": "t1.b > 5555"
},
{
"condition": "ON expr",
"attached_to": "t2",
"resulting_condition": "t2.a = t1.a and t1.a < 3"
}
]
# Check nested ON expression
explain
select
*
from t1 left join (t2,t3) on t2.a=t1.a and t3.a=t2.a and t3.a + t2.a <1000
where
t1.b > 5555;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join)
1 SIMPLE t3 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (incremental, BNL join)
select
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
from
information_schema.optimizer_trace;
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
[
{
"condition": "WHERE",
"resulting_condition": "t1.b > 5555"
},
{
"condition": "ON expr",
"attached_to": "t2",
"resulting_condition": "t2.a = t1.a and t3.a = t1.a and t1.a + t1.a < 1000"
}
]
drop table t1,t2,t3;
set optimizer_trace='enabled=off';
......@@ -727,4 +727,57 @@ select
drop table t1,t2,t3;
--echo #
--echo # MDEV-23645: Optimizer trace: print conditions after substitute_for_best_equal_field
--echo #
create table t1 (a int, b int, c int);
insert into t1 values (1,1,1),(2,2,2);
create table t2 as select * from t1;
insert into t2 select * from t2;
create table t3 as select * from t2;
insert into t3 select * from t3;
--echo # Check how HAVING is printed
explain
select
a,b, count(*)
from t1
where a=3
group by b,b
having a+b < 10;
select
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
from
information_schema.optimizer_trace;
--echo # Check ON expression
explain
select
*
from t1 left join t2 on t2.a=t1.a and t2.a<3
where
t1.b > 5555;
select
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
from
information_schema.optimizer_trace;
--echo # Check nested ON expression
explain
select
*
from t1 left join (t2,t3) on t2.a=t1.a and t3.a=t2.a and t3.a + t2.a <1000
where
t1.b > 5555;
select
json_detailed(json_extract(trace, '$**.substitute_best_equal'))
from
information_schema.optimizer_trace;
drop table t1,t2,t3;
set optimizer_trace='enabled=off';
......@@ -229,9 +229,14 @@ explain select * from t1 where a=1 or b=1 {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.a = 1 or t1.b = 1"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.a = 1 or t1.b = 1",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......
......@@ -234,9 +234,14 @@ explain select * from t1 where pk1 != 0 and key1 = 1 {
{
"best_join_order": ["t1"]
},
{
"substitute_best_equal": {
"condition": "WHERE",
"resulting_condition": "t1.key1 = 1 and t1.pk1 <> 0"
}
},
{
"attaching_conditions_to_tables": {
"original_condition": "t1.key1 = 1 and t1.pk1 <> 0",
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......
......@@ -117,7 +117,6 @@ select * from db1.t1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......@@ -240,7 +239,6 @@ select * from db1.v1 {
},
{
"attaching_conditions_to_tables": {
"original_condition": null,
"attached_conditions_computation": [],
"attached_conditions_summary": [
{
......
......@@ -595,6 +595,18 @@ void Json_writer::add_table_name(const TABLE *table)
}
void trace_condition(THD * thd, const char *name, const char *transform_type,
Item *item, const char *table_name)
{
Json_writer_object trace_wrapper(thd);
Json_writer_object trace_cond(thd, transform_type);
trace_cond.add("condition", name);
if (table_name)
trace_cond.add("attached_to", table_name);
trace_cond.add("resulting_condition", item);
}
void add_table_scan_values_to_trace(THD *thd, JOIN_TAB *tab)
{
DBUG_ASSERT(thd->trace_started());
......
......@@ -108,6 +108,10 @@ void print_final_join_order(JOIN *join);
void print_best_access_for_table(THD *thd, POSITION *pos,
enum join_type type);
void trace_condition(THD * thd, const char *name, const char *transform_type,
Item *item, const char *table_name= nullptr);
/*
Security related (need to add a proper comment here)
*/
......
......@@ -2408,6 +2408,10 @@ int JOIN::optimize_stage2()
DBUG_RETURN(1);
}
conds->update_used_tables();
if (unlikely(thd->trace_started()))
trace_condition(thd, "WHERE", "substitute_best_equal", conds);
DBUG_EXECUTE("where",
print_where(conds,
"after substitute_best_equal",
......@@ -2424,7 +2428,12 @@ int JOIN::optimize_stage2()
DBUG_RETURN(1);
}
if (having)
{
having->update_used_tables();
if (unlikely(thd->trace_started()))
trace_condition(thd, "HAVING", "substitute_best_equal", having);
}
DBUG_EXECUTE("having",
print_where(having,
"after substitute_best_equal",
......@@ -2451,6 +2460,11 @@ int JOIN::optimize_stage2()
DBUG_RETURN(1);
}
(*tab->on_expr_ref)->update_used_tables();
if (unlikely(thd->trace_started()))
{
trace_condition(thd, "ON expr", "substitute_best_equal",
(*tab->on_expr_ref), tab->table->alias.c_ptr());
}
}
}
......@@ -11479,7 +11493,6 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
*/
Json_writer_object trace_wrapper(thd);
Json_writer_object trace_conditions(thd, "attaching_conditions_to_tables");
trace_conditions.add("original_condition", cond);
Json_writer_array trace_attached_comp(thd,
"attached_conditions_computation");
uint i;
......
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