1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Fix fur BUG#13348: "multi-table updates and deletes are not logged if no rows were affected".

Not fixed in 4.1 as not critical. Also I'm correcting error checking of multi-UPDATE/DELETE
when it comes to binlogging, to make it consistent with when we rollback the statement.
This commit is contained in:
guilhem@mysql.com
2005-09-20 17:41:47 +02:00
parent ad53c58eb5
commit 388cf622ee
6 changed files with 88 additions and 32 deletions

View File

@ -475,11 +475,20 @@ int mysql_update(THD *thd,
query_cache_invalidate3(thd, table_list, 1);
}
if ((updated || (error < 0)) && (error <= 0 || !transactional_table))
/*
error < 0 means really no error at all: we processed all rows until the
last one without error. error > 0 means an error (e.g. unique key
violation and no IGNORE or REPLACE). error == 0 is also an error (if
preparing the record or invoking before triggers fails). See
ha_autocommit_or_rollback(error>=0) and DBUG_RETURN(error>=0) below.
Sometimes we want to binlog even if we updated no rows, in case user used
it to be sure master and slave are in same state.
*/
if ((error < 0) || (updated && !transactional_table))
{
if (mysql_bin_log.is_open())
{
if (error <= 0)
if (error < 0)
thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length,
transactional_table, FALSE);
@ -1439,16 +1448,14 @@ bool multi_update::send_eof()
/*
Write the SQL statement to the binlog if we updated
rows and we succeeded or if we updated some non
transacational tables.
Note that if we updated nothing we don't write to the binlog (TODO:
fix this).
transactional tables.
*/
if (updated && (local_error <= 0 || !trans_safe))
if ((local_error == 0) || (updated && !trans_safe))
{
if (mysql_bin_log.is_open())
{
if (local_error <= 0)
if (local_error == 0)
thd->clear_error();
Query_log_event qinfo(thd, thd->query, thd->query_length,
transactional_tables, FALSE);