From: Date: August 20 2007 7:03pm Subject: bk commit into 5.0 tree (aelkin:1.2440) BUG#23333 List-Archive: http://lists.mysql.com/commits/32764 X-Bug: 23333 Message-Id: <200708201703.l7KH30wm031832@dsl-hkibras-fe38f900-157.dhcp.inet.fi> Below is the list of changes that have just been committed into a local 5.0 repository of elkin. When elkin does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2007-08-20 20:02:52+03:00, aelkin@stripped +6 -0 Bug #23333 stored function + non-transac table + transac table = breaks stmt-based binlog Binlogging of the statement with a side effect like a modified non-trans table did not happen. The artifact involved all binloggable dml queries. Fixed with changing the binlogging conditions all over the code to exploit thd->transaction.stmt.modified_non_trans_table introduced by the patch for bug@27417. Multi-delete case has own specific addressed by another bug@29136. Multi-update case has been addressed by bug#27716 and patch and will need merging. mysql-test/r/sp_trans.result@stripped, 2007-08-20 20:02:49+03:00, aelkin@stripped +3 -2 results changed mysql-test/t/sp_trans.test@stripped, 2007-08-20 20:02:49+03:00, aelkin@stripped +1 -2 making check of the part relating to bug#23333 compatible with other tests. Fixing comments that got obsolete after fix for the current bug. sql/sql_delete.cc@stripped, 2007-08-20 20:02:49+03:00, aelkin@stripped +3 -3 deploying the binlogging check with thd->transaction.stmt.modified_non_trans_table sql/sql_insert.cc@stripped, 2007-08-20 20:02:50+03:00, aelkin@stripped +14 -14 binlogging when thd->transaction.stmt.modified_non_trans_table is TRUE sql/sql_load.cc@stripped, 2007-08-20 20:02:50+03:00, aelkin@stripped +1 -1 binlogging when thd->transaction.stmt.modified_non_trans_table is true sql/sql_update.cc@stripped, 2007-08-20 20:02:50+03:00, aelkin@stripped +1 -1 binlogging when thd->transaction.stmt.modified_non_trans_table is true # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: aelkin # Host: dsl-hkibras-fe38f900-157.dhcp.inet.fi # Root: /home/elkin/MySQL/TEAM/FIXES/5.0/bug23333-sf_and_nonta --- 1.198/sql/sql_delete.cc 2007-07-20 19:48:05 +03:00 +++ 1.199/sql/sql_delete.cc 2007-08-20 20:02:49 +03:00 @@ -319,7 +319,7 @@ cleanup: thd->transaction.stmt.modified_non_trans_table= TRUE; /* See similar binlogging code in sql_update.cc, for comments */ - if ((error < 0) || (deleted && !transactional_table)) + if ((error < 0) || thd->transaction.stmt.modified_non_trans_table) { if (mysql_bin_log.is_open()) { @@ -819,7 +819,8 @@ bool multi_delete::send_eof() { query_cache_invalidate3(thd, delete_tables, 1); } - if ((local_error == 0) || (deleted && normal_tables)) + DBUG_ASSERT(!normal_tables || !deleted || thd->transaction.stmt.modified_non_trans_table); + if ((local_error == 0) || thd->transaction.stmt.modified_non_trans_table) { if (mysql_bin_log.is_open()) { @@ -833,7 +834,6 @@ bool multi_delete::send_eof() if (thd->transaction.stmt.modified_non_trans_table) thd->transaction.all.modified_non_trans_table= TRUE; } - DBUG_ASSERT(!normal_tables || !deleted || thd->transaction.stmt.modified_non_trans_table); /* Commit or rollback the current SQL statement */ if (transactional_tables) --- 1.231/sql/sql_insert.cc 2007-07-20 19:48:05 +03:00 +++ 1.232/sql/sql_insert.cc 2007-08-20 20:02:50 +03:00 @@ -763,25 +763,25 @@ bool mysql_insert(THD *thd,TABLE_LIST *t before binlog writing and ha_autocommit_or_rollback */ query_cache_invalidate3(thd, table_list, 1); - if (error <= 0 || !transactional_table) + } + if (changed && error <= 0 || thd->transaction.stmt.modified_non_trans_table) + { + if (mysql_bin_log.is_open()) { - if (mysql_bin_log.is_open()) - { - if (error <= 0) - thd->clear_error(); - Query_log_event qinfo(thd, thd->query, thd->query_length, - transactional_table, FALSE); - if (mysql_bin_log.write(&qinfo) && transactional_table) - error=1; - } + if (error <= 0) + thd->clear_error(); + Query_log_event qinfo(thd, thd->query, thd->query_length, + transactional_table, FALSE); + if (mysql_bin_log.write(&qinfo) && transactional_table) + error=1; + } if (thd->transaction.stmt.modified_non_trans_table) thd->transaction.all.modified_non_trans_table= TRUE; - } } DBUG_ASSERT(transactional_table || !changed || thd->transaction.stmt.modified_non_trans_table); if (transactional_table) error=ha_autocommit_or_rollback(thd,error); - + if (thd->lock) { mysql_unlock_tables(thd, thd->lock); @@ -2703,6 +2703,7 @@ void select_insert::send_error(uint errc */ DBUG_VOID_RETURN; } + changed= (info.copied || info.deleted || info.updated); transactional_table= table->file->has_transactions(); if (!thd->prelocked_mode) table->file->end_bulk_insert(); @@ -2712,8 +2713,7 @@ void select_insert::send_error(uint errc error while inserting into a MyISAM table) we must write to the binlog (and the error code will make the slave stop). */ - if ((changed= info.copied || info.deleted || info.updated) && - !transactional_table) + if (thd->transaction.stmt.modified_non_trans_table) { if (last_insert_id) thd->insert_id(last_insert_id); // For binary log --- 1.114/sql/sql_load.cc 2007-07-20 19:48:06 +03:00 +++ 1.115/sql/sql_load.cc 2007-08-20 20:02:50 +03:00 @@ -444,7 +444,7 @@ bool mysql_load(THD *thd,sql_exchange *e /* If the file was not empty, wrote_create_file is true */ if (lf_info.wrote_create_file) { - if ((info.copied || info.deleted) && !transactional_table) + if (thd->transaction.stmt.modified_non_trans_table) write_execute_load_query_log_event(thd, handle_duplicates, ignore, transactional_table); else --- 1.216/sql/sql_update.cc 2007-07-20 19:48:07 +03:00 +++ 1.217/sql/sql_update.cc 2007-08-20 20:02:50 +03:00 @@ -548,7 +548,7 @@ int mysql_update(THD *thd, 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 ((error < 0) || thd->transaction.stmt.modified_non_trans_table) { if (mysql_bin_log.is_open()) { --- 1.12/mysql-test/r/sp_trans.result 2007-03-24 19:19:58 +02:00 +++ 1.13/mysql-test/r/sp_trans.result 2007-08-20 20:02:49 +03:00 @@ -546,8 +546,9 @@ end| reset master| insert into t2 values (bug23333(),1)| ERROR 23000: Duplicate entry '1' for key 1 -show binlog events from 98 /* with fixes for #23333 will show there is the query */| -Log_name Pos Event_type Server_id End_log_pos Info +show master status /* the offset must denote there is the query */| +File Position Binlog_Do_DB Binlog_Ignore_DB +master-bin.000001 326 select count(*),@a from t1 /* must be 1,1 */| count(*) @a 1 1 --- 1.12/mysql-test/t/sp_trans.test 2007-03-24 19:19:58 +02:00 +++ 1.13/mysql-test/t/sp_trans.test 2007-08-20 20:02:49 +03:00 @@ -580,8 +580,7 @@ end| reset master| --error ER_DUP_ENTRY insert into t2 values (bug23333(),1)| ---replace_column 2 # 5 # 6 # -show binlog events from 98 /* with fixes for #23333 will show there is the query */| +show master status /* the offset must denote there is the query */| select count(*),@a from t1 /* must be 1,1 */| #