mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Bug#38499: flush tables and multitable table update with
derived table cause crash When a multi-UPDATE command fails to lock some table, and subsequently succeeds, the tables need to be reopened if they were altered. But the reopening procedure failed for derived tables. Extra cleanup has been added.
This commit is contained in:
@@ -400,4 +400,206 @@ while ($i) {
|
||||
--connection default
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
#
|
||||
# Bug#38499: flush tables and multitable table update with derived table cause
|
||||
# crash
|
||||
#
|
||||
|
||||
CREATE TABLE t1( a INT, b INT );
|
||||
INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4);
|
||||
|
||||
--echo # 1. test regular tables
|
||||
--echo # 1.1. test altering of columns that multiupdate doesn't use
|
||||
--echo # 1.1.1. normal mode
|
||||
|
||||
--disable_query_log
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
--dec $i
|
||||
|
||||
--connection writer
|
||||
send UPDATE t1, (SELECT 1 FROM t1 t1i) d SET a = 0 WHERE 1=0;
|
||||
|
||||
--connection locker
|
||||
ALTER TABLE t1 ADD COLUMN (c INT);
|
||||
ALTER TABLE t1 DROP COLUMN c;
|
||||
|
||||
--connection writer
|
||||
--reap
|
||||
}
|
||||
|
||||
--echo # 1.1.2. PS mode
|
||||
|
||||
--connection writer
|
||||
PREPARE stmt FROM 'UPDATE t1, (SELECT 1 FROM t1 t1i) d SET a = 0 WHERE 1=0';
|
||||
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
--dec $i
|
||||
|
||||
--connection writer
|
||||
--send EXECUTE stmt
|
||||
|
||||
--connection locker
|
||||
ALTER TABLE t1 ADD COLUMN (c INT);
|
||||
ALTER TABLE t1 DROP COLUMN c;
|
||||
|
||||
--connection writer
|
||||
--reap
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--echo # 1.2. test altering of columns that multiupdate uses
|
||||
--echo # 1.2.1. normal mode
|
||||
|
||||
--connection default
|
||||
|
||||
--disable_query_log
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
dec $i;
|
||||
|
||||
--connection locker
|
||||
--error 0,1060
|
||||
ALTER TABLE t1 ADD COLUMN a int(11) unsigned default NULL;
|
||||
UPDATE t1 SET a=b;
|
||||
|
||||
--connection writer
|
||||
--send UPDATE t1, (SELECT 1 FROM t1 t1i) d SET a = 0 WHERE 1=0;
|
||||
|
||||
--connection locker
|
||||
--error 0,1091
|
||||
ALTER TABLE t1 DROP COLUMN a;
|
||||
|
||||
--connection writer
|
||||
--error 0,1054 # unknown column error
|
||||
--reap
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--echo # 1.2.2. PS mode
|
||||
|
||||
--disable_query_log
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
dec $i;
|
||||
|
||||
--connection locker
|
||||
--error 0,1060
|
||||
ALTER TABLE t1 ADD COLUMN a INT;
|
||||
UPDATE t1 SET a=b;
|
||||
|
||||
--connection writer
|
||||
PREPARE stmt FROM 'UPDATE t1, (SELECT 1 FROM t1 t1i) d SET a = 0 WHERE 1=0';
|
||||
--send EXECUTE stmt
|
||||
|
||||
--connection locker
|
||||
--error 0,1091
|
||||
ALTER TABLE t1 DROP COLUMN a;
|
||||
|
||||
--connection writer
|
||||
--error 0,1054 # Unknown column 'a' in 'field list'
|
||||
--reap
|
||||
}
|
||||
--enable_query_log
|
||||
--connection default
|
||||
ALTER TABLE t1 ADD COLUMN a INT;
|
||||
|
||||
--echo # 2. test UNIONs
|
||||
--echo # 2.1. test altering of columns that multiupdate doesn't use
|
||||
--echo # 2.1.1. normal mode
|
||||
|
||||
--disable_query_log
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
--dec $i
|
||||
|
||||
--connection writer
|
||||
send UPDATE t1, ((SELECT 1 FROM t1 t1i) UNION (SELECT 2 FROM t1 t1ii)) e SET a = 0 WHERE 1=0;
|
||||
|
||||
--connection locker
|
||||
ALTER TABLE t1 ADD COLUMN (c INT);
|
||||
ALTER TABLE t1 DROP COLUMN c;
|
||||
|
||||
--connection writer
|
||||
--reap
|
||||
}
|
||||
|
||||
--echo # 2.1.2. PS mode
|
||||
|
||||
--connection writer
|
||||
PREPARE stmt FROM 'UPDATE t1, ((SELECT 1 FROM t1 t1i) UNION (SELECT 2 FROM t1 t1ii)) e SET a = 0 WHERE 1=0';
|
||||
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
--dec $i
|
||||
|
||||
--connection writer
|
||||
--send EXECUTE stmt
|
||||
|
||||
--connection locker
|
||||
ALTER TABLE t1 ADD COLUMN (c INT);
|
||||
ALTER TABLE t1 DROP COLUMN c;
|
||||
|
||||
--connection writer
|
||||
--reap
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--echo # 2.2. test altering of columns that multiupdate uses
|
||||
--echo # 2.2.1. normal mode
|
||||
|
||||
--connection default
|
||||
|
||||
--disable_query_log
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
dec $i;
|
||||
|
||||
--connection locker
|
||||
--error 0,1060
|
||||
ALTER TABLE t1 ADD COLUMN a int(11) unsigned default NULL;
|
||||
UPDATE t1 SET a=b;
|
||||
|
||||
--connection writer
|
||||
--send UPDATE t1, ((SELECT 1 FROM t1 t1i) UNION (SELECT 2 FROM t1 t1ii)) e SET a = 0 WHERE 1=0;
|
||||
|
||||
--connection locker
|
||||
--error 0,1091
|
||||
ALTER TABLE t1 DROP COLUMN a;
|
||||
|
||||
--connection writer
|
||||
--error 0,1054 # Unknown column 'a' in 'field list'
|
||||
--reap
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--echo # 2.2.2. PS mode
|
||||
|
||||
--disable_query_log
|
||||
let $i = 100;
|
||||
while ($i) {
|
||||
dec $i;
|
||||
|
||||
--connection locker
|
||||
--error 0,1060
|
||||
ALTER TABLE t1 ADD COLUMN a INT;
|
||||
UPDATE t1 SET a=b;
|
||||
|
||||
--connection writer
|
||||
PREPARE stmt FROM 'UPDATE t1, ((SELECT 1 FROM t1 t1i) UNION (SELECT 2 FROM t1 t1ii)) e SET a = 0 WHERE 1=0';
|
||||
--send EXECUTE stmt
|
||||
|
||||
--connection locker
|
||||
--error 0,1091
|
||||
ALTER TABLE t1 DROP COLUMN a;
|
||||
|
||||
--connection writer
|
||||
--error 0,1054 # Unknown column 'a' in 'field list'
|
||||
--reap
|
||||
}
|
||||
--enable_query_log
|
||||
--connection default
|
||||
DROP TABLE t1;
|
||||
|
||||
# End of 5.0 tests
|
||||
|
||||
Reference in New Issue
Block a user