summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/create_select_tmp.result19
-rw-r--r--mysql-test/t/create_select_tmp.test27
-rw-r--r--sql/sql_insert.cc8
3 files changed, 52 insertions, 2 deletions
diff --git a/mysql-test/r/create_select_tmp.result b/mysql-test/r/create_select_tmp.result
new file mode 100644
index 00000000000..610ee70b3e3
--- /dev/null
+++ b/mysql-test/r/create_select_tmp.result
@@ -0,0 +1,19 @@
+drop table if exists t1, t2;
+CREATE TABLE t1 ( a int );
+INSERT INTO t1 VALUES (1),(2),(1);
+CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
+Duplicate entry '1' for key 1
+select * from t2;
+Table 'test.t2' doesn't exist
+CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
+Duplicate entry '1' for key 1
+select * from t2;
+Table 'test.t2' doesn't exist
+CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
+Duplicate entry '1' for key 1
+select * from t2;
+Table 'test.t2' doesn't exist
+CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
+Duplicate entry '1' for key 1
+select * from t2;
+Table 'test.t2' doesn't exist
diff --git a/mysql-test/t/create_select_tmp.test b/mysql-test/t/create_select_tmp.test
new file mode 100644
index 00000000000..36292abd899
--- /dev/null
+++ b/mysql-test/t/create_select_tmp.test
@@ -0,0 +1,27 @@
+# Testcase for BUG#4551
+# The bug was that when the table was TEMPORARY, it was not deleted if
+# the CREATE SELECT failed (the code intended too, but it actually
+# didn't). And as the CREATE TEMPORARY TABLE was not written to the
+# binlog if it was a transactional table, it resulted in an
+# inconsistency between binlog and the internal list of temp tables.
+
+-- source include/have_innodb.inc
+drop table if exists t1, t2;
+CREATE TABLE t1 ( a int );
+INSERT INTO t1 VALUES (1),(2),(1);
+--error 1062;
+CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
+--error 1146;
+select * from t2;
+--error 1062;
+CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=INNODB SELECT a FROM t1;
+--error 1146;
+select * from t2;
+--error 1062;
+CREATE TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
+--error 1146;
+select * from t2;
+--error 1062;
+CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) TYPE=MYISAM SELECT a FROM t1;
+--error 1146;
+select * from t2;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 94e2f8f8850..8912c1faf2a 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1545,9 +1545,13 @@ void select_create::abort()
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
enum db_type table_type=table->db_type;
if (!table->tmp_table)
+ {
hash_delete(&open_cache,(byte*) table);
- if (!create_info->table_existed)
- quick_rm_table(table_type,db,name);
+ if (!create_info->table_existed)
+ quick_rm_table(table_type, db, name);
+ }
+ else if (!create_info->table_existed)
+ close_temporary_table(thd, db, name);
table=0;
}
VOID(pthread_mutex_unlock(&LOCK_open));