diff --git a/mysql-test/r/explain_json.result b/mysql-test/r/explain_json.result index 61d61323cb6..e1a09b82eff 100644 --- a/mysql-test/r/explain_json.result +++ b/mysql-test/r/explain_json.result @@ -894,3 +894,15 @@ EXPLAIN } } DROP TABLE t1, t2; +# +# MDEV-7927: Server crashes in in Time_and_counter_tracker::incr_loops +# +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2); +EXPLAIN SELECT * FROM t1 WHERE 3 IN ( SELECT 4 UNION SELECT 5 ); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +DROP TABLE t1; diff --git a/mysql-test/t/explain_json.test b/mysql-test/t/explain_json.test index 7fc1f568cec..4ca16c8c03c 100644 --- a/mysql-test/t/explain_json.test +++ b/mysql-test/t/explain_json.test @@ -200,3 +200,11 @@ INSERT INTO t2 VALUES (3),(4); EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE a <> ALL ( SELECT b FROM t2 ); DROP TABLE t1, t2; +--echo # +--echo # MDEV-7927: Server crashes in in Time_and_counter_tracker::incr_loops +--echo # +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2); +EXPLAIN SELECT * FROM t1 WHERE 3 IN ( SELECT 4 UNION SELECT 5 ); +DROP TABLE t1; + diff --git a/sql/sql_select.cc b/sql/sql_select.cc index dd9b8bd4ac4..207bee922e8 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2376,8 +2376,10 @@ void JOIN::save_explain_data(Explain_query *output, bool can_overwrite, This is fake_select_lex. It has no query plan, but we need to set up a tracker for ANALYZE */ - Explain_union *eu= output->get_union(select_lex->master_unit()->first_select()->select_number); + uint nr= select_lex->master_unit()->first_select()->select_number; + Explain_union *eu= output->get_union(nr); join_tab[0].tracker= eu->get_fake_select_lex_tracker(); + tracker= &eu->time_tracker; } }