summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAlfranio Correia <alfranio.correia@sun.com>2010-08-02 20:48:56 +0100
committerAlfranio Correia <alfranio.correia@sun.com>2010-08-02 20:48:56 +0100
commitf62e89fade7cda645de80e2996de69e7d980cbdd (patch)
tree363a0395eb448a1b3c5f37f8125af5e5d7f7ba1d /sql
parent060db3d325931a7a43e06e9346f5a699e85f1e77 (diff)
downloadmariadb-git-f62e89fade7cda645de80e2996de69e7d980cbdd.tar.gz
BUG#55625 RBR breaks on failing 'CREATE TABLE'
A CREATE...SELECT that fails is written to the binary log if a non-transactional statement is updated. If the logging format is ROW, the CREATE statement and the changes are written to the binary log as distinct events and by consequence the created table is not rolled back in the slave. In this patch, we opted to let the slave goes out of sync by not writting to the binary log the CREATE statement. We do this by simply reseting the binary log's cache. mysql-test/suite/rpl/r/rpl_drop.result: Added a test case. mysql-test/suite/rpl/t/rpl_drop.test: Added a test case. sql/log.cc: Introduced a function to clean up the cache. sql/log.h: Introduced a function to clean up the cache. sql/sql_insert.cc: Cleaned up the binary log cache if a CREATE...SELECT fails.
Diffstat (limited to 'sql')
-rw-r--r--sql/log.cc13
-rw-r--r--sql/log.h3
-rw-r--r--sql/sql_insert.cc11
3 files changed, 26 insertions, 1 deletions
diff --git a/sql/log.cc b/sql/log.cc
index 614a07e6b63..3f41bf1c929 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -1628,6 +1628,19 @@ static int binlog_rollback(handlerton *hton, THD *thd, bool all)
DBUG_RETURN(error);
}
+/**
+ Cleanup the cache.
+
+ @param thd The client thread that wants to clean up the cache.
+*/
+void MYSQL_BIN_LOG::reset_gathered_updates(THD *thd)
+{
+ binlog_trx_data *const trx_data=
+ (binlog_trx_data*) thd_get_ha_data(thd, binlog_hton);
+
+ trx_data->reset();
+}
+
void MYSQL_BIN_LOG::set_write_error(THD *thd)
{
DBUG_ENTER("MYSQL_BIN_LOG::set_write_error");
diff --git a/sql/log.h b/sql/log.h
index 8d3880d9171..8f1ed7ee90c 100644
--- a/sql/log.h
+++ b/sql/log.h
@@ -356,10 +356,11 @@ public:
/* Use this to start writing a new log file */
void new_file();
+ void reset_gathered_updates(THD *thd);
bool write(Log_event* event_info); // binary log write
bool write(THD *thd, IO_CACHE *cache, Log_event *commit_event, bool incident);
- bool write_incident(THD *thd, bool lock);
+ bool write_incident(THD *thd, bool lock);
int write_cache(IO_CACHE *cache, bool lock_log, bool flush_and_sync);
void set_write_error(THD *thd);
bool check_write_error(THD *thd);
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 35c24e7571e..83b1834da0b 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -3873,6 +3873,17 @@ void select_create::abort()
if (table)
{
+ if (thd->lex->sql_command == SQLCOM_CREATE_TABLE &&
+ thd->current_stmt_binlog_row_based &&
+ !(thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) &&
+ mysql_bin_log.is_open())
+ {
+ /*
+ This should be removed after BUG#47899.
+ */
+ mysql_bin_log.reset_gathered_updates(thd);
+ }
+
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
if (!create_info->table_existed)