Merge next-mr -> next-4284.

Cherry-pick a fix Bug#37148 from next-mr, to preserve
file ids of the added files, and ensure that all the necessary
changes have been pulled.

Since initially Bug#37148 was null-merged into 6.0,
the changeset that is now being cherry-picked was likewise
null merged into next-4284.

Now that Bug#37148 has been reapplied to 6.0, try to make
it work with next-4284. This is also necessary to be able
to pull other changes from 5.1-rep into next-4284.

To resolve the merge issues use this changeset applied
to 6.0:
revid:jperkin@sun.com-20091216103628-ylhqf7s6yegui2t9
revno: 3776.1.1
committer: He Zhenxing <zhenxing.he@sun.com>
branch nick: 6.0-codebase-bugfixing
timestamp: Thu 2009-12-17 17:02:50 +0800
message:
  Fix merge problem with Bug#37148
This commit is contained in:
Konstantin Osipov 2010-02-04 23:15:47 +03:00
parent 89269e5142
commit 06e1a73af6
28 changed files with 470 additions and 157 deletions

View File

@ -0,0 +1,22 @@
#
# === Name
#
# binlog_inject_error.inc
#
# === Description
#
# Inject binlog write error when running the query, verifies that the
# query is ended with the proper error (ER_ERROR_ON_WRITE).
#
# === Usage
#
# let query= 'CREATE TABLE t1 (a INT)';
# source include/binlog_inject_error.inc;
#
SET GLOBAL debug='d,injecting_fault_writing';
--echo $query;
--replace_regex /(errno: .*)/(errno: #)/
--error ER_ERROR_ON_WRITE
--eval $query
SET GLOBAL debug='';

View File

@ -0,0 +1,108 @@
#
# Initialization
#
DROP TABLE IF EXISTS t1, t2;
DROP FUNCTION IF EXISTS f1;
DROP FUNCTION IF EXISTS f2;
DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
DROP TRIGGER IF EXISTS tr1;
DROP TRIGGER IF EXISTS tr2;
DROP VIEW IF EXISTS v1, v2;
#
# Test injecting binlog write error when executing queries
#
SET GLOBAL debug='d,injecting_fault_writing';
CREATE TABLE t1 (a INT);
CREATE TABLE t1 (a INT);
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
INSERT INTO t1 VALUES (1),(2),(3);
SET GLOBAL debug='d,injecting_fault_writing';
INSERT INTO t1 VALUES (4),(5),(6);
INSERT INTO t1 VALUES (4),(5),(6);
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
UPDATE t1 set a=a+1;
UPDATE t1 set a=a+1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DELETE FROM t1;
DELETE FROM t1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t1 VALUES (new.a + 100);
CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t1 VALUES (new.a + 100);
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DROP TRIGGER tr1;
DROP TRIGGER tr1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
ALTER TABLE t1 ADD (b INT);
ALTER TABLE t1 ADD (b INT);
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
CREATE VIEW v1 AS SELECT a FROM t1;
CREATE VIEW v1 AS SELECT a FROM t1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DROP VIEW v1;
DROP VIEW v1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
CREATE PROCEDURE p1(OUT rows INT) SELECT count(*) INTO rows FROM t1;
CREATE PROCEDURE p1(OUT rows INT) SELECT count(*) INTO rows FROM t1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DROP PROCEDURE p1;
DROP PROCEDURE p1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DROP TABLE t1;
DROP TABLE t1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
CREATE FUNCTION f1() RETURNS INT return 1;
CREATE FUNCTION f1() RETURNS INT return 1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DROP FUNCTION f1;
DROP FUNCTION f1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
CREATE USER user1;
CREATE USER user1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
SET GLOBAL debug='d,injecting_fault_writing';
DROP USER user1;
DROP USER user1;
ERROR HY000: Error writing file 'master-bin' ((errno: #)
SET GLOBAL debug='';
#
# Cleanup
#
DROP TABLE IF EXISTS t1, t2;
DROP FUNCTION IF EXISTS f1;
DROP PROCEDURE IF EXISTS p1;
DROP TRIGGER IF EXISTS tr1;
DROP VIEW IF EXISTS v1, v2;

View File

@ -0,0 +1,101 @@
#
# === Name ===
#
# binlog_write_error.test
#
# === Description ===
#
# This test case check if the error of writing binlog file is properly
# reported and handled when executing statements.
#
# === Related Bugs ===
#
# BUG#37148
#
source include/have_log_bin.inc;
source include/have_debug.inc;
--echo #
--echo # Initialization
--echo #
disable_warnings;
DROP TABLE IF EXISTS t1, t2;
DROP FUNCTION IF EXISTS f1;
DROP FUNCTION IF EXISTS f2;
DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
DROP TRIGGER IF EXISTS tr1;
DROP TRIGGER IF EXISTS tr2;
DROP VIEW IF EXISTS v1, v2;
enable_warnings;
--echo #
--echo # Test injecting binlog write error when executing queries
--echo #
let $query= CREATE TABLE t1 (a INT);
source include/binlog_inject_error.inc;
INSERT INTO t1 VALUES (1),(2),(3);
let $query= INSERT INTO t1 VALUES (4),(5),(6);
source include/binlog_inject_error.inc;
let $query= UPDATE t1 set a=a+1;
source include/binlog_inject_error.inc;
let $query= DELETE FROM t1;
source include/binlog_inject_error.inc;
let $query= CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t1 VALUES (new.a + 100);
source include/binlog_inject_error.inc;
let $query= DROP TRIGGER tr1;
source include/binlog_inject_error.inc;
let $query= ALTER TABLE t1 ADD (b INT);
source include/binlog_inject_error.inc;
let $query= CREATE VIEW v1 AS SELECT a FROM t1;
source include/binlog_inject_error.inc;
let $query= DROP VIEW v1;
source include/binlog_inject_error.inc;
let $query= CREATE PROCEDURE p1(OUT rows INT) SELECT count(*) INTO rows FROM t1;
source include/binlog_inject_error.inc;
let $query= DROP PROCEDURE p1;
source include/binlog_inject_error.inc;
let $query= DROP TABLE t1;
source include/binlog_inject_error.inc;
let $query= CREATE FUNCTION f1() RETURNS INT return 1;
source include/binlog_inject_error.inc;
let $query= DROP FUNCTION f1;
source include/binlog_inject_error.inc;
let $query= CREATE USER user1;
source include/binlog_inject_error.inc;
let $query= REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1;
source include/binlog_inject_error.inc;
let $query= DROP USER user1;
source include/binlog_inject_error.inc;
--echo #
--echo # Cleanup
--echo #
disable_warnings;
DROP TABLE IF EXISTS t1, t2;
DROP FUNCTION IF EXISTS f1;
DROP PROCEDURE IF EXISTS p1;
DROP TRIGGER IF EXISTS tr1;
DROP VIEW IF EXISTS v1, v2;
enable_warnings;

View File

@ -370,7 +370,7 @@ Events::create_event(THD *thd, Event_parse_data *parse_data,
} }
/* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER /* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER
will be written into the binary log as the definer for the SQL thread. */ will be written into the binary log as the definer for the SQL thread. */
write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length()); ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length());
} }
} }
mysql_mutex_unlock(&LOCK_event_metadata); mysql_mutex_unlock(&LOCK_event_metadata);
@ -482,7 +482,7 @@ Events::update_event(THD *thd, Event_parse_data *parse_data,
new_element); new_element);
/* Binlog the alter event. */ /* Binlog the alter event. */
DBUG_ASSERT(thd->query() && thd->query_length()); DBUG_ASSERT(thd->query() && thd->query_length());
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); ret= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
} }
mysql_mutex_unlock(&LOCK_event_metadata); mysql_mutex_unlock(&LOCK_event_metadata);
@ -542,7 +542,7 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists)
event_queue->drop_event(thd, dbname, name); event_queue->drop_event(thd, dbname, name);
/* Binlog the drop event. */ /* Binlog the drop event. */
DBUG_ASSERT(thd->query() && thd->query_length()); DBUG_ASSERT(thd->query() && thd->query_length());
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); ret= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
mysql_mutex_unlock(&LOCK_event_metadata); mysql_mutex_unlock(&LOCK_event_metadata);
DBUG_RETURN(ret); DBUG_RETURN(ret);

View File

@ -1495,7 +1495,7 @@ binlog_end_trans(THD *thd, binlog_trx_data *trx_data,
if (all || !thd->in_multi_stmt_transaction()) if (all || !thd->in_multi_stmt_transaction())
{ {
if (trx_data->has_incident()) if (trx_data->has_incident())
mysql_bin_log.write_incident(thd, TRUE); error= mysql_bin_log.write_incident(thd, TRUE);
trx_data->reset(); trx_data->reset();
} }
else // ...statement else // ...statement
@ -4809,7 +4809,7 @@ bool MYSQL_BIN_LOG::write_incident(THD *thd, bool lock)
Incident_log_event ev(thd, incident, write_error_msg); Incident_log_event ev(thd, incident, write_error_msg);
if (lock) if (lock)
mysql_mutex_lock(&LOCK_log); mysql_mutex_lock(&LOCK_log);
ev.write(&log_file); error= ev.write(&log_file);
if (lock) if (lock)
{ {
if (!error && !(error= flush_and_sync(0))) if (!error && !(error= flush_and_sync(0)))

View File

@ -5877,7 +5877,7 @@ Slave_log_event::Slave_log_event(const char* buf, uint event_len)
int Slave_log_event::do_apply_event(Relay_log_info const *rli) int Slave_log_event::do_apply_event(Relay_log_info const *rli)
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
mysql_bin_log.write(this); return mysql_bin_log.write(this);
return 0; return 0;
} }
#endif /* !MYSQL_CLIENT */ #endif /* !MYSQL_CLIENT */
@ -7611,7 +7611,7 @@ static int rows_event_stmt_cleanup(Relay_log_info const *rli, THD * thd)
(assume the last master's transaction is ignored by the slave because of (assume the last master's transaction is ignored by the slave because of
replicate-ignore rules). replicate-ignore rules).
*/ */
thd->binlog_flush_pending_rows_event(true); error= thd->binlog_flush_pending_rows_event(true);
/* /*
If this event is not in a transaction, the call below will, if some If this event is not in a transaction, the call below will, if some
@ -7622,7 +7622,7 @@ static int rows_event_stmt_cleanup(Relay_log_info const *rli, THD * thd)
are involved, commit the transaction and flush the pending event to the are involved, commit the transaction and flush the pending event to the
binlog. binlog.
*/ */
error= trans_commit_stmt(thd); error|= (error ? trans_rollback_stmt(thd) : trans_commit_stmt(thd));
/* /*
Now what if this is not a transactional engine? we still need to Now what if this is not a transactional engine? we still need to

View File

@ -1504,7 +1504,15 @@ int Old_rows_log_event::do_apply_event(Relay_log_info const *rli)
NOTE: For this new scheme there should be no pending event: NOTE: For this new scheme there should be no pending event:
need to add code to assert that is the case. need to add code to assert that is the case.
*/ */
thd->binlog_flush_pending_rows_event(false); error= thd->binlog_flush_pending_rows_event(false);
if (error)
{
rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
ER(ER_SLAVE_FATAL_ERROR),
"call to binlog_flush_pending_rows_event() failed");
thd->is_slave_error= 1;
DBUG_RETURN(error);
}
TABLE_LIST *tables= rli->tables_to_lock; TABLE_LIST *tables= rli->tables_to_lock;
close_tables_for_reopen(thd, &tables, NULL); close_tables_for_reopen(thd, &tables, NULL);
@ -1785,7 +1793,7 @@ int Old_rows_log_event::do_apply_event(Relay_log_info const *rli)
(assume the last master's transaction is ignored by the slave because of (assume the last master's transaction is ignored by the slave because of
replicate-ignore rules). replicate-ignore rules).
*/ */
thd->binlog_flush_pending_rows_event(true); int binlog_error= thd->binlog_flush_pending_rows_event(true);
/* /*
If this event is not in a transaction, the call below will, if some If this event is not in a transaction, the call below will, if some
@ -1796,12 +1804,13 @@ int Old_rows_log_event::do_apply_event(Relay_log_info const *rli)
are involved, commit the transaction and flush the pending event to the are involved, commit the transaction and flush the pending event to the
binlog. binlog.
*/ */
if ((error= trans_commit_stmt(thd))) if ((error= (binlog_error ? trans_rollback_stmt(thd) : trans_commit_stmt(thd))))
rli->report(ERROR_LEVEL, error, rli->report(ERROR_LEVEL, error,
"Error in %s event: commit of row events failed, " "Error in %s event: commit of row events failed, "
"table `%s`.`%s`", "table `%s`.`%s`",
get_type_str(), m_table->s->db.str, get_type_str(), m_table->s->db.str,
m_table->s->table_name.str); m_table->s->table_name.str);
error|= binlog_error;
/* /*
Now what if this is not a transactional engine? we still need to Now what if this is not a transactional engine? we still need to

View File

@ -1029,8 +1029,8 @@ struct Query_cache_query_flags
#define query_cache_is_cacheable_query(L) 0 #define query_cache_is_cacheable_query(L) 0
#endif /*HAVE_QUERY_CACHE*/ #endif /*HAVE_QUERY_CACHE*/
void write_bin_log(THD *thd, bool clear_error, int write_bin_log(THD *thd, bool clear_error,
char const *query, ulong query_length); char const *query, ulong query_length);
/* sql_connect.cc */ /* sql_connect.cc */
int check_user(THD *thd, enum enum_server_command command, int check_user(THD *thd, enum enum_server_command command,

View File

@ -59,10 +59,14 @@ injector::transaction::~transaction()
my_free(the_memory, MYF(0)); my_free(the_memory, MYF(0));
} }
/**
@retval 0 transaction committed
@retval 1 transaction rolled back
*/
int injector::transaction::commit() int injector::transaction::commit()
{ {
DBUG_ENTER("injector::transaction::commit()"); DBUG_ENTER("injector::transaction::commit()");
m_thd->binlog_flush_pending_rows_event(true); int error= m_thd->binlog_flush_pending_rows_event(true);
/* /*
Cluster replication does not preserve statement or Cluster replication does not preserve statement or
transaction boundaries of the master. Instead, a new transaction boundaries of the master. Instead, a new
@ -88,7 +92,7 @@ int injector::transaction::commit()
close_thread_tables(m_thd); close_thread_tables(m_thd);
m_thd->mdl_context.release_transactional_locks(); m_thd->mdl_context.release_transactional_locks();
} }
DBUG_RETURN(0); DBUG_RETURN(error);
} }
@ -115,16 +119,16 @@ int injector::transaction::write_row (server_id_type sid, table tbl,
record_type record) record_type record)
{ {
DBUG_ENTER("injector::transaction::write_row(...)"); DBUG_ENTER("injector::transaction::write_row(...)");
int error= 0;
if (int error= check_state(ROW_STATE)) if (error= check_state(ROW_STATE))
DBUG_RETURN(error); DBUG_RETURN(error);
server_id_type save_id= m_thd->server_id; server_id_type save_id= m_thd->server_id;
m_thd->set_server_id(sid); m_thd->set_server_id(sid);
m_thd->binlog_write_row(tbl.get_table(), tbl.is_transactional(), error= m_thd->binlog_write_row(tbl.get_table(), tbl.is_transactional(),
cols, colcnt, record); cols, colcnt, record);
m_thd->set_server_id(save_id); m_thd->set_server_id(save_id);
DBUG_RETURN(0); DBUG_RETURN(error);
} }
@ -134,15 +138,16 @@ int injector::transaction::delete_row(server_id_type sid, table tbl,
{ {
DBUG_ENTER("injector::transaction::delete_row(...)"); DBUG_ENTER("injector::transaction::delete_row(...)");
if (int error= check_state(ROW_STATE)) int error= 0;
if (error= check_state(ROW_STATE))
DBUG_RETURN(error); DBUG_RETURN(error);
server_id_type save_id= m_thd->server_id; server_id_type save_id= m_thd->server_id;
m_thd->set_server_id(sid); m_thd->set_server_id(sid);
m_thd->binlog_delete_row(tbl.get_table(), tbl.is_transactional(), error= m_thd->binlog_delete_row(tbl.get_table(), tbl.is_transactional(),
cols, colcnt, record); cols, colcnt, record);
m_thd->set_server_id(save_id); m_thd->set_server_id(save_id);
DBUG_RETURN(0); DBUG_RETURN(error);
} }
@ -152,15 +157,16 @@ int injector::transaction::update_row(server_id_type sid, table tbl,
{ {
DBUG_ENTER("injector::transaction::update_row(...)"); DBUG_ENTER("injector::transaction::update_row(...)");
if (int error= check_state(ROW_STATE)) int error= 0;
if (error= check_state(ROW_STATE))
DBUG_RETURN(error); DBUG_RETURN(error);
server_id_type save_id= m_thd->server_id; server_id_type save_id= m_thd->server_id;
m_thd->set_server_id(sid); m_thd->set_server_id(sid);
m_thd->binlog_update_row(tbl.get_table(), tbl.is_transactional(), error= m_thd->binlog_update_row(tbl.get_table(), tbl.is_transactional(),
cols, colcnt, before, after); cols, colcnt, before, after);
m_thd->set_server_id(save_id); m_thd->set_server_id(save_id);
DBUG_RETURN(0); DBUG_RETURN(error);
} }

View File

@ -1127,9 +1127,10 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
/* restore sql_mode when binloging */ /* restore sql_mode when binloging */
thd->variables.sql_mode= saved_mode; thd->variables.sql_mode= saved_mode;
/* Such a statement can always go directly to binlog, no trans cache */ /* Such a statement can always go directly to binlog, no trans cache */
thd->binlog_query(THD::MYSQL_QUERY_TYPE, if (thd->binlog_query(THD::MYSQL_QUERY_TYPE,
log_query.c_ptr(), log_query.length(), log_query.c_ptr(), log_query.length(),
FALSE, FALSE, 0); FALSE, FALSE, 0))
ret= SP_INTERNAL_ERROR;
thd->variables.sql_mode= 0; thd->variables.sql_mode= 0;
} }
} }
@ -1192,7 +1193,8 @@ sp_drop_routine(THD *thd, int type, sp_name *name)
if (ret == SP_OK) if (ret == SP_OK)
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
ret= SP_INTERNAL_ERROR;
sp_cache_invalidate(); sp_cache_invalidate();
/* /*
@ -1306,7 +1308,8 @@ sp_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics)
if (ret == SP_OK) if (ret == SP_OK)
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
ret= SP_INTERNAL_ERROR;
sp_cache_invalidate(); sp_cache_invalidate();
} }
err: err:

View File

@ -1788,6 +1788,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount,
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"Invoked ROUTINE modified a transactional table but MySQL " "Invoked ROUTINE modified a transactional table but MySQL "
"failed to reflect this change in the binary log"); "failed to reflect this change in the binary log");
err_status= TRUE;
} }
reset_dynamic(&thd->user_var_events); reset_dynamic(&thd->user_var_events);
/* Forget those values, in case more function calls are binlogged: */ /* Forget those values, in case more function calls are binlogged: */

View File

@ -1632,8 +1632,8 @@ bool change_password(THD *thd, const char *host, const char *user,
acl_user->host.hostname ? acl_user->host.hostname : "", acl_user->host.hostname ? acl_user->host.hostname : "",
new_password)); new_password));
thd->clear_error(); thd->clear_error();
thd->binlog_query(THD::MYSQL_QUERY_TYPE, buff, query_length, result= thd->binlog_query(THD::MYSQL_QUERY_TYPE, buff, query_length,
FALSE, FALSE, 0); FALSE, FALSE, 0);
} }
end: end:
close_thread_tables(thd); close_thread_tables(thd);
@ -3252,7 +3252,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
if (!result) /* success */ if (!result) /* success */
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); result= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
@ -3419,7 +3419,8 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
if (write_to_binlog) if (write_to_binlog)
{ {
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
result= TRUE;
} }
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
@ -3539,7 +3540,7 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
if (!result) if (!result)
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); result= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
@ -5804,7 +5805,7 @@ bool mysql_create_user(THD *thd, List <LEX_USER> &list)
my_error(ER_CANNOT_USER, MYF(0), "CREATE USER", wrong_users.c_ptr_safe()); my_error(ER_CANNOT_USER, MYF(0), "CREATE USER", wrong_users.c_ptr_safe());
if (some_users_created) if (some_users_created)
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); result |= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
@ -5877,7 +5878,7 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
my_error(ER_CANNOT_USER, MYF(0), "DROP USER", wrong_users.c_ptr_safe()); my_error(ER_CANNOT_USER, MYF(0), "DROP USER", wrong_users.c_ptr_safe());
if (some_users_deleted) if (some_users_deleted)
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); result |= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
@ -5962,7 +5963,7 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
my_error(ER_CANNOT_USER, MYF(0), "RENAME USER", wrong_users.c_ptr_safe()); my_error(ER_CANNOT_USER, MYF(0), "RENAME USER", wrong_users.c_ptr_safe());
if (some_users_renamed && mysql_bin_log.is_open()) if (some_users_renamed && mysql_bin_log.is_open())
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); result |= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
@ -6144,15 +6145,17 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
mysql_mutex_unlock(&acl_cache->lock); mysql_mutex_unlock(&acl_cache->lock);
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); int binlog_error=
write_bin_log(thd, FALSE, thd->query(), thd->query_length());
mysql_rwlock_unlock(&LOCK_grant); mysql_rwlock_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
if (result) /* error for writing binary log has already been reported */
if (result && !binlog_error)
my_message(ER_REVOKE_GRANTS, ER(ER_REVOKE_GRANTS), MYF(0)); my_message(ER_REVOKE_GRANTS, ER(ER_REVOKE_GRANTS), MYF(0));
DBUG_RETURN(result); DBUG_RETURN(result || binlog_error);
} }

View File

@ -1505,7 +1505,7 @@ void close_thread_tables(THD *thd)
handled either before writing a query log event (inside handled either before writing a query log event (inside
binlog_query()) or when preparing a pending event. binlog_query()) or when preparing a pending event.
*/ */
thd->binlog_flush_pending_rows_event(TRUE); (void)thd->binlog_flush_pending_rows_event(TRUE);
mysql_unlock_tables(thd, thd->lock); mysql_unlock_tables(thd, thd->lock);
thd->lock=0; thd->lock=0;
} }
@ -1710,7 +1710,11 @@ void close_temporary_tables(THD *thd)
qinfo.db= db.ptr(); qinfo.db= db.ptr();
qinfo.db_len= db.length(); qinfo.db_len= db.length();
thd->variables.character_set_client= cs_save; thd->variables.character_set_client= cs_save;
mysql_bin_log.write(&qinfo); if (mysql_bin_log.write(&qinfo))
{
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, MYF(0),
"Failed to write the DROP statement for temporary tables to binary log");
}
thd->variables.pseudo_thread_id= save_pseudo_thread_id; thd->variables.pseudo_thread_id= save_pseudo_thread_id;
} }
else else
@ -3633,9 +3637,13 @@ static bool open_table_entry_fini(THD *thd, TABLE_SHARE *share, TABLE *entry)
end = strxmov(strmov(query, "DELETE FROM `"), end = strxmov(strmov(query, "DELETE FROM `"),
share->db.str,"`.`",share->table_name.str,"`", NullS); share->db.str,"`.`",share->table_name.str,"`", NullS);
int errcode= query_error_code(thd, TRUE); int errcode= query_error_code(thd, TRUE);
thd->binlog_query(THD::STMT_QUERY_TYPE, if (thd->binlog_query(THD::STMT_QUERY_TYPE,
query, (ulong)(end-query), query, (ulong)(end-query),
FALSE, FALSE, errcode); FALSE, FALSE, errcode))
{
my_free(query, MYF(0));
return TRUE;
}
my_free(query, MYF(0)); my_free(query, MYF(0));
} }
else else

View File

@ -2892,7 +2892,7 @@ public:
{} {}
int prepare(List<Item> &list, SELECT_LEX_UNIT *u); int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
void binlog_show_create_table(TABLE **tables, uint count); int binlog_show_create_table(TABLE **tables, uint count);
void store_values(List<Item> &values); void store_values(List<Item> &values);
void send_error(uint errcode,const char *err); void send_error(uint errcode,const char *err);
bool send_eof(); bool send_eof();

View File

@ -178,13 +178,13 @@ uchar* dboptions_get_key(my_dbopt_t *opt, size_t *length,
Helper function to write a query to binlog used by mysql_rm_db() Helper function to write a query to binlog used by mysql_rm_db()
*/ */
static inline void write_to_binlog(THD *thd, char *query, uint q_len, static inline int write_to_binlog(THD *thd, char *query, uint q_len,
char *db, uint db_len) char *db, uint db_len)
{ {
Query_log_event qinfo(thd, query, q_len, 0, 0, 0); Query_log_event qinfo(thd, query, q_len, 0, 0, 0);
qinfo.db= db; qinfo.db= db;
qinfo.db_len= db_len; qinfo.db_len= db_len;
mysql_bin_log.write(&qinfo); return mysql_bin_log.write(&qinfo);
} }
@ -774,7 +774,11 @@ not_silent:
qinfo.db_len = strlen(db); qinfo.db_len = strlen(db);
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
mysql_bin_log.write(&qinfo); if (mysql_bin_log.write(&qinfo))
{
error= -1;
goto exit;
}
} }
my_ok(thd, result); my_ok(thd, result);
} }
@ -851,7 +855,8 @@ bool mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
qinfo.db_len = strlen(db); qinfo.db_len = strlen(db);
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
mysql_bin_log.write(&qinfo); if (error= mysql_bin_log.write(&qinfo))
goto exit;
} }
my_ok(thd, result); my_ok(thd, result);
@ -997,7 +1002,11 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
qinfo.db_len = strlen(db); qinfo.db_len = strlen(db);
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
mysql_bin_log.write(&qinfo); if (mysql_bin_log.write(&qinfo))
{
error= -1;
goto exit;
}
} }
thd->clear_error(); thd->clear_error();
thd->server_status|= SERVER_STATUS_DB_DROPPED; thd->server_status|= SERVER_STATUS_DB_DROPPED;
@ -1025,7 +1034,11 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
if (query_pos + tbl_name_len + 1 >= query_end) if (query_pos + tbl_name_len + 1 >= query_end)
{ {
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
write_to_binlog(thd, query, query_pos -1 - query, db, db_len); if (write_to_binlog(thd, query, query_pos -1 - query, db, db_len))
{
error= -1;
goto exit;
}
query_pos= query_data_start; query_pos= query_data_start;
} }
@ -1038,7 +1051,11 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
if (query_pos != query_data_start) if (query_pos != query_data_start)
{ {
/* These DDL methods and logging protected with LOCK_mysql_create_db */ /* These DDL methods and logging protected with LOCK_mysql_create_db */
write_to_binlog(thd, query, query_pos -1 - query, db, db_len); if (write_to_binlog(thd, query, query_pos -1 - query, db, db_len))
{
error= -1;
goto exit;
}
} }
} }
@ -1994,7 +2011,7 @@ bool mysql_upgrade_db(THD *thd, LEX_STRING *old_db)
Query_log_event qinfo(thd, thd->query(), thd->query_length(), Query_log_event qinfo(thd, thd->query(), thd->query_length(),
0, TRUE, errcode); 0, TRUE, errcode);
thd->clear_error(); thd->clear_error();
mysql_bin_log.write(&qinfo); error|= mysql_bin_log.write(&qinfo);
} }
/* Step9: Let's do "use newdb" if we renamed the current database */ /* Step9: Let's do "use newdb" if we renamed the current database */

View File

@ -851,9 +851,10 @@ void multi_delete::abort()
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED); int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
thd->binlog_query(THD::ROW_QUERY_TYPE, /* possible error of writing binary log is ignored deliberately */
thd->query(), thd->query_length(), (void) thd->binlog_query(THD::ROW_QUERY_TYPE,
transactional_tables, FALSE, errcode); thd->query(), thd->query_length(),
transactional_tables, FALSE, errcode);
} }
thd->transaction.all.modified_non_trans_table= true; thd->transaction.all.modified_non_trans_table= true;
} }
@ -1254,8 +1255,9 @@ end:
{ {
/* In RBR, the statement is not binlogged if the table is temporary. */ /* In RBR, the statement is not binlogged if the table is temporary. */
if (!is_temporary_table || !thd->current_stmt_binlog_row_based) if (!is_temporary_table || !thd->current_stmt_binlog_row_based)
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); error= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
my_ok(thd); // This should return record count if (!error)
my_ok(thd); // This should return record count
} }
if (has_mdl_lock) if (has_mdl_lock)
thd->mdl_context.release_transactional_locks(); thd->mdl_context.release_transactional_locks();

View File

@ -2828,10 +2828,11 @@ bool Delayed_insert::handle_inserts(void)
will be binlogged together as one single Table_map event and one will be binlogged together as one single Table_map event and one
single Rows event. single Rows event.
*/ */
thd.binlog_query(THD::ROW_QUERY_TYPE, if (thd.binlog_query(THD::ROW_QUERY_TYPE,
row->query.str, row->query.length, row->query.str, row->query.length,
FALSE, FALSE, errcode); FALSE, FALSE, errcode))
goto err;
thd.time_zone_used = backup_time_zone_used; thd.time_zone_used = backup_time_zone_used;
thd.variables.time_zone = backup_time_zone; thd.variables.time_zone = backup_time_zone;
} }
@ -2905,8 +2906,9 @@ bool Delayed_insert::handle_inserts(void)
TODO: Move the logging to last in the sequence of rows. TODO: Move the logging to last in the sequence of rows.
*/ */
if (thd.current_stmt_binlog_row_based) if (thd.current_stmt_binlog_row_based &&
thd.binlog_flush_pending_rows_event(TRUE); thd.binlog_flush_pending_rows_event(TRUE))
goto err;
if ((error=table->file->extra(HA_EXTRA_NO_CACHE))) if ((error=table->file->extra(HA_EXTRA_NO_CACHE)))
{ // This shouldn't happen { // This shouldn't happen
@ -3360,16 +3362,21 @@ bool select_insert::send_eof()
events are in the transaction cache and will be written when events are in the transaction cache and will be written when
ha_autocommit_or_rollback() is issued below. ha_autocommit_or_rollback() is issued below.
*/ */
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open() &&
(!error || thd->transaction.stmt.modified_non_trans_table))
{ {
int errcode= 0; int errcode= 0;
if (!error) if (!error)
thd->clear_error(); thd->clear_error();
else else
errcode= query_error_code(thd, killed_status == THD::NOT_KILLED); errcode= query_error_code(thd, killed_status == THD::NOT_KILLED);
thd->binlog_query(THD::ROW_QUERY_TYPE, if (thd->binlog_query(THD::ROW_QUERY_TYPE,
thd->query(), thd->query_length(), thd->query(), thd->query_length(),
trans_table, FALSE, errcode); trans_table, FALSE, errcode))
{
table->file->ha_release_auto_increment();
DBUG_RETURN(1);
}
} }
table->file->ha_release_auto_increment(); table->file->ha_release_auto_increment();
@ -3440,9 +3447,10 @@ void select_insert::abort() {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED); int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query(), /* error of writing binary log is ignored */
thd->query_length(), (void) thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query(),
transactional_table, FALSE, errcode); thd->query_length(),
transactional_table, FALSE, errcode);
} }
if (!thd->current_stmt_binlog_row_based && !can_rollback_data()) if (!thd->current_stmt_binlog_row_based && !can_rollback_data())
thd->transaction.all.modified_non_trans_table= TRUE; thd->transaction.all.modified_non_trans_table= TRUE;
@ -3712,7 +3720,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
!table->s->tmp_table && !table->s->tmp_table &&
!ptr->get_create_info()->table_existed) !ptr->get_create_info()->table_existed)
{ {
ptr->binlog_show_create_table(tables, count); if (int error= ptr->binlog_show_create_table(tables, count))
return error;
} }
return 0; return 0;
} }
@ -3819,7 +3828,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
void int
select_create::binlog_show_create_table(TABLE **tables, uint count) select_create::binlog_show_create_table(TABLE **tables, uint count)
{ {
/* /*
@ -3858,12 +3867,13 @@ select_create::binlog_show_create_table(TABLE **tables, uint count)
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED); int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
thd->binlog_query(THD::STMT_QUERY_TYPE, result= thd->binlog_query(THD::STMT_QUERY_TYPE,
query.ptr(), query.length(), query.ptr(), query.length(),
/* is_trans */ TRUE, /* is_trans */ TRUE,
/* suppress_use */ FALSE, /* suppress_use */ FALSE,
errcode); errcode);
} }
return result;
} }
void select_create::store_values(List<Item> &values) void select_create::store_values(List<Item> &values)
@ -3961,7 +3971,8 @@ void select_create::abort()
select_insert::abort(); select_insert::abort();
thd->transaction.stmt.modified_non_trans_table= FALSE; thd->transaction.stmt.modified_non_trans_table= FALSE;
reenable_binlog(thd); reenable_binlog(thd);
thd->binlog_flush_pending_rows_event(TRUE); /* possible error of writing binary log is ignored deliberately */
(void)thd->binlog_flush_pending_rows_event(TRUE);
if (m_plock) if (m_plock)
{ {

View File

@ -155,7 +155,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
char name[FN_REFLEN]; char name[FN_REFLEN];
File file; File file;
TABLE *table= NULL; TABLE *table= NULL;
int error; int error= 0;
String *field_term=ex->field_term,*escaped=ex->escaped; String *field_term=ex->field_term,*escaped=ex->escaped;
String *enclosed=ex->enclosed; String *enclosed=ex->enclosed;
bool is_fifo=0; bool is_fifo=0;
@ -543,18 +543,20 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
{ {
int errcode= query_error_code(thd, killed_status == THD::NOT_KILLED); int errcode= query_error_code(thd, killed_status == THD::NOT_KILLED);
/* since there is already an error, the possible error of
writing binary log will be ignored */
if (thd->transaction.stmt.modified_non_trans_table) if (thd->transaction.stmt.modified_non_trans_table)
write_execute_load_query_log_event(thd, ex, (void) write_execute_load_query_log_event(thd, ex,
table_list->db, table_list->db,
table_list->table_name, table_list->table_name,
handle_duplicates, ignore, handle_duplicates, ignore,
transactional_table, transactional_table,
errcode); errcode);
else else
{ {
Delete_file_log_event d(thd, db, transactional_table); Delete_file_log_event d(thd, db, transactional_table);
d.flags|= LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F; d.flags|= LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F;
mysql_bin_log.write(&d); (void) mysql_bin_log.write(&d);
} }
} }
} }
@ -581,7 +583,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
after this point. after this point.
*/ */
if (thd->current_stmt_binlog_row_based) if (thd->current_stmt_binlog_row_based)
thd->binlog_flush_pending_rows_event(true); error= thd->binlog_flush_pending_rows_event(true);
else else
{ {
/* /*
@ -593,13 +595,15 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
if (lf_info.wrote_create_file) if (lf_info.wrote_create_file)
{ {
int errcode= query_error_code(thd, killed_status == THD::NOT_KILLED); int errcode= query_error_code(thd, killed_status == THD::NOT_KILLED);
write_execute_load_query_log_event(thd, ex, error= write_execute_load_query_log_event(thd, ex,
table_list->db, table_list->table_name, table_list->db, table_list->table_name,
handle_duplicates, ignore, handle_duplicates, ignore,
transactional_table, transactional_table,
errcode); errcode);
} }
} }
if (error)
goto err;
} }
#endif /*!EMBEDDED_LIBRARY*/ #endif /*!EMBEDDED_LIBRARY*/

View File

@ -2766,7 +2766,7 @@ end_with_restore_list:
/* /*
Presumably, REPAIR and binlog writing doesn't require synchronization Presumably, REPAIR and binlog writing doesn't require synchronization
*/ */
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
select_lex->table_list.first= (uchar*) first_table; select_lex->table_list.first= (uchar*) first_table;
lex->query_tables=all_tables; lex->query_tables=all_tables;
@ -2798,7 +2798,7 @@ end_with_restore_list:
/* /*
Presumably, ANALYZE and binlog writing doesn't require synchronization Presumably, ANALYZE and binlog writing doesn't require synchronization
*/ */
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
select_lex->table_list.first= (uchar*) first_table; select_lex->table_list.first= (uchar*) first_table;
lex->query_tables=all_tables; lex->query_tables=all_tables;
@ -2821,7 +2821,7 @@ end_with_restore_list:
/* /*
Presumably, OPTIMIZE and binlog writing doesn't require synchronization Presumably, OPTIMIZE and binlog writing doesn't require synchronization
*/ */
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
} }
select_lex->table_list.first= (uchar*) first_table; select_lex->table_list.first= (uchar*) first_table;
lex->query_tables=all_tables; lex->query_tables=all_tables;
@ -2950,7 +2950,7 @@ end_with_restore_list:
if (incident) if (incident)
{ {
Incident_log_event ev(thd, incident); Incident_log_event ev(thd, incident);
mysql_bin_log.write(&ev); (void) mysql_bin_log.write(&ev); /* error is ignored */
mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE); mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE);
} }
DBUG_PRINT("debug", ("Just after generate_incident()")); DBUG_PRINT("debug", ("Just after generate_incident()"));
@ -3753,7 +3753,8 @@ end_with_restore_list:
*/ */
if (!lex->no_write_to_binlog && write_to_binlog) if (!lex->no_write_to_binlog && write_to_binlog)
{ {
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); if (res= write_bin_log(thd, FALSE, thd->query(), thd->query_length()))
break;
} }
my_ok(thd); my_ok(thd);
} }
@ -4221,12 +4222,12 @@ create_sp_error:
case SP_KEY_NOT_FOUND: case SP_KEY_NOT_FOUND:
if (lex->drop_if_exists) if (lex->drop_if_exists)
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST), ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
SP_COM_STRING(lex), lex->spname->m_name.str); SP_COM_STRING(lex), lex->spname->m_name.str);
res= FALSE; if (!res)
my_ok(thd); my_ok(thd);
break; break;
} }
my_error(ER_SP_DOES_NOT_EXIST, MYF(0), my_error(ER_SP_DOES_NOT_EXIST, MYF(0),

View File

@ -4377,8 +4377,9 @@ static int fast_end_partition(THD *thd, ulonglong copied,
DBUG_RETURN(TRUE); /* The error has been reported */ DBUG_RETURN(TRUE); /* The error has been reported */
if ((!is_empty) && (!written_bin_log) && if ((!is_empty) && (!written_bin_log) &&
(!thd->lex->no_write_to_binlog)) (!thd->lex->no_write_to_binlog) &&
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); write_bin_log(thd, FALSE, thd->query(), thd->query_length()))
DBUG_RETURN(TRUE);
my_snprintf(tmp_name, sizeof(tmp_name), ER(ER_INSERT_INFO), my_snprintf(tmp_name, sizeof(tmp_name), ER(ER_INSERT_INFO),
(ulong) (copied + deleted), (ulong) (copied + deleted),

View File

@ -34,6 +34,7 @@ static TABLE_LIST *reverse_table_list(TABLE_LIST *table_list);
bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent) bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
{ {
bool error= 1; bool error= 1;
bool binlog_error= 0;
TABLE_LIST *ren_table= 0; TABLE_LIST *ren_table= 0;
int to_table; int to_table;
char *rename_log_table[2]= {NULL, NULL}; char *rename_log_table[2]= {NULL, NULL};
@ -176,11 +177,11 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
*/ */
mysql_mutex_unlock(&LOCK_open); mysql_mutex_unlock(&LOCK_open);
/* Lets hope this doesn't fail as the result will be messy */
if (!silent && !error) if (!silent && !error)
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); binlog_error= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
my_ok(thd); if (!binlog_error)
my_ok(thd);
} }
if (!error) if (!error)
@ -190,7 +191,7 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
err: err:
thd->global_read_lock.start_waiting_global_read_lock(thd); thd->global_read_lock.start_waiting_global_read_lock(thd);
DBUG_RETURN(error); DBUG_RETURN(error || binlog_error);
} }

View File

@ -1213,8 +1213,8 @@ int reset_slave(THD *thd, Master_info* mi)
MY_STAT stat_area; MY_STAT stat_area;
char fname[FN_REFLEN]; char fname[FN_REFLEN];
int thread_mask= 0, error= 0; int thread_mask= 0, error= 0;
uint sql_errno=0; uint sql_errno=ER_UNKNOWN_ERROR;
const char* errmsg=0; const char* errmsg= "Unknown error occured while reseting slave";
DBUG_ENTER("reset_slave"); DBUG_ENTER("reset_slave");
lock_slave_threads(mi); lock_slave_threads(mi);
@ -1951,7 +1951,8 @@ err:
replication events along LOAD DATA processing. replication events along LOAD DATA processing.
@param file pointer to io-cache @param file pointer to io-cache
@return 0 @retval 0 success
@retval 1 failure
*/ */
int log_loaded_block(IO_CACHE* file) int log_loaded_block(IO_CACHE* file)
{ {
@ -1978,7 +1979,8 @@ int log_loaded_block(IO_CACHE* file)
Append_block_log_event a(lf_info->thd, lf_info->thd->db, buffer, Append_block_log_event a(lf_info->thd, lf_info->thd->db, buffer,
min(block_len, max_event_size), min(block_len, max_event_size),
lf_info->log_delayed); lf_info->log_delayed);
mysql_bin_log.write(&a); if (mysql_bin_log.write(&a))
DBUG_RETURN(1);
} }
else else
{ {
@ -1986,7 +1988,8 @@ int log_loaded_block(IO_CACHE* file)
buffer, buffer,
min(block_len, max_event_size), min(block_len, max_event_size),
lf_info->log_delayed); lf_info->log_delayed);
mysql_bin_log.write(&b); if (mysql_bin_log.write(&b))
DBUG_RETURN(1);
lf_info->wrote_create_file= 1; lf_info->wrote_create_file= 1;
DBUG_SYNC_POINT("debug_lock.created_file_event",10); DBUG_SYNC_POINT("debug_lock.created_file_event",10);
} }

View File

@ -1742,9 +1742,10 @@ end:
file file
*/ */
void write_bin_log(THD *thd, bool clear_error, int write_bin_log(THD *thd, bool clear_error,
char const *query, ulong query_length) char const *query, ulong query_length)
{ {
int error= 0;
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
int errcode= 0; int errcode= 0;
@ -1752,9 +1753,10 @@ void write_bin_log(THD *thd, bool clear_error,
thd->clear_error(); thd->clear_error();
else else
errcode= query_error_code(thd, TRUE); errcode= query_error_code(thd, TRUE);
thd->binlog_query(THD::STMT_QUERY_TYPE, error= thd->binlog_query(THD::STMT_QUERY_TYPE,
query, query_length, FALSE, FALSE, errcode); query, query_length, FALSE, FALSE, errcode);
} }
return error;
} }
@ -2143,7 +2145,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
tables). In this case, we can write the original query into tables). In this case, we can write the original query into
the binary log. the binary log.
*/ */
write_bin_log(thd, !error, thd->query(), thd->query_length()); error |= write_bin_log(thd, !error, thd->query(), thd->query_length());
} }
else if (thd->current_stmt_binlog_row_based && else if (thd->current_stmt_binlog_row_based &&
tmp_table_deleted) tmp_table_deleted)
@ -2165,7 +2167,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
*/ */
built_query.chop(); // Chop of the last comma built_query.chop(); // Chop of the last comma
built_query.append(" /* generated by server */"); built_query.append(" /* generated by server */");
write_bin_log(thd, !error, built_query.ptr(), built_query.length()); error|= write_bin_log(thd, !error, built_query.ptr(), built_query.length());
} }
/* /*
@ -2184,7 +2186,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
*/ */
built_tmp_query.chop(); // Chop of the last comma built_tmp_query.chop(); // Chop of the last comma
built_tmp_query.append(" /* generated by server */"); built_tmp_query.append(" /* generated by server */");
write_bin_log(thd, !error, built_tmp_query.ptr(), built_tmp_query.length()); error|= write_bin_log(thd, !error, built_tmp_query.ptr(), built_tmp_query.length());
} }
} }
@ -3660,9 +3662,9 @@ void sp_prepare_create_field(THD *thd, Create_field *sql_field)
RETURN VALUES RETURN VALUES
NONE NONE
*/ */
static inline void write_create_table_bin_log(THD *thd, static inline int write_create_table_bin_log(THD *thd,
const HA_CREATE_INFO *create_info, const HA_CREATE_INFO *create_info,
bool internal_tmp_table) bool internal_tmp_table)
{ {
/* /*
Don't write statement if: Don't write statement if:
@ -3675,7 +3677,8 @@ static inline void write_create_table_bin_log(THD *thd,
(!thd->current_stmt_binlog_row_based || (!thd->current_stmt_binlog_row_based ||
(thd->current_stmt_binlog_row_based && (thd->current_stmt_binlog_row_based &&
!(create_info->options & HA_LEX_CREATE_TMP_TABLE)))) !(create_info->options & HA_LEX_CREATE_TMP_TABLE))))
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); return write_bin_log(thd, TRUE, thd->query(), thd->query_length());
return 0;
} }
@ -3944,8 +3947,7 @@ bool mysql_create_table_no_lock(THD *thd,
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR), ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
alias); alias);
error= 0; error= write_create_table_bin_log(thd, create_info, internal_tmp_table);
write_create_table_bin_log(thd, create_info, internal_tmp_table);
goto err; goto err;
} }
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alias); my_error(ER_TABLE_EXISTS_ERROR, MYF(0), alias);
@ -4094,7 +4096,7 @@ bool mysql_create_table_no_lock(THD *thd,
thd->thread_specific_used= TRUE; thd->thread_specific_used= TRUE;
} }
error= FALSE; error= write_create_table_bin_log(thd, create_info, internal_tmp_table);
unlock_and_end: unlock_and_end:
mysql_mutex_unlock(&LOCK_open); mysql_mutex_unlock(&LOCK_open);
@ -4109,7 +4111,7 @@ warn:
ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR), ER_TABLE_EXISTS_ERROR, ER(ER_TABLE_EXISTS_ERROR),
alias); alias);
create_info->table_existed= 1; // Mark that table existed create_info->table_existed= 1; // Mark that table existed
write_create_table_bin_log(thd, create_info, internal_tmp_table); error= write_create_table_bin_log(thd, create_info, internal_tmp_table);
goto unlock_and_end; goto unlock_and_end;
} }
@ -4172,7 +4174,7 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table,
(!thd->current_stmt_binlog_row_based || (!thd->current_stmt_binlog_row_based ||
(thd->current_stmt_binlog_row_based && (thd->current_stmt_binlog_row_based &&
!(create_info->options & HA_LEX_CREATE_TMP_TABLE)))) !(create_info->options & HA_LEX_CREATE_TMP_TABLE))))
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); result= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE)) if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE))
{ {
@ -5285,7 +5287,8 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
create_info, FALSE /* show_database */); create_info, FALSE /* show_database */);
DBUG_ASSERT(result == 0); // store_create_info() always return 0 DBUG_ASSERT(result == 0); // store_create_info() always return 0
write_bin_log(thd, TRUE, query.ptr(), query.length()); if (write_bin_log(thd, TRUE, query.ptr(), query.length()))
goto err;
DBUG_ASSERT(thd->open_tables == table->table); DBUG_ASSERT(thd->open_tables == table->table);
mysql_mutex_lock(&LOCK_open); mysql_mutex_lock(&LOCK_open);
@ -5298,14 +5301,15 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
mysql_mutex_unlock(&LOCK_open); mysql_mutex_unlock(&LOCK_open);
} }
else // Case 1 else // Case 1
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
goto err;
} }
/* /*
Case 3 and 4 does nothing under RBR Case 3 and 4 does nothing under RBR
*/ */
} }
else else if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); goto err;
err: err:
DBUG_RETURN(res); DBUG_RETURN(res);
@ -5385,7 +5389,7 @@ mysql_discard_or_import_tablespace(THD *thd,
error=1; error=1;
if (error) if (error)
goto err; goto err;
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); error= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
err: err:
trans_rollback_stmt(thd); trans_rollback_stmt(thd);
@ -6440,12 +6444,14 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
thd->clear_error(); thd->clear_error();
Query_log_event qinfo(thd, thd->query(), thd->query_length(), Query_log_event qinfo(thd, thd->query(), thd->query_length(),
0, FALSE, 0); 0, FALSE, 0);
mysql_bin_log.write(&qinfo); if (error= mysql_bin_log.write(&qinfo))
goto view_err_unlock;
} }
my_ok(thd); my_ok(thd);
} }
mysql_mutex_unlock(&LOCK_open); mysql_mutex_unlock(&LOCK_open);
view_err_unlock:
unlock_table_names(thd); unlock_table_names(thd);
view_err: view_err:
@ -6715,8 +6721,9 @@ view_err:
if (!error) if (!error)
{ {
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); error= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
my_ok(thd); if (!error)
my_ok(thd);
} }
else if (error > 0) else if (error > 0)
{ {
@ -7225,8 +7232,9 @@ view_err:
if (rename_temporary_table(thd, new_table, new_db, new_name)) if (rename_temporary_table(thd, new_table, new_db, new_name))
goto err_new_table_cleanup; goto err_new_table_cleanup;
/* We don't replicate alter table statement on temporary tables */ /* We don't replicate alter table statement on temporary tables */
if (!thd->current_stmt_binlog_row_based) if (!thd->current_stmt_binlog_row_based &&
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
DBUG_RETURN(TRUE);
goto end_temporary; goto end_temporary;
} }
@ -7390,7 +7398,8 @@ view_err:
DBUG_ASSERT(!(mysql_bin_log.is_open() && DBUG_ASSERT(!(mysql_bin_log.is_open() &&
thd->current_stmt_binlog_row_based && thd->current_stmt_binlog_row_based &&
(create_info->options & HA_LEX_CREATE_TMP_TABLE))); (create_info->options & HA_LEX_CREATE_TMP_TABLE)));
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
DBUG_RETURN(TRUE);
if (ha_check_storage_engine_flag(old_db_type, HTON_FLUSH_AFTER_RENAME)) if (ha_check_storage_engine_flag(old_db_type, HTON_FLUSH_AFTER_RENAME))
{ {

View File

@ -66,6 +66,6 @@ int mysql_alter_tablespace(THD *thd, st_alter_tablespace *ts_info)
ha_resolve_storage_engine_name(hton), ha_resolve_storage_engine_name(hton),
"TABLESPACE or LOGFILE GROUP"); "TABLESPACE or LOGFILE GROUP");
} }
write_bin_log(thd, FALSE, thd->query(), thd->query_length()); error= write_bin_log(thd, FALSE, thd->query(), thd->query_length());
DBUG_RETURN(FALSE); DBUG_RETURN(error);
} }

View File

@ -511,7 +511,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
end: end:
if (!result) if (!result)
{ {
write_bin_log(thd, TRUE, stmt_query.ptr(), stmt_query.length()); result= write_bin_log(thd, TRUE, stmt_query.ptr(), stmt_query.length());
} }
/* /*

View File

@ -524,8 +524,8 @@ int mysql_create_function(THD *thd,udf_func *udf)
mysql_rwlock_unlock(&THR_LOCK_udf); mysql_rwlock_unlock(&THR_LOCK_udf);
/* Binlog the create function. */ /* Binlog the create function. */
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
DBUG_RETURN(1);
DBUG_RETURN(0); DBUG_RETURN(0);
err: err:
@ -599,8 +599,8 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
Binlog the drop function. Keep the table open and locked Binlog the drop function. Keep the table open and locked
while binlogging, to avoid binlog inconsistency. while binlogging, to avoid binlog inconsistency.
*/ */
write_bin_log(thd, TRUE, thd->query(), thd->query_length()); if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
DBUG_RETURN(1);
DBUG_RETURN(0); DBUG_RETURN(0);
err: err:
mysql_rwlock_unlock(&THR_LOCK_udf); mysql_rwlock_unlock(&THR_LOCK_udf);

View File

@ -1874,9 +1874,10 @@ void multi_update::abort()
into repl event. into repl event.
*/ */
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED); int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
thd->binlog_query(THD::ROW_QUERY_TYPE, /* the error of binary logging is ignored */
thd->query(), thd->query_length(), (void)thd->binlog_query(THD::ROW_QUERY_TYPE,
transactional_tables, FALSE, errcode); thd->query(), thd->query_length(),
transactional_tables, FALSE, errcode);
} }
thd->transaction.all.modified_non_trans_table= TRUE; thd->transaction.all.modified_non_trans_table= TRUE;
} }

View File

@ -659,8 +659,9 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
buff.append(views->source.str, views->source.length); buff.append(views->source.str, views->source.length);
int errcode= query_error_code(thd, TRUE); int errcode= query_error_code(thd, TRUE);
thd->binlog_query(THD::STMT_QUERY_TYPE, if (thd->binlog_query(THD::STMT_QUERY_TYPE,
buff.ptr(), buff.length(), FALSE, FALSE, errcode); buff.ptr(), buff.length(), FALSE, FALSE, errcode))
res= TRUE;
} }
mysql_mutex_unlock(&LOCK_open); mysql_mutex_unlock(&LOCK_open);
@ -1681,7 +1682,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
/* if something goes wrong, bin-log with possible error code, /* if something goes wrong, bin-log with possible error code,
otherwise bin-log with error code cleared. otherwise bin-log with error code cleared.
*/ */
write_bin_log(thd, !something_wrong, thd->query(), thd->query_length()); if (write_bin_log(thd, !something_wrong, thd->query(), thd->query_length()))
something_wrong= 1;
} }
mysql_mutex_unlock(&LOCK_open); mysql_mutex_unlock(&LOCK_open);