mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
Fix for BUG#4551 "Temporary InnoDB tables not replicated properly with CREATE TABLE .. SELECT"
The problem was that (for any storage engine), the created temporary table was not removed if CREATE SELECT failed (because of a constraint violation for example). This was not consistent with the manual and with CREATE SELECT (no TEMPORARY).
This commit is contained in:
parent
37bf41a7ae
commit
e5c2285782
3 changed files with 52 additions and 2 deletions
19
mysql-test/r/create_select_tmp.result
Normal file
19
mysql-test/r/create_select_tmp.result
Normal file
|
@ -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
|
27
mysql-test/t/create_select_tmp.test
Normal file
27
mysql-test/t/create_select_tmp.test
Normal file
|
@ -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;
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue