diff options
-rw-r--r-- | mysql-test/suite/innodb/r/alter_copy.result | 2 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/alter_crash.result | 4 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/innodb-alter-tempfile.result | 1 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/rename_table_debug.result | 9 | ||||
-rw-r--r-- | mysql-test/suite/innodb/r/truncate_crash.result | 14 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/alter_copy.test | 6 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/alter_crash.test | 46 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/innodb-alter-tempfile.test | 15 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/rename_table_debug.test | 7 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/truncate_crash.test | 22 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 6 | ||||
-rw-r--r-- | storage/innobase/row/row0mysql.cc | 6 |
12 files changed, 70 insertions, 68 deletions
diff --git a/mysql-test/suite/innodb/r/alter_copy.result b/mysql-test/suite/innodb/r/alter_copy.result index 9815560d22c..286c5152ded 100644 --- a/mysql-test/suite/innodb/r/alter_copy.result +++ b/mysql-test/suite/innodb/r/alter_copy.result @@ -183,7 +183,6 @@ CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK #sql-temporary.frm -#sql-temporary.ibd FTS_INDEX_1.ibd FTS_INDEX_2.ibd FTS_INDEX_3.ibd @@ -212,4 +211,3 @@ t.ibd t1.frm t1.ibd DROP TABLE t1,t; -DROP TABLE `#mysql50##sql-temporary`; diff --git a/mysql-test/suite/innodb/r/alter_crash.result b/mysql-test/suite/innodb/r/alter_crash.result index df1645a4ef6..3b6a5d1b39a 100644 --- a/mysql-test/suite/innodb/r/alter_crash.result +++ b/mysql-test/suite/innodb/r/alter_crash.result @@ -83,9 +83,8 @@ ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); ERROR HY000: Lost connection to MySQL server during query # Startup the server after the crash SELECT * FROM information_schema.innodb_sys_tables -WHERE name LIKE 'test/#sql-ib%'; +WHERE name LIKE 'test/#sql-%'; TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE -# Drop the orphaned rebuilt table. SHOW TABLES; Tables_in_test t2 @@ -123,7 +122,6 @@ ERROR HY000: Lost connection to MySQL server during query SELECT * FROM information_schema.innodb_sys_tables WHERE table_id = ID; TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE -FLUSH TABLES; # Files in datadir after manual recovery. t1.frm t1.ibd diff --git a/mysql-test/suite/innodb/r/innodb-alter-tempfile.result b/mysql-test/suite/innodb/r/innodb-alter-tempfile.result index b164c3c26b0..3b797559603 100644 --- a/mysql-test/suite/innodb/r/innodb-alter-tempfile.result +++ b/mysql-test/suite/innodb/r/innodb-alter-tempfile.result @@ -8,6 +8,7 @@ CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=innodb; SET debug_dbug='+d,innodb_alter_commit_crash_before_commit'; ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); ERROR HY000: Lost connection to MySQL server during query +# Startup the server after the crash show create table t1; Table Create Table t1 CREATE TABLE `t1` ( diff --git a/mysql-test/suite/innodb/r/rename_table_debug.result b/mysql-test/suite/innodb/r/rename_table_debug.result index 912ed9de48b..646bd4faf5d 100644 --- a/mysql-test/suite/innodb/r/rename_table_debug.result +++ b/mysql-test/suite/innodb/r/rename_table_debug.result @@ -1,5 +1,6 @@ -CREATE TABLE t1 (a INT UNSIGNED PRIMARY KEY) ENGINE=InnoDB; -INSERT INTO t1 VALUES(42); +FLUSH TABLES; +CREATE TABLE t1 (a SERIAL, b INT, c INT, d INT) ENGINE=InnoDB; +INSERT INTO t1 () VALUES (); connect con1,localhost,root,,test; SET DEBUG_SYNC='before_rename_table_commit SIGNAL renamed WAIT_FOR ever'; RENAME TABLE t1 TO t2; @@ -7,6 +8,6 @@ connection default; SET DEBUG_SYNC='now WAIT_FOR renamed'; disconnect con1; SELECT * FROM t1; -a -42 +a b c d +1 NULL NULL NULL DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/truncate_crash.result b/mysql-test/suite/innodb/r/truncate_crash.result new file mode 100644 index 00000000000..6c20da46cf8 --- /dev/null +++ b/mysql-test/suite/innodb/r/truncate_crash.result @@ -0,0 +1,14 @@ +FLUSH TABLES; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 SET a=1; +connect wait,localhost,root,,test; +SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL c WAIT_FOR ever'; +TRUNCATE TABLE t1; +connection default; +SET DEBUG_SYNC='now WAIT_FOR c'; +disconnect wait; +SELECT * FROM t1; +a +1 +TRUNCATE TABLE t1; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/alter_copy.test b/mysql-test/suite/innodb/t/alter_copy.test index b1c71d82096..0dce61994b5 100644 --- a/mysql-test/suite/innodb/t/alter_copy.test +++ b/mysql-test/suite/innodb/t/alter_copy.test @@ -88,8 +88,4 @@ CHECK TABLE t1; DROP TABLE t1,t; # Work around missing crash recovery at the SQL layer. -let $temp_table_name = `SELECT SUBSTRING(name,6) - FROM information_schema.innodb_sys_tables - WHERE name LIKE "test/#sql-%"`; ---replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ -eval DROP TABLE `#mysql50#$temp_table_name`; +--remove_files_wildcard $datadir/test #sql-*.frm diff --git a/mysql-test/suite/innodb/t/alter_crash.test b/mysql-test/suite/innodb/t/alter_crash.test index 0b9e99721a7..101e0fa44c2 100644 --- a/mysql-test/suite/innodb/t/alter_crash.test +++ b/mysql-test/suite/innodb/t/alter_crash.test @@ -72,9 +72,6 @@ let $orig_table_id = `SELECT table_id --error 2013 ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); ---echo # Restart mysqld after the crash and reconnect. ---source include/start_mysqld.inc - let TABLENAME_INC= $MYSQLTEST_VARDIR/tmp/tablename.inc; perl; die unless open OUT, ">$ENV{TABLENAME_INC}"; @@ -86,12 +83,15 @@ EOF source $TABLENAME_INC; remove_file $TABLENAME_INC; +move_file $datadir/test/$tablename.frm $datadir/test/t1.frm; + +--echo # Restart mysqld after the crash and reconnect. +--source include/start_mysqld.inc + --replace_result $orig_table_id ID eval SELECT * FROM information_schema.innodb_sys_tables WHERE table_id = $orig_table_id; -move_file $datadir/test/$tablename.frm $datadir/test/t1.frm; - --echo # Files in datadir after manual recovery. --list_files $MYSQLD_DATADIR/test @@ -125,27 +125,13 @@ let $orig_table_id = `SELECT table_id --error 2013 ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); +remove_files_wildcard $datadir/test #sql-*.frm; + --echo # Startup the server after the crash --source include/start_mysqld.inc SELECT * FROM information_schema.innodb_sys_tables -WHERE name LIKE 'test/#sql-ib%'; - -let TABLENAME_INC= $MYSQLTEST_VARDIR/tmp/tablename.inc; -perl; -die unless open OUT, ">$ENV{TABLENAME_INC}"; -chdir "$ENV{'datadir'}/test"; -my @frm_file = map { substr($_, 0, -4) } glob "#sql-*.frm"; -print OUT 'let $tablename=', $frm_file[0], ';'; -close OUT or die; -EOF -source $TABLENAME_INC; -remove_file $TABLENAME_INC; - ---echo # Drop the orphaned rebuilt table. ---disable_query_log -eval DROP TABLE `#mysql50#$tablename`; ---enable_query_log +WHERE name LIKE 'test/#sql-%'; SHOW TABLES; INSERT INTO t2 VALUES (5,6),(7,8); @@ -181,13 +167,6 @@ let $orig_table_id = `select table_id from --error 2013 ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE; ---echo # Restart mysqld after the crash and reconnect. ---source include/start_mysqld.inc - ---replace_result $orig_table_id ID -eval SELECT * FROM information_schema.innodb_sys_tables -WHERE table_id = $orig_table_id; - perl; die unless open OUT, ">$ENV{TABLENAME_INC}"; chdir "$ENV{'datadir'}/test"; @@ -195,12 +174,17 @@ my @frm_file = map { substr($_, 0, -4) } glob "#sql-*.frm"; print OUT 'let $tablename=', $frm_file[0], ';'; close OUT or die; EOF - source $TABLENAME_INC; remove_file $TABLENAME_INC; + move_file $datadir/test/$tablename.frm $datadir/test/t1.frm; -FLUSH TABLES; +--echo # Restart mysqld after the crash and reconnect. +--source include/start_mysqld.inc + +--replace_result $orig_table_id ID +eval SELECT * FROM information_schema.innodb_sys_tables +WHERE table_id = $orig_table_id; --echo # Files in datadir after manual recovery. --list_files $MYSQLD_DATADIR/test diff --git a/mysql-test/suite/innodb/t/innodb-alter-tempfile.test b/mysql-test/suite/innodb/t/innodb-alter-tempfile.test index f2038da8c4c..de27c7ebf62 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-tempfile.test +++ b/mysql-test/suite/innodb/t/innodb-alter-tempfile.test @@ -31,25 +31,14 @@ SET debug_dbug='+d,innodb_alter_commit_crash_before_commit'; --error 2013 ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); +--echo # Startup the server after the crash -let TABLENAME_INC= $MYSQLTEST_VARDIR/tmp/tablename.inc; -perl; -die unless open OUT, ">$ENV{TABLENAME_INC}"; -chdir "$ENV{'datadir'}/test"; -my @frm_file = map { substr($_, 0, -4) } glob "#sql-*.frm"; -print OUT 'let $temp_table_name=', $frm_file[0], ';'; -close OUT or die; -EOF -source $TABLENAME_INC; -remove_file $TABLENAME_INC; +remove_files_wildcard $datadir/test #sql-*.frm; --source include/start_mysqld.inc show create table t1; --echo # Consecutive Alter table does not create same temporary file name ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); ---disable_query_log -eval DROP TABLE `#mysql50#$temp_table_name`; ---enable_query_log show create table t1; drop table t1; diff --git a/mysql-test/suite/innodb/t/rename_table_debug.test b/mysql-test/suite/innodb/t/rename_table_debug.test index 4620f7bef22..c75f2fbca10 100644 --- a/mysql-test/suite/innodb/t/rename_table_debug.test +++ b/mysql-test/suite/innodb/t/rename_table_debug.test @@ -3,8 +3,11 @@ --source include/have_debug_sync.inc --source include/not_embedded.inc -CREATE TABLE t1 (a INT UNSIGNED PRIMARY KEY) ENGINE=InnoDB; -INSERT INTO t1 VALUES(42); +FLUSH TABLES; +LET $datadir= `SELECT @@datadir`; + +CREATE TABLE t1 (a SERIAL, b INT, c INT, d INT) ENGINE=InnoDB; +INSERT INTO t1 () VALUES (); --connect (con1,localhost,root,,test) SET DEBUG_SYNC='before_rename_table_commit SIGNAL renamed WAIT_FOR ever'; diff --git a/mysql-test/suite/innodb/t/truncate_crash.test b/mysql-test/suite/innodb/t/truncate_crash.test new file mode 100644 index 00000000000..15ba475e0e1 --- /dev/null +++ b/mysql-test/suite/innodb/t/truncate_crash.test @@ -0,0 +1,22 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/not_embedded.inc + +FLUSH TABLES; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 SET a=1; + +connect (wait,localhost,root,,test); +SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL c WAIT_FOR ever'; +send TRUNCATE TABLE t1; + +connection default; +SET DEBUG_SYNC='now WAIT_FOR c'; +--let $shutdown_timeout=0 +--source include/restart_mysqld.inc +disconnect wait; + +SELECT * FROM t1; +TRUNCATE TABLE t1; +DROP TABLE t1; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 7bb84b41a11..e29e1b0ed4b 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -13509,11 +13509,7 @@ int ha_innobase::truncate() if (!err) { /* Reopen the newly created table, and drop the - original table that was renamed to temp_name. - - Note: In MariaDB 10.2 (before MDEV-14585), if the - server is killed and restarted before the original - table is dropped, the table will remain orphaned. */ + original table that was renamed to temp_name. */ close(); err = open(name, 0, 0); if (!err) { diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 2b23ea8a230..d51c2539f3e 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -2773,7 +2773,7 @@ row_mysql_drop_garbage_tables() table_name = mem_heap_strdupl( heap, reinterpret_cast<const char*>(field), len); - if (strstr(table_name, "/" TEMP_FILE_PREFIX_INNODB)) { + if (strstr(table_name, "/" TEMP_FILE_PREFIX "-")) { btr_pcur_store_position(&pcur, &mtr); btr_pcur_commit_specify_mtr(&pcur, &mtr); @@ -3615,7 +3615,7 @@ row_drop_table_for_mysql( if (table->n_foreign_key_checks_running > 0) { defer: - if (!strstr(table->name.m_name, "/" TEMP_FILE_PREFIX_INNODB)) { + if (!strstr(table->name.m_name, "/" TEMP_FILE_PREFIX)) { heap = mem_heap_create(FN_REFLEN); const char* tmp_name = dict_mem_create_temporary_tablename( @@ -4399,7 +4399,7 @@ row_rename_table_for_mysql( goto funct_exit; - } else if (new_is_tmp) { + } else if (!old_is_tmp && new_is_tmp) { /* MySQL is doing an ALTER TABLE command and it renames the original table to a temporary table name. We want to preserve the original foreign key constraint definitions despite the |