MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Andrei Elkin Date:August 20 2007 5:03pm
Subject:bk commit into 5.0 tree (aelkin:1.2440) BUG#23333
View as plain text  
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 */|
 
 #
Thread
bk commit into 5.0 tree (aelkin:1.2440) BUG#23333Andrei Elkin20 Aug