From bcd854fe337c9847455be6648038d9b218df8175 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Thu, 21 Nov 2013 16:29:46 +0400 Subject: [PATCH] MDEV-5308 Crash when running with slow_query_log=1 - Make log_slow_statement() always call delete_explain_query(). --- mysql-test/r/explain_slowquerylog.result | 12 ++++++++++++ mysql-test/t/explain_slowquerylog.test | 14 ++++++++++++++ sql/sql_parse.cc | 8 ++++---- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/explain_slowquerylog.result b/mysql-test/r/explain_slowquerylog.result index 9d25cf06275..8acbdc69a4c 100644 --- a/mysql-test/r/explain_slowquerylog.result +++ b/mysql-test/r/explain_slowquerylog.result @@ -39,3 +39,15 @@ SELECT 'Server still alive?' as 'Yes'; Yes Server still alive? DROP TABLE t1; +# +# MDEV-5308 Crash when running with slow_query_log=1 +# +SET @save1= @@log_slow_rate_limit; +SET @save2= @@long_query_time; +SET log_slow_rate_limit=1000; +SET long_query_time=0.000001; +SELECT 1; +1 +1 +SET log_slow_rate_limit=@save1; +SET long_query_time=@save2; diff --git a/mysql-test/t/explain_slowquerylog.test b/mysql-test/t/explain_slowquerylog.test index 8c8be555640..6503a326eb8 100644 --- a/mysql-test/t/explain_slowquerylog.test +++ b/mysql-test/t/explain_slowquerylog.test @@ -47,3 +47,17 @@ SET max_join_size = 10; SELECT 'Server still alive?' as 'Yes'; DROP TABLE t1; + +--echo # +--echo # MDEV-5308 Crash when running with slow_query_log=1 +--echo # +SET @save1= @@log_slow_rate_limit; +SET @save2= @@long_query_time; + +SET log_slow_rate_limit=1000; +SET long_query_time=0.000001; +SELECT 1; + +SET log_slow_rate_limit=@save1; +SET long_query_time=@save2; + diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9ad1282d8ec..fccc012429c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1554,7 +1554,7 @@ void log_slow_statement(THD *thd) statement in a trigger or stored function */ if (unlikely(thd->in_sub_stmt)) - DBUG_VOID_RETURN; // Don't set time for sub stmt + goto end; // Don't set time for sub stmt /* Follow the slow log filter configuration. */ @@ -1562,8 +1562,7 @@ void log_slow_statement(THD *thd) (thd->variables.log_slow_filter && !(thd->variables.log_slow_filter & thd->query_plan_flags))) { - delete_explain_query(thd->lex); - DBUG_VOID_RETURN; + goto end; } if (((thd->server_status & SERVER_QUERY_WAS_SLOW) || @@ -1580,7 +1579,7 @@ void log_slow_statement(THD *thd) */ if (thd->variables.log_slow_rate_limit > 1 && (global_query_id % thd->variables.log_slow_rate_limit) != 0) - DBUG_VOID_RETURN; + goto end; thd_proc_info(thd, "logging slow query"); slow_log_print(thd, thd->query(), thd->query_length(), @@ -1588,6 +1587,7 @@ void log_slow_statement(THD *thd) thd_proc_info(thd, 0); } +end: delete_explain_query(thd->lex); DBUG_VOID_RETURN; }