bk commit into 5.0 tree (aelkin:1.2440) BUG#23333
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@1.2440, 2007-08-20 20:02:52+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +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@1.13, 2007-08-20 20:02:49+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +3 -2
results changed
mysql-test/t/sp_trans.test@1.13, 2007-08-20 20:02:49+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +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@1.199, 2007-08-20 20:02:49+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +3 -3
deploying the binlogging check with thd->transaction.stmt.modified_non_trans_table
sql/sql_insert.cc@1.232, 2007-08-20 20:02:50+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +14 -14
binlogging when thd->transaction.stmt.modified_non_trans_table is TRUE
sql/sql_load.cc@1.115, 2007-08-20 20:02:50+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +1 -1
binlogging when thd->transaction.stmt.modified_non_trans_table is true
sql/sql_update.cc@1.217, 2007-08-20 20:02:50+03:00, aelkin@dsl-hkibras-fe38f900-157.dhcp.inet.fi +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 */|
#
--
MySQL Code Commits Mailing List
For list archives:
http://lists.mysql.com/commits
To unsubscribe:
http://lists.mysql.com/commits?unsub=lists@pantek.com
Received on Mon Aug 20 13:03:20 2007
This archive was generated by hypermail 2.1.8
: Sun Oct 07 2007 - 08:39:22 EDT
|