mariadb/mysql-test/t/explain_slowquerylog.test
Sergei Golubchik 1cc67e090e MDEV-16153 Server crashes in Apc_target::disable, ASAN heap-use-after-free in Explain_query::~Explain_query upon/after EXECUTE IMMEDIATE
Explain_query must be created in the execution arena.
But JOIN::optimize_inner temporarily switches to the statement arena
under `if (sel->first_cond_optimization)`. This might cause
Explain_query to be allocated in the statement arena. Usually it is
harmless (although technically incorrect and a waste of memory), but
in case of EXECUTE IMMEDIATE, Prepared_statement object and its
statement arena are destroyed before log_slow_statement() call,
which uses Explain_query.

Fix:
1. Create Explain_query before switching arenas.
2. Before filling earlier-created Explain_query with data, set
thd->mem_root from the Explain_query::mem_root
2018-05-19 22:12:39 +02:00

69 lines
1.8 KiB
Text

#
# This is a test for EXPLAINs being written into slow query log.
# For now, we just run the queries and hope not to crash.
#
#
--disable_warnings
drop table if exists t0,t1;
--enable_warnings
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
explain select * from t0 where a < 3;
--echo #
--echo # MDEV-5045: Server crashes in QPF_query::print_explain with log_slow_verbosity='query_plan,explain'
--echo #
set autocommit=1;
drop table t0;
--echo #
--echo # MDEV-5047 virtual THD::~THD(): Assertion `status_var.memory_used == 0' fails on disconnect
--echo #
--connect (con1,localhost,root,,)
--error ER_NO_SUCH_TABLE
ALTER TABLE nonexisting ENABLE KEYS;
SHOW WARNINGS;
--disconnect con1
--connection default
SELECT 1;
--echo #
--echo # MDEV-5060 Server crashes on EXPLAIN EXTENDED or EXPLAIN PARTITIONS with explain in slow_log
--echo #
EXPLAIN PARTITIONS SELECT 1 ;
--echo #
--echo # MDEV-5106: Server crashes in Explain_union::print_explain on ER_TOO_BIG_SELECT with explain in slow log
--echo #
CREATE TABLE t1 (i INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SET max_join_size = 10;
--error ER_TOO_BIG_SELECT
( SELECT ta.* FROM t1 ta, t1 tb ) UNION ( SELECT * FROM t1 );
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;
#
# MDEV-16153 Server crashes in Apc_target::disable, ASAN heap-use-after-free in Explain_query::~Explain_query upon/after EXECUTE IMMEDIATE
#
create table t1 (a int);
execute immediate "select * from t1 join t1 t2 on (t1.a>5) where exists (select 1)";
drop table t1;