summaryrefslogtreecommitdiff
path: root/mysql-test/main/alter_table_online_debug.result
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2023-03-22 23:31:15 +0300
committerNikita Malyavin <nikitamalyavin@gmail.com>2023-05-05 16:12:00 +0300
commit843872f1dd435629172dcdc055ff53647fa7822b (patch)
tree5a0a5099ae7c5b988f25c17ba6e5739961374b13 /mysql-test/main/alter_table_online_debug.result
parente6b134552b672f33940ebd1b9853d0365b7fae69 (diff)
downloadmariadb-git-843872f1dd435629172dcdc055ff53647fa7822b.tar.gz
MDEV-30902 Server crash in LEX::first_lists_tables_same
ONLINE ALTER TABLE uses binlog events like the replication does. Before it was never used outside of replication, so significant change was required. For example, a single event had a statement-like befavior: it locked the tables, opened it, and closed them in the end. But for ONLINE ALTER we use preopened table. A crash scenario is following: lex->query_tables was set to NULL in restore_empty_query_table_list when alter event is applied. Then lex->query_tables->prev_global was write-accessed in LEX::first_lists_tables_same, leading to a segfault. In replication restore_empty_query_table_list would mean resetting lex before next query or event. In ONLINE ALTER TABLE we reuse a locked table between the events, so we should avoid it. Here the need to reset lex state (or close the tables) can be determined by nonzero rgi->tables_to_lock_count. If no table is locked, then event doesn't own the tables. The same was already done before for rgi->slave_close_thread_tables call.
Diffstat (limited to 'mysql-test/main/alter_table_online_debug.result')
-rw-r--r--mysql-test/main/alter_table_online_debug.result18
1 files changed, 18 insertions, 0 deletions
diff --git a/mysql-test/main/alter_table_online_debug.result b/mysql-test/main/alter_table_online_debug.result
index bb61566c61f..c1ffcfb9c31 100644
--- a/mysql-test/main/alter_table_online_debug.result
+++ b/mysql-test/main/alter_table_online_debug.result
@@ -976,6 +976,8 @@ insert into t values (3);
set debug_sync= 'now signal goforit';
xa end 'xid';
xa commit 'xid' one phase;
+connection con1;
+connection default;
drop table t;
set debug_sync= reset;
#
@@ -1158,5 +1160,21 @@ set debug_sync= reset;
set debug_dbug= @old_debug;
connection default;
#
+# MDEV-30902 Server crash in LEX::first_lists_tables_same
+#
+create table t1 engine=myisam select 1 as x ;
+create procedure p() alter table t1 engine=heap;
+set debug_sync= 'alter_table_copy_end signal ended wait_for end';
+call p;
+connection con1;
+set debug_sync= 'now wait_for ended';
+insert into t1 values (2);
+set debug_sync= 'now signal end';
+connection default;
+call p;
+drop table t1;
+drop procedure p;
+set debug_sync=reset;
+#
# End of 10.10 tests
#