summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2004-07-18 14:34:35 +0200
committerunknown <guilhem@mysql.com>2004-07-18 14:34:35 +0200
commit382ff793bb52de384ce49074c61ce81fc2ce3236 (patch)
tree71d71d4521a5c8afca5268b92bd869ec376dd737 /sql
parent474c2578c5db161aa201427982828e074a61559d (diff)
downloadmariadb-git-382ff793bb52de384ce49074c61ce81fc2ce3236.tar.gz
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). sql/sql_insert.cc: 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). And it led to the above bug, because the binlogging of CREATE SELECT is done by select_insert::send_eof() (same function as INSERT SELECT) and so, if the table is transactional and there is a failure, the statement is considered as rolled back and so nothing is written in the binlog. So temp table MUST be deleted.
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_insert.cc8
1 files changed, 6 insertions, 2 deletions
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));