summaryrefslogtreecommitdiff
path: root/sql/sql_explain.cc
diff options
context:
space:
mode:
authorOleg Smirnov <olernov@gmail.com>2022-04-13 19:56:34 +0700
committerOleg Smirnov <olernov@gmail.com>2022-04-14 15:37:28 +0700
commitd0977480e3f49083eeb282ae3938ab74415a20ee (patch)
tree1c4750497542b7c7da872b10737dcb11ec74f4b9 /sql/sql_explain.cc
parente98013cb5c3695729114a56e1181b23c69801ae0 (diff)
downloadmariadb-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.cc38
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++)