summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/innodb/r/alter_copy.result2
-rw-r--r--mysql-test/suite/innodb/r/alter_crash.result4
-rw-r--r--mysql-test/suite/innodb/r/innodb-alter-tempfile.result1
-rw-r--r--mysql-test/suite/innodb/r/rename_table_debug.result9
-rw-r--r--mysql-test/suite/innodb/r/truncate_crash.result14
-rw-r--r--mysql-test/suite/innodb/t/alter_copy.test6
-rw-r--r--mysql-test/suite/innodb/t/alter_crash.test46
-rw-r--r--mysql-test/suite/innodb/t/innodb-alter-tempfile.test15
-rw-r--r--mysql-test/suite/innodb/t/rename_table_debug.test7
-rw-r--r--mysql-test/suite/innodb/t/truncate_crash.test22
-rw-r--r--storage/innobase/handler/ha_innodb.cc6
-rw-r--r--storage/innobase/row/row0mysql.cc6
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