mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
192bafe526
(pre fts)
361 lines
12 KiB
Text
361 lines
12 KiB
Text
#
|
|
# Bug 42074 concurrent optimize table and
|
|
# alter table = Assertion failed: thd->is_error()
|
|
#
|
|
DROP TABLE IF EXISTS t1;
|
|
# Create InnoDB table
|
|
CREATE TABLE t1 (id INT) engine=innodb;
|
|
# Connection 1
|
|
# Start optimizing table
|
|
SET DEBUG_SYNC='ha_admin_try_alter SIGNAL optimize_started WAIT_FOR table_altered';
|
|
OPTIMIZE TABLE t1;
|
|
# Connection 2
|
|
# Change table to engine=memory
|
|
SET DEBUG_SYNC='now WAIT_FOR optimize_started';
|
|
ALTER TABLE t1 engine=memory;
|
|
SET DEBUG_SYNC='now SIGNAL table_altered';
|
|
# Connection 1
|
|
# Complete optimization
|
|
Table Op Msg_type Msg_text
|
|
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
|
test.t1 optimize error Got error -1 "Internal error < 0 (Not system error)" from storage engine MEMORY
|
|
test.t1 optimize status Operation failed
|
|
Warnings:
|
|
Error 1030 Got error -1 "Internal error < 0 (Not system error)" from storage engine MEMORY
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC='RESET';
|
|
#
|
|
# Bug#47459 Assertion in Diagnostics_area::set_eof_status on
|
|
# OPTIMIZE TABLE
|
|
#
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TABLE t1(a INT) ENGINE= InnoDB;
|
|
# Connection con1
|
|
SET DEBUG_SYNC= "ha_admin_open_ltable SIGNAL opening WAIT_FOR dropped";
|
|
# Sending:
|
|
OPTIMIZE TABLE t1;
|
|
# Connection default
|
|
SET DEBUG_SYNC= "now WAIT_FOR opening";
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC= "now SIGNAL dropped";
|
|
# Connection con1
|
|
# Reaping: OPTIMIZE TABLE t1
|
|
Table Op Msg_type Msg_text
|
|
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
|
test.t1 optimize error Table 'test.t1' doesn't exist
|
|
test.t1 optimize status Operation failed
|
|
Warnings:
|
|
Error 1146 Table 'test.t1' doesn't exist
|
|
# Connection default
|
|
SET DEBUG_SYNC= "RESET";
|
|
#
|
|
# Bug#53757 assert in mysql_truncate_by_delete
|
|
#
|
|
DROP TABLE IF EXISTS t1, t2;
|
|
CREATE TABLE t1(a INT) Engine=InnoDB;
|
|
CREATE TABLE t2(id INT);
|
|
INSERT INTO t1 VALUES (1), (2);
|
|
INSERT INTO t2 VALUES(connection_id());
|
|
SET DEBUG_SYNC= "open_and_process_table SIGNAL opening WAIT_FOR killed";
|
|
# Sending: (not reaped since connection is killed later)
|
|
TRUNCATE t1;
|
|
SET DEBUG_SYNC= "now WAIT_FOR opening";
|
|
SELECT ((@id := id) - id) FROM t2;
|
|
((@id := id) - id)
|
|
0
|
|
KILL @id;
|
|
SET DEBUG_SYNC= "now SIGNAL killed";
|
|
DROP TABLE t1, t2;
|
|
SET DEBUG_SYNC= "RESET";
|
|
#
|
|
# Bug#58933 Assertion `thd- >is_error()' fails on shutdown with ongoing
|
|
# OPTIMIZE TABLE
|
|
#
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (1), (2);
|
|
# Connection con1
|
|
SET DEBUG_SYNC= 'ha_admin_open_ltable SIGNAL waiting WAIT_FOR killed';
|
|
# Sending:
|
|
OPTIMIZE TABLE t1;
|
|
# Connection default
|
|
SET DEBUG_SYNC= 'now WAIT_FOR waiting';
|
|
KILL QUERY ID;
|
|
SET DEBUG_SYNC= 'now SIGNAL killed';
|
|
# Connection con1
|
|
# Reaping: OPTIMIZE TABLE t1
|
|
Table Op Msg_type Msg_text
|
|
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
|
test.t1 optimize status Operation failed
|
|
# Connection default
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC= 'RESET';
|
|
#
|
|
# Bug#42230 during add index, cannot do queries on storage engines
|
|
# that implement add_index
|
|
#
|
|
DROP DATABASE IF EXISTS db1;
|
|
DROP TABLE IF EXISTS t1;
|
|
# Test 1: Secondary index, should not block reads (original test case).
|
|
# Connection default
|
|
CREATE DATABASE db1;
|
|
CREATE TABLE db1.t1(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value INT) engine=innodb;
|
|
INSERT INTO db1.t1(value) VALUES (1), (2);
|
|
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
|
|
# Sending:
|
|
ALTER TABLE db1.t1 ADD INDEX(value);
|
|
# Connection con1
|
|
SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
USE db1;
|
|
SELECT * FROM t1;
|
|
id value
|
|
1 1
|
|
2 2
|
|
SET DEBUG_SYNC= "now SIGNAL query";
|
|
# Connection default
|
|
# Reaping: ALTER TABLE db1.t1 ADD INDEX(value)
|
|
DROP DATABASE db1;
|
|
# Test 2: Primary index (implicit), should block writes.
|
|
CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb;
|
|
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
|
|
# Sending:
|
|
ALTER TABLE t1 ADD UNIQUE INDEX(a), LOCK=SHARED;
|
|
# Connection con1
|
|
SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
USE test;
|
|
SELECT * FROM t1;
|
|
a b
|
|
# Sending:
|
|
UPDATE t1 SET a=NULL;
|
|
# Connection con2
|
|
# Waiting for SELECT to be blocked by the metadata lock on t1
|
|
SET DEBUG_SYNC= "now SIGNAL query";
|
|
# Connection default
|
|
# Reaping: ALTER TABLE t1 ADD UNIQUE INDEX(a)
|
|
# Connection con1
|
|
# Reaping: UPDATE t1 SET a=NULL
|
|
# Test 3: Primary index (explicit), should block writes.
|
|
# Connection default
|
|
ALTER TABLE t1 DROP INDEX a;
|
|
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
|
|
# Sending:
|
|
ALTER TABLE t1 ADD PRIMARY KEY (a), LOCK=SHARED;
|
|
# Connection con1
|
|
SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
SELECT * FROM t1;
|
|
a b
|
|
# Sending:
|
|
UPDATE t1 SET a=NULL;
|
|
# Connection con2
|
|
# Waiting for SELECT to be blocked by the metadata lock on t1
|
|
SET DEBUG_SYNC= "now SIGNAL query";
|
|
# Connection default
|
|
# Reaping: ALTER TABLE t1 ADD PRIMARY KEY (a)
|
|
# Connection con1
|
|
# Reaping: UPDATE t1 SET a=NULL
|
|
# Test 4: Secondary unique index, should not block reads.
|
|
# Connection default
|
|
SET DEBUG_SYNC= "alter_table_inplace_after_lock_downgrade SIGNAL manage WAIT_FOR query";
|
|
# Sending:
|
|
ALTER TABLE t1 ADD UNIQUE (b);
|
|
# Connection con1
|
|
SET DEBUG_SYNC= "now WAIT_FOR manage";
|
|
SELECT * FROM t1;
|
|
a b
|
|
SET DEBUG_SYNC= "now SIGNAL query";
|
|
# Connection default
|
|
# Reaping: ALTER TABLE t1 ADD UNIQUE (b)
|
|
SET DEBUG_SYNC= "RESET";
|
|
DROP TABLE t1;
|
|
#
|
|
# Bug#11853126 RE-ENABLE CONCURRENT READS WHILE CREATING SECONDARY INDEX
|
|
# IN INNODB
|
|
#
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL) engine=innodb;
|
|
INSERT INTO t1 VALUES (1, 12345), (2, 23456);
|
|
# Connection con1
|
|
SET SESSION debug_dbug= "+d,alter_table_rollback_new_index";
|
|
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
|
ERROR HY000: Unknown error
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 12345
|
|
2 23456
|
|
# Connection default
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 12345
|
|
2 23456
|
|
DROP TABLE t1;
|
|
#
|
|
# Bug#13417754 ASSERT IN ROW_DROP_DATABASE_FOR_MYSQL DURING DROP SCHEMA
|
|
#
|
|
DROP TABLE IF EXISTS t1;
|
|
DROP DATABASE IF EXISTS db1;
|
|
CREATE TABLE t1(a int) engine=InnoDB;
|
|
CREATE DATABASE db1;
|
|
# Connection con1
|
|
SET DEBUG_SYNC= 'after_innobase_rename_table SIGNAL locked WAIT_FOR continue';
|
|
# Sending:
|
|
ALTER TABLE t1 RENAME db1.t1;
|
|
# Connection con2
|
|
SET DEBUG_SYNC= 'now WAIT_FOR locked';
|
|
# DROP DATABASE db1 should now be blocked by ALTER TABLE
|
|
# Sending:
|
|
DROP DATABASE db1;
|
|
# Connection default
|
|
# Check that DROP DATABASE is blocked by IX lock on db1
|
|
# Resume ALTER TABLE
|
|
SET DEBUG_SYNC= 'now SIGNAL continue';
|
|
# Connection con1
|
|
# Reaping: ALTER TABLE t1 RENAME db1.t1;
|
|
# Connection con2
|
|
# Reaping: DROP DATABASE db1
|
|
# Connection default;
|
|
SET DEBUG_SYNC= 'RESET';
|
|
#
|
|
# WL#5534 Online ALTER, Phase 1
|
|
#
|
|
# Multi thread tests.
|
|
# See alter_table.test for single thread tests.
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TABLE t1(a INT PRIMARY KEY, b INT) engine=InnoDB;
|
|
INSERT INTO t1 VALUES (1,1), (2,2);
|
|
SET DEBUG_SYNC= 'RESET';
|
|
SET SESSION lock_wait_timeout= 1;
|
|
#
|
|
# 1: In-place + writes blocked.
|
|
#
|
|
# Connection default
|
|
SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
|
|
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
|
|
SET DEBUG_SYNC= 'alter_table_inplace_before_commit SIGNAL beforecommit WAIT_FOR continue3';
|
|
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue4';
|
|
# Sending:
|
|
ALTER TABLE t1 ADD INDEX i1(b), ALGORITHM= INPLACE, LOCK= SHARED;
|
|
# Connection con1;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR opened';
|
|
# At this point, neither reads nor writes should be blocked.
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
INSERT INTO t1 VALUES (3,3);
|
|
SET DEBUG_SYNC= 'now SIGNAL continue1';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
|
|
# Now both reads and writes should be blocked
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (4,4);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue2';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR beforecommit';
|
|
# Still both reads and writes should be blocked.
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (5,5);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue3';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
|
|
# Same here.
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (6,6);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue4';
|
|
# Connection default
|
|
# Reaping ALTER TABLE ...
|
|
SET DEBUG_SYNC= 'RESET';
|
|
DELETE FROM t1 WHERE a= 3;
|
|
#
|
|
# 2: Copy + writes blocked.
|
|
#
|
|
SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
|
|
SET DEBUG_SYNC= 'alter_table_copy_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
|
|
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue3';
|
|
# Sending:
|
|
ALTER TABLE t1 ADD INDEX i2(b), ALGORITHM= COPY, LOCK= SHARED;
|
|
# Connection con1;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR opened';
|
|
# At this point, neither reads nor writes should be blocked.
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
INSERT INTO t1 VALUES (3,3);
|
|
SET DEBUG_SYNC= 'now SIGNAL continue1';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
|
|
# Now writes should be blocked, reads still allowed.
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
INSERT INTO t1 VALUES (4,4);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue2';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
|
|
# Now both reads and writes should be blocked.
|
|
SELECT * FROM t1 limit 1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (5,5);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue3';
|
|
# Connection default
|
|
# Reaping ALTER TABLE ...
|
|
Warnings:
|
|
Note 1831 Duplicate index 'i2' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release.
|
|
SET DEBUG_SYNC= 'RESET';
|
|
DELETE FROM t1 WHERE a= 3;
|
|
#
|
|
# 3: In-place + writes allowed.
|
|
#
|
|
# TODO: Enable this test once WL#5526 is pushed
|
|
#
|
|
# 4: In-place + reads and writes blocked.
|
|
#
|
|
# Connection default
|
|
SET DEBUG_SYNC= 'alter_opened_table SIGNAL opened WAIT_FOR continue1';
|
|
SET DEBUG_SYNC= 'alter_table_inplace_after_lock_upgrade SIGNAL upgraded WAIT_FOR continue2';
|
|
SET DEBUG_SYNC= 'alter_table_inplace_before_commit SIGNAL beforecommit WAIT_FOR continue3';
|
|
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL binlog WAIT_FOR continue4';
|
|
# Sending:
|
|
ALTER TABLE t1 ADD INDEX i4(b), ALGORITHM= INPLACE, LOCK= EXCLUSIVE;
|
|
# Connection con1;
|
|
SET DEBUG_SYNC= 'now WAIT_FOR opened';
|
|
# At this point, neither reads nor writes should be blocked.
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
INSERT INTO t1 VALUES (3,3);
|
|
SET DEBUG_SYNC= 'now SIGNAL continue1';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR upgraded';
|
|
# Now both reads and writes should be blocked.
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (4,4);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue2';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR beforecommit';
|
|
# Same here.
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (5,5);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue3';
|
|
SET DEBUG_SYNC= 'now WAIT_FOR binlog';
|
|
# Same here.
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
INSERT INTO t1 VALUES (6,6);
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
SET DEBUG_SYNC= 'now SIGNAL continue4';
|
|
# Connection default
|
|
# Reaping ALTER TABLE ...
|
|
Warnings:
|
|
Note 1831 Duplicate index 'i4' defined on the table 'test.t1'. This is deprecated and will be disallowed in a future release.
|
|
SET DEBUG_SYNC= 'RESET';
|
|
DROP TABLE t1;
|
|
SET DEBUG_SYNC= 'RESET';
|