diff options
author | unknown <guilhem@mysql.com> | 2005-09-20 17:41:47 +0200 |
---|---|---|
committer | unknown <guilhem@mysql.com> | 2005-09-20 17:41:47 +0200 |
commit | 03045ee70ab6a3adf93c2a7506a3281f411d66fa (patch) | |
tree | a1843ec4af67e94bc6f5c15e3952b7ad581513a3 /sql/sql_update.cc | |
parent | 2b24a2b5b57177db854cd93991afc3229f1a69cc (diff) | |
download | mariadb-git-03045ee70ab6a3adf93c2a7506a3281f411d66fa.tar.gz |
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.
mysql-test/r/rpl_multi_delete.result:
result update
mysql-test/r/rpl_multi_update.result:
result update
mysql-test/t/rpl_multi_delete.test:
test for BUG#13348
mysql-test/t/rpl_multi_update.test:
test of BUG#13348
sql/sql_delete.cc:
We now binlog multi-DELETE even if no row was updated (like we do for DELETE).
I'm also correcting some error checking (< instead of <=), basing myself on when we rollback.
sql/sql_update.cc:
we now binlog multi-UPDATE even if no row was updated (like we do for UPDATE).
Adding to existing tests to test new behaviour.
I'm also correcting some error checking (< instead of <=), basing myself on when we rollback.
Diffstat (limited to 'sql/sql_update.cc')
-rw-r--r-- | sql/sql_update.cc | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sql/sql_update.cc b/sql/sql_update.cc index a75eef9324c..efdf1291305 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -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); |