From 2b475b567e93c9a2438a835f2236ec3672e7769c Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 8 Apr 2015 03:33:48 +0300 Subject: [PATCH] MDEV-7927: Server crashes in in Time_and_counter_tracker::incr_loops - JOIN::save_explain_data should also set JOIN::tracker (it already sets join_tab[0].tracker). This is needed for UNIONs inside subqueries. --- mysql-test/r/explain_json.result | 12 ++++++++++++ mysql-test/t/explain_json.test | 8 ++++++++ sql/sql_select.cc | 4 +++- 3 files changed, 23 insertions(+), 1 deletion(-) 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; } }