diff options
author | Oleg Smirnov <olernov@gmail.com> | 2022-04-13 19:56:34 +0700 |
---|---|---|
committer | Oleg Smirnov <olernov@gmail.com> | 2022-04-14 15:37:28 +0700 |
commit | d0977480e3f49083eeb282ae3938ab74415a20ee (patch) | |
tree | 1c4750497542b7c7da872b10737dcb11ec74f4b9 /sql/sql_explain.cc | |
parent | e98013cb5c3695729114a56e1181b23c69801ae0 (diff) | |
download | mariadb-git-bb-10.9-MDEV-27699.tar.gz |
MDEV-27699 ANALYZE FORMAT=JSON fields are incorrect for UNION ALL queriesbb-10.9-MDEV-27699
UNION ALL queries are a subject of optimization introduced in MDEV-334
when creation of a temporary table is skipped.
While there is a check for this optimization in Explain_union::print_explain()
there was no such in Explain_union::print_explain_json(). This resulted in
printing irrelevant data like:
"union_result": {
"table_name": "<union2,3>",
"access_type": "ALL",
"r_loops": 0,
"r_rows": null
in case when creation of the temporary table was actually optimized out.
This commits adds a check whether the temporary table was actually created
during the UNION ALL processing and eliminates printing of the irrelevant data.
Diffstat (limited to 'sql/sql_explain.cc')
-rw-r--r-- | sql/sql_explain.cc | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index 4fd4e6d3b77..3cee9bbb2c5 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -606,27 +606,29 @@ void Explain_union::print_explain_json(Explain_query *query, else writer->add_member("union_result").start_object(); - // using_temporary_table - make_union_table_name(table_name_buffer); - writer->add_member("table_name").add_str(table_name_buffer); - writer->add_member("access_type").add_str("ALL"); // not very useful - - /* r_loops (not present in tabular output) */ - if (is_analyze) + if (using_tmp) { - writer->add_member("r_loops").add_ll(fake_select_lex_tracker.get_loops()); - } + make_union_table_name(table_name_buffer); + writer->add_member("table_name").add_str(table_name_buffer); + writer->add_member("access_type").add_str("ALL"); // not very useful - /* `r_rows` */ - if (is_analyze) - { - writer->add_member("r_rows"); - if (fake_select_lex_tracker.has_scans()) - writer->add_double(fake_select_lex_tracker.get_avg_rows()); - else - writer->add_null(); - } + /* r_loops (not present in tabular output) */ + if (is_analyze) + { + writer->add_member("r_loops").add_ll( + fake_select_lex_tracker.get_loops()); + } + /* `r_rows` */ + if (is_analyze) + { + writer->add_member("r_rows"); + if (fake_select_lex_tracker.has_scans()) + writer->add_double(fake_select_lex_tracker.get_avg_rows()); + else + writer->add_null(); + } + } writer->add_member("query_specifications").start_array(); for (int i= 0; i < (int) union_members.elements(); i++) |