mirror of
https://github.com/MariaDB/server.git
synced 2026-05-03 13:45:34 +02:00
Merge 10.5 into 10.6
This commit is contained in:
commit
5c21cba602
12 changed files with 104 additions and 46 deletions
|
|
@ -3415,23 +3415,5 @@ ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITH
|
|||
delete from t1 where a = 11;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
|
||||
# Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
|
||||
#
|
||||
SET @max_session_mem_used_save= @@max_session_mem_used;
|
||||
CREATE TABLE t1 (a INT);
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
ALTER TABLE x MODIFY xx INT;
|
||||
ERROR 42S02: Table 'test.x' doesn't exist
|
||||
SET SESSION max_session_mem_used= 8192;
|
||||
LOCK TABLE t1 WRITE;
|
||||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;
|
||||
Warnings:
|
||||
Note 1054 Unknown column 'b' in 't1'
|
||||
SET SESSION max_session_mem_used = @max_session_mem_used_save;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 10.5 tests
|
||||
#
|
||||
|
|
|
|||
|
|
@ -2661,28 +2661,6 @@ delete from t1 where a = 11;
|
|||
# cleanup
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
|
||||
--echo # Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
|
||||
--echo #
|
||||
|
||||
SET @max_session_mem_used_save= @@max_session_mem_used;
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
SELECT * FROM t1;
|
||||
|
||||
--error ER_NO_SUCH_TABLE
|
||||
ALTER TABLE x MODIFY xx INT;
|
||||
|
||||
SET SESSION max_session_mem_used= 8192;
|
||||
LOCK TABLE t1 WRITE;
|
||||
|
||||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;
|
||||
|
||||
SET SESSION max_session_mem_used = @max_session_mem_used_save;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.5 tests
|
||||
--echo #
|
||||
|
|
|
|||
19
mysql-test/main/alter_table_lock.result
Normal file
19
mysql-test/main/alter_table_lock.result
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#
|
||||
# MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
|
||||
# Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
|
||||
#
|
||||
SET @max_session_mem_used_save= @@max_session_mem_used;
|
||||
CREATE TABLE t1 (a INT);
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
ALTER TABLE x MODIFY xx INT;
|
||||
ERROR 42S02: Table 'test.x' doesn't exist
|
||||
SET SESSION max_session_mem_used= 8192;
|
||||
LOCK TABLE t1 WRITE;
|
||||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;
|
||||
Warnings:
|
||||
Note 1054 Unknown column 'b' in 't1'
|
||||
SET SESSION max_session_mem_used = @max_session_mem_used_save;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
# End of 10.5 tests
|
||||
25
mysql-test/main/alter_table_lock.test
Normal file
25
mysql-test/main/alter_table_lock.test
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
--source include/not_msan.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
|
||||
--echo # Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
|
||||
--echo #
|
||||
|
||||
SET @max_session_mem_used_save= @@max_session_mem_used;
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
SELECT * FROM t1;
|
||||
|
||||
--error ER_NO_SUCH_TABLE
|
||||
ALTER TABLE x MODIFY xx INT;
|
||||
|
||||
SET SESSION max_session_mem_used= 8192;
|
||||
LOCK TABLE t1 WRITE;
|
||||
|
||||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;
|
||||
|
||||
SET SESSION max_session_mem_used = @max_session_mem_used_save;
|
||||
UNLOCK TABLES;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of 10.5 tests
|
||||
|
|
@ -1,4 +1,7 @@
|
|||
--source include/default_optimizer_switch.inc
|
||||
# This is too slow on MSAN
|
||||
--source include/not_msan.inc
|
||||
--source include/not_valgrind.inc
|
||||
|
||||
create table t1 (a int, b varchar(32));
|
||||
insert into t1 values
|
||||
|
|
|
|||
|
|
@ -53,9 +53,14 @@ SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
|
|||
ALTER TABLE t2 REMOVE PARTITIONING;
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
|
||||
SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter WAIT_FOR mtr_continue';
|
||||
SET DEBUG_SYNC= 'rm_table_no_locks_before_binlog SIGNAL delete_done';
|
||||
DROP TABLE IF EXISTS t2;
|
||||
# Create a new connection thread to orchestrate the ALTER and DROP
|
||||
# threads' DEBUG_SYNC points to avoid lost signals
|
||||
connect con2,localhost,root,,;
|
||||
SET DEBUG_SYNC= 'now SIGNAL mtr_continue';
|
||||
connection default;
|
||||
connection con1;
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
|
|
|||
|
|
@ -66,12 +66,27 @@ SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
|
|||
--send ALTER TABLE t2 REMOVE PARTITIONING
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
|
||||
SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter';
|
||||
|
||||
SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter WAIT_FOR mtr_continue';
|
||||
SET DEBUG_SYNC= 'rm_table_no_locks_before_binlog SIGNAL delete_done';
|
||||
DROP TABLE IF EXISTS t2;
|
||||
--send DROP TABLE IF EXISTS t2
|
||||
|
||||
--echo # Create a new connection thread to orchestrate the ALTER and DROP
|
||||
--echo # threads' DEBUG_SYNC points to avoid lost signals
|
||||
connect(con2,localhost,root,,);
|
||||
let $wait_condition= select count(*)=0 from information_schema.processlist where state like "debug sync point: alter_table_before_open_tables";
|
||||
source include/wait_condition.inc;
|
||||
SET DEBUG_SYNC= 'now SIGNAL mtr_continue';
|
||||
|
||||
# Return execution for DROP TABLE
|
||||
connection default;
|
||||
--reap
|
||||
|
||||
# Return execution for ALTER TABLE
|
||||
connection con1;
|
||||
--error ER_NO_SUCH_TABLE
|
||||
--reap
|
||||
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
disconnect con1;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
|
|
|||
|
|
@ -197,8 +197,17 @@ SET DEBUG_SYNC="now WAIT_FOR parked1_2";
|
|||
--echo ** and finally release the mutex. The threads will continue to wait
|
||||
--echo ** until a broadcast signal reaches them causing both threads to
|
||||
--echo ** come alive and check the condition.
|
||||
|
||||
# Before sending signals back-to-back, we have to ensure the previous signal
|
||||
# was received
|
||||
let $wait_condition= select count(*)=3 from information_schema.processlist where state like "%debug%";
|
||||
source include/wait_condition.inc;
|
||||
SET DEBUG_SYNC="now SIGNAL go2";
|
||||
let $wait_condition= select count(*)=2 from information_schema.processlist where state like "%debug%";
|
||||
source include/wait_condition.inc;
|
||||
SET DEBUG_SYNC="now SIGNAL go3";
|
||||
let $wait_condition= select count(*)=1 from information_schema.processlist where state like "%debug%";
|
||||
source include/wait_condition.inc;
|
||||
|
||||
--echo **
|
||||
--echo ** Finally signal the DELETE statement on THD1 one last time.
|
||||
|
|
@ -208,6 +217,8 @@ SET DEBUG_SYNC="now SIGNAL go3";
|
|||
--echo ** invalidations and a broadcast signal will be sent to the thread
|
||||
--echo ** group holding result set writers.
|
||||
SET DEBUG_SYNC="now SIGNAL go1_2";
|
||||
let $wait_condition= select count(*)=0 from information_schema.processlist where state like "%debug%";
|
||||
source include/wait_condition.inc;
|
||||
|
||||
--echo **
|
||||
--echo *************************************************************************
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
-- source include/have_64bit.inc
|
||||
# No point in running with valgrind as it takes 1.5 hours
|
||||
-- source include/not_valgrind.inc
|
||||
-- source include/not_msan.inc
|
||||
|
||||
# Save the initial number of concurrent sessions
|
||||
--source include/count_sessions.inc
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
# We are crashing the server on purpose
|
||||
--source include/not_valgrind.inc
|
||||
--source include/not_crashrep.inc
|
||||
# This often fails under MSAN builder due timing differences
|
||||
--source include/not_msan.inc
|
||||
|
||||
# The test does work with any page size, but we want to reduce the
|
||||
# test running time by limiting the combinations. The redo log format
|
||||
|
|
|
|||
|
|
@ -43,6 +43,12 @@ START SLAVE;
|
|||
SET DEBUG_SYNC= 'now WAIT_FOR parked';
|
||||
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
||||
SET DEBUG_SYNC= 'now SIGNAL continue';
|
||||
|
||||
# Ensure the last DEBUG_SYNC signal was received by the target thread before
|
||||
# reset; otherwise, the reset can drop the last signal before it gets
|
||||
# acknowledged
|
||||
let $wait_condition= select count(*)=0 from information_schema.processlist where state like "%debug%";
|
||||
source include/wait_condition.inc;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
||||
--source include/wait_for_slave_io_to_start.inc
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2014, 2021, MariaDB Corporation.
|
||||
Copyright (c) 2014, 2022, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
|
@ -465,6 +465,10 @@ static uint16_t trx_undo_header_create(buf_block_t *undo_page, trx_id_t trx_id,
|
|||
undo_page->page.frame, free);
|
||||
mtr->write<8,mtr_t::MAYBE_NOP>(*undo_page, free + TRX_UNDO_TRX_ID +
|
||||
undo_page->page.frame, trx_id);
|
||||
if (UNIV_UNLIKELY(mach_read_from_8(free + TRX_UNDO_TRX_NO +
|
||||
undo_page->page.frame)))
|
||||
mtr->memset(undo_page, free + TRX_UNDO_TRX_NO, 8, 0);
|
||||
|
||||
/* Write TRX_UNDO_NEEDS_PURGE=1 and TRX_UNDO_LOG_START. */
|
||||
mach_write_to_2(buf, 1);
|
||||
memcpy_aligned<2>(buf + 2, start, 2);
|
||||
|
|
@ -882,12 +886,19 @@ corrupted:
|
|||
sql_print_error("InnoDB: unsupported undo header state %u",
|
||||
state);
|
||||
goto corrupted;
|
||||
case TRX_UNDO_CACHED:
|
||||
if (UNIV_UNLIKELY(type != 0)) {
|
||||
/* This undo page was not updated by MariaDB
|
||||
10.3 or later. The TRX_UNDO_TRX_NO field may
|
||||
contain garbage. */
|
||||
break;
|
||||
}
|
||||
goto read_trx_no;
|
||||
case TRX_UNDO_TO_PURGE:
|
||||
if (UNIV_UNLIKELY(type == 1)) {
|
||||
goto corrupted_type;
|
||||
}
|
||||
/* fall through */
|
||||
case TRX_UNDO_CACHED:
|
||||
read_trx_no:
|
||||
trx_id_t id = mach_read_from_8(TRX_UNDO_TRX_NO + undo_header);
|
||||
if (id >> 48) {
|
||||
sql_print_error("InnoDB: corrupted TRX_NO %llx", id);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue