List:Commits« Previous MessageNext Message »
From:Andrei Elkin Date:March 27 2011 9:53am
Subject:bzr commit into mysql-trunk branch (andrei.elkin:3311) Bug#11748510
View as plain text  
#At file:///home/andrei/MySQL/BZR/2a-23May/FIXES/bug11748510_36524-deadlock_overdram/ based on revid:magne.mahre@stripped

 3311 Andrei Elkin	2011-03-27
      bug#11748510 incident of deadlock on slave is overdramatized
      
      In cases of temporary errors in replication event execution (deadlock,
      timeout) the error log gained an overreacting error message whereas
      just a warning would be fine.
      
      Fixed with checking of the temporary status of the error inside
      Slave_reporting_capability::report() to demote the error to the
      warning level if needed. 
      The warning gets converted into the error
      whenever number of successive attempts to re-apply the event(s) gets
      equal to @@global.slave_trans_retries.
      
      The patch also changes the slave service error gathering and reporting
      as the following.
      Slave_reporting_capability::report() populates 
      thd->main_da the standard placeholder for the errors and calls the stderr writers 
      for errors and lesser severity levels as specified by
      @@global_system_variables.log_warnings.
      That said  report() mimics my_error().
      Slave_reporting_capability::display() is introduced to display errors 
      through show-slave-status interfaces.
      The latter mimics send_error().
      Overall the changes 
      a. print out all errors that SQL thread met during a failing execution,
      b. make Last_SQL_error more informative to list all the errors.
      
      Some number of test result files got affected and in some cases the
      new results revealed issues in the old versions. This patch contains a
      limited part dealing with the tests. See the following commit that
      completes the fixes.
     @ mysql-test/extra/rpl_tests/rpl_deadlock.test
        regression test is added to prove a temporary failure warning is escalated.
     @ mysql-test/extra/rpl_tests/rpl_loaddata.test
        More sensible Unknown error rather than one with code 0 is reported by the server.
     @ mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test
        More sensible Unknown error rather than one with code 0 is reported by the server.
     @ mysql-test/suite/rpl/r/rpl_binlog_errors.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_checksum.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_deadlock_innodb.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_filter_tables_not_exist.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_idempotency.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_init_slave_errors.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_known_bugs_detection.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_loaddata.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_packet.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_row_conflicts.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_stm_EE_err2.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_stm_conflicts.result
        results get updated.
     @ mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result
        More sensible Unknown error rather than one with code 0 is reported by the server.
     @ mysql-test/suite/rpl/t/rpl_idempotency.test
        the final print-out of SQL thread diag area revealed messages that are
        benign and needs suppression.
     @ sql/log_event.cc
        treating rli->report() as an error reporting similar to my_error().
        Gathering errors in the diag area should be completed with displaying
        via rli->display() each time a slave thread breaks the applying loop.
        Relocating clear_all_errors() definition into rpl_slave.cc.
     @ sql/rpl_reporting.cc
        report() method is turned to be a wrapper of functions dealing with
        the diag area like my_error() and ones with the error log.  One of its
        use case to register an error and print it out the error log.  A new
        display() method copies the gathered errors the area of the Show
        Slave Status when a slave thread is about to exit.
        
        A special caution (not perfect, todo is written) is done to not bring in 
        unreferrable objects to the embedded library.
     @ sql/rpl_reporting.h
         a new display() method added as well as comments for report().
     @ sql/rpl_slave.cc
        exporting has_temporary_error() to be used in rpl_reporting.cc;
        docking definition of clear_all_errors() to use in both modules;
        run-out-of-tries case is finished with raising on the fatal error flag;
        finalizing the error branch of events execution with display() to
        make gathered error be saved in show-slave-status area;
        deploying display() at the end of io-thread and sql-thread.
        The farewell print-out of the gathered errors at error branch of handle_slave_sql() is removed as redundant.
     @ sql/rpl_slave.h
        exporting functions shared with slave.cc, rpl_reporting.cc, log_event.cc.

    modified:
      mysql-test/extra/rpl_tests/rpl_deadlock.test
      mysql-test/extra/rpl_tests/rpl_loaddata.test
      mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test
      mysql-test/suite/rpl/r/rpl_binlog_errors.result
      mysql-test/suite/rpl/r/rpl_checksum.result
      mysql-test/suite/rpl/r/rpl_deadlock_innodb.result
      mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result
      mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result
      mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result
      mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result
      mysql-test/suite/rpl/r/rpl_filter_tables_not_exist.result
      mysql-test/suite/rpl/r/rpl_idempotency.result
      mysql-test/suite/rpl/r/rpl_init_slave_errors.result
      mysql-test/suite/rpl/r/rpl_known_bugs_detection.result
      mysql-test/suite/rpl/r/rpl_loaddata.result
      mysql-test/suite/rpl/r/rpl_packet.result
      mysql-test/suite/rpl/r/rpl_row_conflicts.result
      mysql-test/suite/rpl/r/rpl_stm_EE_err2.result
      mysql-test/suite/rpl/r/rpl_stm_conflicts.result
      mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result
      mysql-test/suite/rpl/t/rpl_idempotency.test
      sql/log_event.cc
      sql/rpl_reporting.cc
      sql/rpl_reporting.h
      sql/rpl_slave.cc
      sql/rpl_slave.h
=== modified file 'mysql-test/extra/rpl_tests/rpl_deadlock.test'
--- a/mysql-test/extra/rpl_tests/rpl_deadlock.test	2010-12-19 17:07:28 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_deadlock.test	2011-03-27 09:53:06 +0000
@@ -10,6 +10,10 @@
 
 --source include/master-slave.inc
 
+connection slave;
+call mtr.add_suppression("Could not execute Write_rows event on table test.t1,handler error HA_ERR_LOCK_WAIT_TIMEOUT");
+connection master;
+
 # 0) Prepare tables and data
 --echo *** Prepare tables and data ***
 
@@ -123,6 +127,58 @@ SELECT * FROM t3;
 source include/check_slave_is_running.inc;
 --echo
 
+#
+# bug#11748510/36524 incident of deadlock on slave is overdramatized
+#
+# Observe that the slave stopped when the number of transation retries 
+# exceeds @@global.slave_transaction_retries
+#
+connection master;
+
+--echo *** Test the deadlock warning to be escalated into the error ***
+
+delete from t1;
+delete from t2;
+delete from t3;
+
+sync_slave_with_master;
+
+# make sure slave's unilateral row gone as well
+delete from t1;
+delete from t2;
+delete from t3;
+
+# the first attempt to run a deadlock scenario of p 1) leads to the error
+set @save.slave_transaction_retries= @@global.slave_transaction_retries;
+set @@global.slave_transaction_retries= 0;
+source include/stop_slave.inc;
+
+connection master;
+
+BEGIN;
+INSERT INTO t1 VALUES (1);
+# We make a long transaction here
+INSERT INTO t2 VALUES (2), (2), (2), (2), (2), (2), (2), (2), (2), (2);
+INSERT INTO t3 VALUES (3);
+COMMIT;
+
+connection slave;
+BEGIN;
+SELECT count(*) as zero FROM t1 FOR UPDATE;
+
+start slave;
+
+--echo *** Now the slave must be stopped due to deadlock ***
+
+# slow slave environment can report ER_LOCK_TIMEOUT
+let $slave_sql_errno= 1213, 1205; # ER_LOCK_DEADLOCK or TIMEOUT
+let $show_slave_sql_error= 0;
+source include/wait_for_slave_sql_error.inc;
+
+rollback;
+
+set @@global.slave_transaction_retries= @save.slave_transaction_retries;
+source include/start_slave.inc;
 # Clean up
 --echo *** Clean up ***
 connection master;

=== modified file 'mysql-test/extra/rpl_tests/rpl_loaddata.test'
--- a/mysql-test/extra/rpl_tests/rpl_loaddata.test	2011-02-23 20:01:27 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_loaddata.test	2011-03-27 09:53:06 +0000
@@ -70,7 +70,7 @@ save_master_pos;
 connection slave;
 # 1062 = ER_DUP_ENTRY
 call mtr.add_suppression("Slave SQL.*Error .Duplicate entry .10. for key .b.. on query.* Error_code: 1062");
-call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 0");
+call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 1105");
 --let $slave_sql_errno= 1062
 --source include/wait_for_slave_sql_error_and_skip.inc
 
@@ -157,7 +157,7 @@ if (`SELECT @@global.binlog_format != 'R
 {
   # Query causes error on master but not on slave. This causes the slave to
   # stop with error code 0 (which is wrong: see BUG#57287)
-  --let $slave_sql_errno= 0
+  --let $slave_sql_errno= 1105
   --source include/wait_for_slave_sql_error.inc
   drop table t1, t2;
 }

=== modified file 'mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test'
--- a/mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test	2011-02-23 20:01:27 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test	2011-03-27 09:53:06 +0000
@@ -24,9 +24,9 @@ insert into t1 values(1),(2);
 drop table t1;
 
 connection slave;
-call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.* error code=1062.*Error on slave:.* Error_code: 0");
+call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.* error code=1062.*Error on slave:.* Error_code: 1105");
 --echo (expect different error codes on master and slave)
---let $slave_sql_errno= 0
+--let $slave_sql_errno= 1105
 --let $show_slave_sql_error= 1
 --source include/wait_for_slave_sql_error.inc
 drop table t1;

=== modified file 'mysql-test/suite/rpl/r/rpl_binlog_errors.result'
--- a/mysql-test/suite/rpl/r/rpl_binlog_errors.result	2010-12-22 09:17:12 +0000
+++ b/mysql-test/suite/rpl/r/rpl_binlog_errors.result	2011-03-27 09:53:06 +0000
@@ -234,7 +234,8 @@ include/stop_slave.inc
 SET GLOBAL debug="+d,error_unique_log_filename";
 START SLAVE io_thread;
 include/wait_for_slave_io_error.inc [errno=1595]
-Last_IO_Error = 'Relay log write failure: could not queue event from master'
+Last_IO_Error = 'Can't generate a unique log-filename slave-relay-bin.(1-999)
+, Error_code: 1098; Relay log write failure: could not queue event from master, Error_code: 1595; Relay log write failure: could not queue event from master'
 SET GLOBAL debug="-d,error_unique_log_filename";
 SET GLOBAL debug=@old_debug;
 include/rpl_restart_server.inc [server_number=2]
@@ -244,7 +245,7 @@ include/stop_slave.inc
 SET GLOBAL debug="+d,fault_injection_new_file_rotate_event";
 START SLAVE io_thread;
 include/wait_for_slave_io_error.inc [errno=1595]
-Last_IO_Error = 'Relay log write failure: could not queue event from master'
+Last_IO_Error = 'Can't open file: 'slave-relay-bin' (errno: 2), Error_code: 1026; Relay log write failure: could not queue event from master, Error_code: 1595; Relay log write failure: could not queue event from master'
 SET GLOBAL debug="-d,fault_injection_new_file_rotate_event";
 SET GLOBAL debug=@old_debug;
 include/rpl_restart_server.inc [server_number=2]
@@ -254,7 +255,7 @@ include/stop_slave.inc
 SET GLOBAL debug="+d,fault_injection_registering_index";
 START SLAVE io_thread;
 include/wait_for_slave_io_error.inc [errno=1595]
-Last_IO_Error = 'Relay log write failure: could not queue event from master'
+Last_IO_Error = 'Can't open file: './slave-relay-bin.000006' (errno: 1), Error_code: 1016; Relay log write failure: could not queue event from master, Error_code: 1595; Relay log write failure: could not queue event from master'
 SET GLOBAL debug="-d,fault_injection_registering_index";
 SET GLOBAL debug=@old_debug;
 include/rpl_restart_server.inc [server_number=2]
@@ -264,7 +265,7 @@ include/stop_slave.inc
 SET GLOBAL debug="+d,fault_injection_openning_index";
 START SLAVE io_thread;
 include/wait_for_slave_io_error.inc [errno=1595]
-Last_IO_Error = 'Relay log write failure: could not queue event from master'
+Last_IO_Error = 'Can't open file: './slave-relay-bin.index' (errno: 1), Error_code: 1016; Relay log write failure: could not queue event from master, Error_code: 1595; Relay log write failure: could not queue event from master'
 SET GLOBAL debug="-d,fault_injection_openning_index";
 SET GLOBAL debug=@old_debug;
 include/rpl_restart_server.inc [server_number=2]

=== modified file 'mysql-test/suite/rpl/r/rpl_checksum.result'
--- a/mysql-test/suite/rpl/r/rpl_checksum.result	2011-03-08 19:12:46 +0000
+++ b/mysql-test/suite/rpl/r/rpl_checksum.result	2011-03-27 09:53:06 +0000
@@ -81,7 +81,7 @@ create table t2 (a int);
 set @@global.debug='d,simulate_checksum_test_failure';
 start slave io_thread;
 include/wait_for_slave_io_error.inc [errno=1595]
-Last_IO_Error = 'Relay log write failure: could not queue event from master'
+Last_IO_Error = 'Replication event checksum verification failed while reading from network., Error_code: 1722; Relay log write failure: could not queue event from master'
 set @@global.debug='';
 start slave io_thread;
 include/wait_for_slave_param.inc [Read_Master_Log_Pos]

=== modified file 'mysql-test/suite/rpl/r/rpl_deadlock_innodb.result'
--- a/mysql-test/suite/rpl/r/rpl_deadlock_innodb.result	2010-12-19 17:22:30 +0000
+++ b/mysql-test/suite/rpl/r/rpl_deadlock_innodb.result	2011-03-27 09:53:06 +0000
@@ -1,5 +1,6 @@
 include/master-slave.inc
 [connection master]
+call mtr.add_suppression("Could not execute Write_rows event on table test.t1,handler error HA_ERR_LOCK_WAIT_TIMEOUT");
 *** Prepare tables and data ***
 CREATE TABLE t1 (a INT NOT NULL, KEY(a)) ENGINE=innodb;
 CREATE TABLE t2 (a INT) ENGINE=innodb;
@@ -103,6 +104,31 @@ a
 3
 include/check_slave_is_running.inc
 
+*** Test the deadlock warning to be escalated into the error ***
+delete from t1;
+delete from t2;
+delete from t3;
+delete from t1;
+delete from t2;
+delete from t3;
+set @save.slave_transaction_retries= @@global.slave_transaction_retries;
+set @@global.slave_transaction_retries= 0;
+include/stop_slave.inc
+BEGIN;
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (2), (2), (2), (2), (2), (2), (2), (2), (2), (2);
+INSERT INTO t3 VALUES (3);
+COMMIT;
+BEGIN;
+SELECT count(*) as zero FROM t1 FOR UPDATE;
+zero
+0
+start slave;
+*** Now the slave must be stopped due to deadlock ***
+include/wait_for_slave_sql_error.inc [errno=1213, 1205]
+rollback;
+set @@global.slave_transaction_retries= @save.slave_transaction_retries;
+include/start_slave.inc
 *** Clean up ***
 DROP TABLE t1,t2,t3;
 SET global max_relay_log_size= @my_max_relay_log_size;

=== modified file 'mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result'
--- a/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result	2011-03-27 09:53:06 +0000
@@ -613,7 +613,7 @@ c1	c3	hex(c4)	c5	c6
 * Bug30415 *
 ************
 include/wait_for_slave_sql_error.inc [errno=1091]
-Last_SQL_Error = 'Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7''
+Last_SQL_Error = 'Can't DROP 'c7'; check that column/key exists, Error_code: 1091; Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7''
 STOP SLAVE;
 RESET SLAVE;
 
@@ -662,7 +662,7 @@ c1	hex(c4)	c5	c6	c7	c2
 ********************************************
 
 include/wait_for_slave_sql_error.inc [errno=1054]
-Last_SQL_Error = 'Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7''
+Last_SQL_Error = 'Unknown column 'c7' in 't15', Error_code: 1054; Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7''
 STOP SLAVE;
 RESET SLAVE;
 
@@ -711,7 +711,7 @@ c1	hex(c4)	c5	c6	c7
 *****************
 
 include/wait_for_slave_sql_error.inc [errno=1072]
-Last_SQL_Error = 'Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)''
+Last_SQL_Error = 'Key column 'c6' doesn't exist in table, Error_code: 1072; Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)''
 STOP SLAVE;
 RESET SLAVE;
 

=== modified file 'mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result'
--- a/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result	2011-03-27 09:53:06 +0000
@@ -613,7 +613,7 @@ c1	c3	hex(c4)	c5	c6
 * Bug30415 *
 ************
 include/wait_for_slave_sql_error.inc [errno=1091]
-Last_SQL_Error = 'Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7''
+Last_SQL_Error = 'Can't DROP 'c7'; check that column/key exists, Error_code: 1091; Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7''
 STOP SLAVE;
 RESET SLAVE;
 
@@ -662,7 +662,7 @@ c1	hex(c4)	c5	c6	c7	c2
 ********************************************
 
 include/wait_for_slave_sql_error.inc [errno=1054]
-Last_SQL_Error = 'Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7''
+Last_SQL_Error = 'Unknown column 'c7' in 't15', Error_code: 1054; Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7''
 STOP SLAVE;
 RESET SLAVE;
 
@@ -711,7 +711,7 @@ c1	hex(c4)	c5	c6	c7
 *****************
 
 include/wait_for_slave_sql_error.inc [errno=1072]
-Last_SQL_Error = 'Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)''
+Last_SQL_Error = 'Key column 'c6' doesn't exist in table, Error_code: 1072; Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)''
 STOP SLAVE;
 RESET SLAVE;
 

=== modified file 'mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result'
--- a/mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result	2011-03-27 09:53:06 +0000
@@ -488,7 +488,7 @@ ALTER TABLE t15 ADD COLUMN c6 INT AFTER 
 *** Expect slave to fail with Error 1060 ***
 ********************************************
 include/wait_for_slave_sql_error_and_skip.inc [errno=1060]
-Last_SQL_Error = 'Error 'Duplicate column name 'c6'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5''
+Last_SQL_Error = 'Duplicate column name 'c6', Error_code: 1060; Error 'Duplicate column name 'c6'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5''
 *** Try to insert in master ****
 INSERT INTO t15 () VALUES(5,2.00,'Replication Testing',@b1,'Buda',2);
 SELECT * FROM t15 ORDER BY c1;

=== modified file 'mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result'
--- a/mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result	2011-03-27 09:53:06 +0000
@@ -488,7 +488,7 @@ ALTER TABLE t15 ADD COLUMN c6 INT AFTER 
 *** Expect slave to fail with Error 1060 ***
 ********************************************
 include/wait_for_slave_sql_error_and_skip.inc [errno=1060]
-Last_SQL_Error = 'Error 'Duplicate column name 'c6'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5''
+Last_SQL_Error = 'Duplicate column name 'c6', Error_code: 1060; Error 'Duplicate column name 'c6'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5''
 *** Try to insert in master ****
 INSERT INTO t15 () VALUES(5,2.00,'Replication Testing',@b1,'Buda',2);
 SELECT * FROM t15 ORDER BY c1;

=== modified file 'mysql-test/suite/rpl/r/rpl_filter_tables_not_exist.result'
--- a/mysql-test/suite/rpl/r/rpl_filter_tables_not_exist.result	2011-02-23 09:31:37 +0000
+++ b/mysql-test/suite/rpl/r/rpl_filter_tables_not_exist.result	2011-03-27 09:53:06 +0000
@@ -45,52 +45,52 @@ UPDATE t7 LEFT JOIN (t8, t4, t1) ON (t7.
 call mtr.add_suppression("Slave SQL.*Error .Table .test.t[47]. doesn.t exist. on query.* Error_code: 1146");
 UPDATE t1 LEFT JOIN t4 ON (t1.id=t4.id) SET a=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN t4 ON (t1.id=t4.id) SET a=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN t4 ON (t1.id=t4.id) SET a=0 where t1.id=1''
 UPDATE t1 LEFT JOIN (t4, t7) ON (t1.id=t4.id and t1.id=t7.id) SET a=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t7) ON (t1.id=t4.id and t1.id=t7.id) SET a=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t7) ON (t1.id=t4.id and t1.id=t7.id) SET a=0 where t1.id=1''
 UPDATE t1 LEFT JOIN (t2, t4, t7) ON (t1.id=t2.id and t1.id=t4.id and t1.id=t7.id) SET a=0, b=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t2, t4, t7) ON (t1.id=t2.id and t1.id=t4.id and t1.id=t7.id) SET a=0, b=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t2, t4, t7) ON (t1.id=t2.id and t1.id=t4.id and t1.id=t7.id) SET a=0, b=0 where t1.id=1''
 UPDATE t1 LEFT JOIN (t2, t3, t7) ON (t1.id=t2.id and t1.id=t3.id and t1.id=t7.id) SET a=0, b=0, c=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t2, t3, t7) ON (t1.id=t2.id and t1.id=t3.id and t1.id=t7.id) SET a=0, b=0, c=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t2, t3, t7) ON (t1.id=t2.id and t1.id=t3.id and t1.id=t7.id) SET a=0, b=0, c=0 where t1.id=1''
 UPDATE t1 LEFT JOIN t7 ON (t1.id=t7.id) SET a=0, g=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN t7 ON (t1.id=t7.id) SET a=0, g=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN t7 ON (t1.id=t7.id) SET a=0, g=0 where t1.id=1''
 UPDATE t7 LEFT JOIN t1 ON (t1.id=t7.id) SET a=0, g=0 where t7.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN t1 ON (t1.id=t7.id) SET a=0, g=0 where t7.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN t1 ON (t1.id=t7.id) SET a=0, g=0 where t7.id=1''
 UPDATE t1 LEFT JOIN (t4, t5, t7) ON (t1.id=t4.id and t1.id=t5.id and t1.id=t7.id) SET a=0, g=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t5, t7) ON (t1.id=t4.id and t1.id=t5.id and t1.id=t7.id) SET a=0, g=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t5, t7) ON (t1.id=t4.id and t1.id=t5.id and t1.id=t7.id) SET a=0, g=0 where t1.id=1''
 UPDATE t1 LEFT JOIN (t4, t7, t8) ON (t1.id=t4.id and t1.id=t7.id and t1.id=t8.id) SET a=0, g=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t7, t8) ON (t1.id=t4.id and t1.id=t7.id and t1.id=t8.id) SET a=0, g=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t7, t8) ON (t1.id=t4.id and t1.id=t7.id and t1.id=t8.id) SET a=0, g=0 where t1.id=1''
 UPDATE t1 LEFT JOIN (t7, t8, t9) ON (t1.id=t7.id and t1.id=t8.id and t1.id=t9.id) SET a=0, g=0, h=0, i=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t7, t8, t9) ON (t1.id=t7.id and t1.id=t8.id and t1.id=t9.id) SET a=0, g=0, h=0, i=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t7, t8, t9) ON (t1.id=t7.id and t1.id=t8.id and t1.id=t9.id) SET a=0, g=0, h=0, i=0 where t1.id=1''
 UPDATE t7 LEFT JOIN (t1, t2, t3) ON (t7.id=t1.id and t7.id=t2.id and t7.id=t3.id) SET g=0, a=0, b=0, c=0 where t7.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t1, t2, t3) ON (t7.id=t1.id and t7.id=t2.id and t7.id=t3.id) SET g=0, a=0, b=0, c=0 where t7.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t1, t2, t3) ON (t7.id=t1.id and t7.id=t2.id and t7.id=t3.id) SET g=0, a=0, b=0, c=0 where t7.id=1''
 UPDATE t7 LEFT JOIN (t4, t5, t3) ON (t7.id=t4.id and t7.id=t5.id and t7.id=t3.id) SET g=0, c=0 where t7.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t4, t5, t3) ON (t7.id=t4.id and t7.id=t5.id and t7.id=t3.id) SET g=0, c=0 where t7.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t4, t5, t3) ON (t7.id=t4.id and t7.id=t5.id and t7.id=t3.id) SET g=0, c=0 where t7.id=1''
 UPDATE t7 LEFT JOIN (t8, t9, t3) ON (t7.id=t8.id and t7.id=t9.id and t7.id=t3.id) SET g=0, h=0, i=0, c=0 where t7.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t8, t9, t3) ON (t7.id=t8.id and t7.id=t9.id and t7.id=t3.id) SET g=0, h=0, i=0, c=0 where t7.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t8, t9, t3) ON (t7.id=t8.id and t7.id=t9.id and t7.id=t3.id) SET g=0, h=0, i=0, c=0 where t7.id=1''
 UPDATE t1 LEFT JOIN t4 ON (t1.id=t4.id) SET a=0, d=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN t4 ON (t1.id=t4.id) SET a=0, d=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN t4 ON (t1.id=t4.id) SET a=0, d=0 where t1.id=1''
 UPDATE t1 LEFT JOIN (t4, t5, t6) ON (t1.id=t4.id and t1.id=t5.id and t1.id=t6.id) SET a=0, d=0, e=0, f=0 where t1.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t5, t6) ON (t1.id=t4.id and t1.id=t5.id and t1.id=t6.id) SET a=0, d=0, e=0, f=0 where t1.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t1 LEFT JOIN (t4, t5, t6) ON (t1.id=t4.id and t1.id=t5.id and t1.id=t6.id) SET a=0, d=0, e=0, f=0 where t1.id=1''
 UPDATE t4 LEFT JOIN (t1, t5, t6) ON (t4.id=t1.id and t4.id=t5.id and t4.id=t6.id) SET a=0, e=0, f=0 where t4.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t4 LEFT JOIN (t1, t5, t6) ON (t4.id=t1.id and t4.id=t5.id and t4.id=t6.id) SET a=0, e=0, f=0 where t4.id=1''
+Last_SQL_Error = 'Table 'test.t4' doesn't exist, Error_code: 1146; Error 'Table 'test.t4' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t4 LEFT JOIN (t1, t5, t6) ON (t4.id=t1.id and t4.id=t5.id and t4.id=t6.id) SET a=0, e=0, f=0 where t4.id=1''
 UPDATE t7 LEFT JOIN (t1, t4, t2) ON (t7.id=t1.id and t7.id=t4.id and t7.id=t2.id) SET a=0, b=0, d=0, g=0 where t7.id=1;
 include/wait_for_slave_sql_error_and_skip.inc [errno=1146]
-Last_SQL_Error = 'Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t1, t4, t2) ON (t7.id=t1.id and t7.id=t4.id and t7.id=t2.id) SET a=0, b=0, d=0, g=0 where t7.id=1''
+Last_SQL_Error = 'Table 'test.t7' doesn't exist, Error_code: 1146; Error 'Table 'test.t7' doesn't exist' on query. Default database: 'test'. Query: 'UPDATE t7 LEFT JOIN (t1, t4, t2) ON (t7.id=t1.id and t7.id=t4.id and t7.id=t2.id) SET a=0, b=0, d=0, g=0 where t7.id=1''
 [on slave]
 show tables like 't%';
 Tables_in_test (t%)

=== modified file 'mysql-test/suite/rpl/r/rpl_idempotency.result'
--- a/mysql-test/suite/rpl/r/rpl_idempotency.result	2011-02-23 11:54:58 +0000
+++ b/mysql-test/suite/rpl/r/rpl_idempotency.result	2011-03-27 09:53:06 +0000
@@ -4,6 +4,8 @@ call mtr.add_suppression("Slave SQL.*Can
 call mtr.add_suppression("Slave SQL.*Cannot delete or update a parent row: a foreign key constraint fails .* Error_code: 1451");
 call mtr.add_suppression("Slave SQL.*Cannot add or update a child row: a foreign key constraint fails .* Error_code: 1452");
 call mtr.add_suppression("Slave SQL.*Could not execute Write_rows event on table test.* Duplicate entry .1. for key .PRIMARY.* Error_code: 1062");
+call mtr.add_suppression("Slave SQL: Could not execute Delete_rows event");
+call mtr.add_suppression("Slave SQL: Could not execute Update_rows event");
 CREATE TABLE t1 (a INT PRIMARY KEY);
 CREATE TABLE t2 (a INT);
 INSERT INTO t1 VALUES (-1),(-2),(-3);

=== modified file 'mysql-test/suite/rpl/r/rpl_init_slave_errors.result'
--- a/mysql-test/suite/rpl/r/rpl_init_slave_errors.result	2011-02-23 09:31:37 +0000
+++ b/mysql-test/suite/rpl/r/rpl_init_slave_errors.result	2011-03-27 09:53:06 +0000
@@ -12,7 +12,7 @@ reset slave;
 SET GLOBAL init_slave= "garbage";
 start slave;
 include/wait_for_slave_sql_error.inc [errno=1064]
-Last_SQL_Error = 'Slave SQL thread aborted. Can't execute init_slave query'
+Last_SQL_Error = 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'garbage' at line 1, Error_code: 1064; Slave SQL thread aborted. Can't execute init_slave query'
 SET GLOBAL init_slave= "";
 include/stop_slave_io.inc
 RESET SLAVE;

=== modified file 'mysql-test/suite/rpl/r/rpl_known_bugs_detection.result'
--- a/mysql-test/suite/rpl/r/rpl_known_bugs_detection.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_known_bugs_detection.result	2011-03-27 09:53:06 +0000
@@ -9,7 +9,7 @@ a	b
 2	2
 call mtr.add_suppression("Slave SQL.*suffer.*http:..bugs.mysql.com.bug.php.id=24432");
 include/wait_for_slave_sql_error.inc [errno=1105]
-Last_SQL_Error = 'Error 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info' on query. Default database: 'test'. Query: 'INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10''
+Last_SQL_Error = 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info, Error_code: 1105; According to the master's version ('5.0.34'), it is probable that master suffers from this bug: http://bugs.mysql.com/bug.php?id=24432 and thus replicating the current binary log event may make the slave's data become different from the master's data. To take no risk, slave refuses to replicate this event and stops. We recommend that all updates be stopped on the master and slave, that the data of both be manually synchronized, that master's binary logs be deleted, that master be upgraded to a version at l, Error_code: 1105; Error 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info' on query. Default database: 'test'. Query: 'INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10''
 SELECT * FROM t1;
 a	b
 stop slave;
@@ -57,7 +57,7 @@ id	field_1	field_2	field_3
 5	5	e	5e
 6	6	f	6f
 include/wait_for_slave_sql_error.inc [errno=1105]
-Last_SQL_Error = 'Error 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info' on query. Default database: 'test'. Query: 'INSERT INTO t1 (field_1, field_2, field_3)
+Last_SQL_Error = 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info, Error_code: 1105; According to the master's version ('5.0.34'), it is probable that master suffers from this bug: http://bugs.mysql.com/bug.php?id=24432 and thus replicating the current binary log event may make the slave's data become different from the master's data. To take no risk, slave refuses to replicate this event and stops. We recommend that all updates be stopped on the master and slave, that the data of both be manually synchronized, that master's binary logs be deleted, that master be upgraded to a version at l, Error_code: 1105; Error 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info' on query. Default database: 'test'. Query: 'INSERT INTO t1 (field_1, field_2, field_3)
 SELECT t2.field_a, t2.field_b, t2.field_c
 FROM t2
 ON DUPLICATE KEY UPDATE

=== modified file 'mysql-test/suite/rpl/r/rpl_loaddata.result'
--- a/mysql-test/suite/rpl/r/rpl_loaddata.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_loaddata.result	2011-03-27 09:53:06 +0000
@@ -28,7 +28,7 @@ create table t1(a int, b int, unique(b))
 insert into t1 values(1,10);
 load data infile '../../std_data/rpl_loaddata.dat' into table t1;
 call mtr.add_suppression("Slave SQL.*Error .Duplicate entry .10. for key .b.. on query.* Error_code: 1062");
-call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 0");
+call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 1105");
 include/wait_for_slave_sql_error_and_skip.inc [errno=1062]
 include/check_slave_no_error.inc
 set sql_log_bin=0;
@@ -72,7 +72,7 @@ load data infile '../../std_data/rpl_loa
 terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
 '\n##\n' starting by '>' ignore 1 lines;
 ERROR 23000: Duplicate entry '2003-03-22' for key 'day'
-include/wait_for_slave_sql_error.inc [errno=0]
+include/wait_for_slave_sql_error.inc [errno=1105]
 drop table t1, t2;
 drop table t1, t2;
 CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;

=== modified file 'mysql-test/suite/rpl/r/rpl_packet.result'
--- a/mysql-test/suite/rpl/r/rpl_packet.result	2010-12-19 17:22:30 +0000
+++ b/mysql-test/suite/rpl/r/rpl_packet.result	2011-03-27 09:53:06 +0000
@@ -30,7 +30,7 @@ include/start_slave.inc
 CREATE TABLE `t1` (`f1` LONGTEXT) ENGINE=MyISAM;
 INSERT INTO `t1`(`f1`) VALUES ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2048');
 include/wait_for_slave_io_error.inc [errno=1153]
-Last_IO_Error = 'Got a packet bigger than 'max_allowed_packet' bytes'
+Last_IO_Error = 'Got a packet bigger than 'max_allowed_packet' bytes, Error_code: 1153; Got a packet bigger than 'max_allowed_packet' bytes'
 include/stop_slave_sql.inc
 include/rpl_reset.inc
 DROP TABLE t1;
@@ -65,7 +65,7 @@ CREATE TABLE t1 (a TEXT) ENGINE=MyISAM;
 INSERT INTO t1 VALUES (REPEAT('a', 2048));
 # 1153 = ER_NET_PACKET_TOO_LARGE
 include/wait_for_slave_io_error.inc [errno=1153]
-Last_IO_Error = 'Got a packet bigger than 'max_allowed_packet' bytes'
+Last_IO_Error = 'Got a packet bigger than 'max_allowed_packet' bytes, Error_code: 1153; Got a packet bigger than 'max_allowed_packet' bytes'
 # Record Read_Master_Log_Pos for the Table_map_log_event
 SET @@global.max_allowed_packet=1048576;
 WARNING: The range of printed events ends with a row event or a table map event that does not have the STMT_END_F flag set. This might be because the last statement was not fully written to the log, or because you are using a --stop-position or --stop-datetime that refers to an event in the middle of a statement. The event(s) from the partial statement have not been written to output.

=== modified file 'mysql-test/suite/rpl/r/rpl_row_conflicts.result'
--- a/mysql-test/suite/rpl/r/rpl_row_conflicts.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_conflicts.result	2011-03-27 09:53:06 +0000
@@ -22,7 +22,7 @@ a
 ---- Wait until slave stops with an error ----
 include/wait_for_slave_sql_error.inc [errno=1062]
 Last_SQL_Error (expected "duplicate key" error)
-Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log master-bin.000001, end_log_pos END_LOG_POS
+Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log master-bin.000001, end_log_pos END_LOG_POS
 call mtr.add_suppression("Slave SQL.*Duplicate entry .1. for key .PRIMARY.* Error_code: 1062");
 SELECT * FROM t1;
 a
@@ -53,7 +53,7 @@ a
 call mtr.add_suppression("Slave SQL.*Can.t find record in .t1., Error_code: 1032");
 include/wait_for_slave_sql_error.inc [errno=1032]
 Last_SQL_Error (expected "duplicate key" error)
-Could not execute Delete_rows event on table test.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log master-bin.000001, end_log_pos END_LOG_POS
+Can't find record in 't1', Error_code: 1032; Could not execute Delete_rows event on table test.t1; Can't find record in 't1', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log master-bin.000001, end_log_pos END_LOG_POS
 SELECT * FROM t1;
 a
 ---- Resolve the conflict on the slave and restart SQL thread ----

=== modified file 'mysql-test/suite/rpl/r/rpl_stm_EE_err2.result'
--- a/mysql-test/suite/rpl/r/rpl_stm_EE_err2.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_stm_EE_err2.result	2011-03-27 09:53:06 +0000
@@ -7,9 +7,9 @@ set sql_log_bin=1;
 insert into t1 values(1),(2);
 ERROR 23000: Duplicate entry '2' for key 'a'
 drop table t1;
-call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.* error code=1062.*Error on slave:.* Error_code: 0");
+call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.* error code=1062.*Error on slave:.* Error_code: 1105");
 (expect different error codes on master and slave)
-include/wait_for_slave_sql_error.inc [errno=0]
+include/wait_for_slave_sql_error.inc [errno=1105]
 Last_SQL_Error = 'Query caused different errors on master and slave.     Error on master: message (format)='Duplicate entry '%-.192s' for key %d' error code=1062 ; Error on slave: actual message='no error', error code=0. Default database: 'test'. Query: 'insert into t1 values(1),(2)''
 drop table t1;
 include/stop_slave.inc

=== modified file 'mysql-test/suite/rpl/r/rpl_stm_conflicts.result'
--- a/mysql-test/suite/rpl/r/rpl_stm_conflicts.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_stm_conflicts.result	2011-03-27 09:53:06 +0000
@@ -17,7 +17,7 @@ a
 ---- Wait until slave stops with an error ----
 include/wait_for_slave_sql_error.inc [errno=1062]
 Last_SQL_Error (expected "duplicate key" error)
-Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'INSERT INTO t1 VALUES (1)'
+Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'INSERT INTO t1 VALUES (1)'
 call mtr.add_suppression("Slave SQL.*Duplicate entry .1. for key .PRIMARY.* Error_code: 1062");
 SELECT * FROM t1;
 a

=== modified file 'mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result'
--- a/mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result	2011-02-23 20:01:27 +0000
+++ b/mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result	2011-03-27 09:53:06 +0000
@@ -44,7 +44,7 @@ create table t1(a int, b int, unique(b))
 insert into t1 values(1,10);
 load data CONCURRENT infile '../../std_data/rpl_loaddata.dat' into table t1;
 call mtr.add_suppression("Slave SQL.*Error .Duplicate entry .10. for key .b.. on query.* Error_code: 1062");
-call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 0");
+call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 1105");
 include/wait_for_slave_sql_error_and_skip.inc [errno=1062]
 include/check_slave_no_error.inc
 set sql_log_bin=0;
@@ -88,7 +88,7 @@ load data CONCURRENT infile '../../std_d
 terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
 '\n##\n' starting by '>' ignore 1 lines;
 ERROR 23000: Duplicate entry '2003-03-22' for key 'day'
-include/wait_for_slave_sql_error.inc [errno=0]
+include/wait_for_slave_sql_error.inc [errno=1105]
 drop table t1, t2;
 drop table t1, t2;
 CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;

=== modified file 'mysql-test/suite/rpl/t/rpl_idempotency.test'
--- a/mysql-test/suite/rpl/t/rpl_idempotency.test	2011-02-23 11:54:58 +0000
+++ b/mysql-test/suite/rpl/t/rpl_idempotency.test	2011-03-27 09:53:06 +0000
@@ -8,6 +8,8 @@ call mtr.add_suppression("Slave SQL.*Can
 call mtr.add_suppression("Slave SQL.*Cannot delete or update a parent row: a foreign key constraint fails .* Error_code: 1451");
 call mtr.add_suppression("Slave SQL.*Cannot add or update a child row: a foreign key constraint fails .* Error_code: 1452");
 call mtr.add_suppression("Slave SQL.*Could not execute Write_rows event on table test.* Duplicate entry .1. for key .PRIMARY.* Error_code: 1062");
+call mtr.add_suppression("Slave SQL: Could not execute Delete_rows event");
+call mtr.add_suppression("Slave SQL: Could not execute Update_rows event");
 
 connection master;
 CREATE TABLE t1 (a INT PRIMARY KEY);

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2011-03-14 17:09:16 +0000
+++ b/sql/log_event.cc	2011-03-27 09:53:06 +0000
@@ -293,13 +293,6 @@ static void pretty_print_str(IO_CACHE* c
 
 #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
 
-static void clear_all_errors(THD *thd, Relay_log_info *rli)
-{
-  thd->is_slave_error = 0;
-  thd->clear_error();
-  rli->clear_error();
-}
-
 inline int idempotent_error_code(int err_code)
 {
   int ret= 0;
@@ -3700,7 +3693,7 @@ compare_errors:
         !ignored_error_code(actual_error) &&
         !ignored_error_code(expected_error))
     {
-      rli->report(ERROR_LEVEL, 0,
+      rli->report(ERROR_LEVEL, ER_UNKNOWN_ERROR,
                       "\
 Query caused different errors on master and slave.     \
 Error on master: message (format)='%s' error code=%d ; \

=== modified file 'sql/rpl_reporting.cc'
--- a/sql/rpl_reporting.cc	2010-08-05 17:45:25 +0000
+++ b/sql/rpl_reporting.cc	2011-03-27 09:53:06 +0000
@@ -17,6 +17,7 @@
 #include "rpl_reporting.h"
 #include "log.h" // sql_print_error, sql_print_warning,
                  // sql_print_information
+#include "rpl_slave.h"
 
 Slave_reporting_capability::Slave_reporting_capability(char const *thread_name)
   : m_thread_name(thread_name)
@@ -25,54 +26,159 @@ Slave_reporting_capability::Slave_report
                    &err_lock, MY_MUTEX_INIT_FAST);
 }
 
+/**
+   The method treats a supplied message depending on the level:
+
+       - an error is queued in the diagnostic area 
+         to be recorded eventually in Show Slave status area and
+         in the error log.
+       - a warning or an info level are optinally (log_warnings)
+         stored into the error log
+
+   @param level     severity of the message.
+   @param err_code  the user level error code
+   @param msg       the format string of the message,
+                    can be followed with more arguments
+                    providing the data for the format string
+
+   @note Queueing in the da is protected by @err_lock mutex
+         to collabote with a concurrent reader from the da.
+*/
 void
 Slave_reporting_capability::report(loglevel level, int err_code,
                                    const char *msg, ...) const
 {
+/* 
+   todo: sort out embedded building dependencies to avoid this module
+   to be compiled altogether.
+*/
+#if !defined(EMBEDDED_LIBRARY)
+  THD *thd= current_thd;
   void (*report_function)(const char *, ...);
-  char buff[MAX_SLAVE_ERRMSG];
+  char buff[sizeof(m_last_error.message)];
   char *pbuff= buff;
-  uint pbuffsize= sizeof(buff);
   va_list args;
+
+  if (level == ERROR_LEVEL && has_temporary_error(thd, err_code))
+    level= WARNING_LEVEL;
+
   va_start(args, msg);
+  my_vsnprintf(pbuff, sizeof(buff), msg, args);
+  va_end(args);
 
   mysql_mutex_lock(&err_lock);
   switch (level)
   {
   case ERROR_LEVEL:
     /*
-      It's an error, it must be reported in Last_error and Last_errno in SHOW
-      SLAVE STATUS.
+      It's an error, it goes in a slave thread's main_da.
     */
-    pbuff= m_last_error.message;
-    pbuffsize= sizeof(m_last_error.message);
-    m_last_error.number = err_code;
+    m_last_error.number= err_code;
     m_last_error.update_timestamp();
+    if (err_code > 0)
+    {
+      if (thd->stmt_da->is_set())
+        thd->stmt_da->can_overwrite_status= TRUE;
+      my_printf_error(err_code, "%s", MYF(0), pbuff);
+      if (thd->stmt_da->can_overwrite_status)
+        thd->stmt_da->can_overwrite_status= FALSE;
+    }
     report_function= sql_print_error;
     break;
   case WARNING_LEVEL:
-    report_function= sql_print_warning;
+    report_function= global_system_variables.log_warnings?
+      sql_print_warning : NULL;
     break;
   case INFORMATION_LEVEL:
-    report_function= sql_print_information;
+    report_function= global_system_variables.log_warnings?
+      sql_print_information : NULL;
     break;
   default:
     DBUG_ASSERT(0);                            // should not come here
     return;          // don't crash production builds, just do nothing
   }
 
-  my_vsnprintf(pbuff, pbuffsize, msg, args);
-
+  /* If the msg string ends with '.', do not add a ',' it would be ugly */
+  if (report_function)
+    report_function("Slave %s: %s%s Error_code: %d",
+                    m_thread_name, pbuff,
+                    (pbuff[0] && *(strend(pbuff) - 1) == '.') ? "" : ",",
+                    err_code);
   mysql_mutex_unlock(&err_lock);
+#endif
+}
+
+/**
+   compose Last_Error to be shown by SHOW SLAVE STATUS
+
+   @param err_code    The summary error code to display. If zero
+                      the last reported default will be set to Last*Errno
+
+   @param msg         The summary message's format string optinally followed
+                      by arguments. It can be NULL.
+
+   @note  The method tries gathering all queued *error-level* messages
+          into the limited-size buffer and may not compose the whole
+          list. In that case the rest can be found anyway in the error log.
+          The Last_Error's code corresponds to the last queued error if
+          the supplied @c err_code is zero.
+          
+          The gathering procedure is protected by @c err_lock
+          to provide collaboration with a concurrent reader such as
+          show slave status.
+*/
+void
+Slave_reporting_capability::display(int err_code, const char *msg, ...) const
+{
+#if !defined(EMBEDDED_LIBRARY)
+  THD *thd= current_thd;
+  uint len, size= sizeof(m_last_error.message);
+  char *slider, *buff= m_last_error.message, *buff_end= buff + size;
+  List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
+  MYSQL_ERROR *err;
+  uint32 err_number;
+  const char err_code_fmt[]= ", Error_code: %d; ";
+  va_list args;
+
+  va_start(args, msg);
+  len= msg == NULL? 0 : my_vsnprintf(buff, size, msg, args);
   va_end(args);
 
-  /* If the msg string ends with '.', do not add a ',' it would be ugly */
-  report_function("Slave %s: %s%s Error_code: %d",
-                  m_thread_name, pbuff,
-                  (pbuff[0] && *(strend(pbuff)-1) == '.') ? "" : ",",
-                  err_code);
+  if (thd->is_error())
+  {
+    mysql_mutex_lock(&err_lock);
+    /*
+      In case of multiple errors the error codes are printed along with msgs ...
+    */
+    for (err= it++, err_number= 0, slider= buff + len; err;
+         slider += len, err= it++)
+    {
+      if (err->get_level() != MYSQL_ERROR::WARN_LEVEL_ERROR)
+        continue;
+      if (err_number != 0)
+      {
+        len= my_snprintf(slider, buff_end - slider, err_code_fmt, err_number);
+        slider += len;
+      }
+      err_number= err->get_sql_errno();    // Last*Errno is of the error level
+      if (slider < buff_end)
+        len= my_snprintf(slider, buff_end - slider,"%s", err->get_message_text());
+    }
+    m_last_error.number= err_code == 0? err_number : err_code;
+    /*
+      ... except for the last error if its code is equal to @c err_code
+      the supplied summary's.
+    */
+    if ((err_number != 0 && err_number != m_last_error.number) &&
+        slider < buff_end)
+      my_snprintf(slider, buff_end - slider, err_code_fmt, err_number);
+    
+    mysql_mutex_unlock(&err_lock);
+  }
+#endif
 }
 
+
 Slave_reporting_capability::~Slave_reporting_capability()
 {
   mysql_mutex_destroy(&err_lock);

=== modified file 'sql/rpl_reporting.h'
--- a/sql/rpl_reporting.h	2010-08-05 17:45:25 +0000
+++ b/sql/rpl_reporting.h	2011-03-27 09:53:06 +0000
@@ -43,8 +43,7 @@ public:
   Slave_reporting_capability(char const *thread_name);
 
   /**
-     Writes a message and, if it's an error message, to Last_Error
-     (which will be displayed by SHOW SLAVE STATUS).
+     Writes a message into diag area and/or/either the error log
 
      @param level       The severity level
      @param err_code    The error code
@@ -56,6 +55,14 @@ public:
     ATTRIBUTE_FORMAT(printf, 4, 5);
 
   /**
+     compose Last_Error to be shown by SHOW SLAVE STATUS
+     @param err_code    The summary code to display instead of the last reported
+     @param msg         A summary message to set afront of the reported errors
+  */
+  void display(int err_code, const char *msg, ...) const
+    ATTRIBUTE_FORMAT(printf, 3, 4);
+
+  /**
      Clear errors. They will not show up under <code>SHOW SLAVE
      STATUS</code>.
    */

=== modified file 'sql/rpl_slave.cc'
--- a/sql/rpl_slave.cc	2011-03-17 13:20:36 +0000
+++ b/sql/rpl_slave.cc	2011-03-27 09:53:06 +0000
@@ -2514,15 +2514,23 @@ static ulong read_event(MYSQL* mysql, Ma
   DBUG_RETURN(len - 1);
 }
 
-/*
+/**
   Check if the current error is of temporary nature of not.
   Some errors are temporary in nature, such as
   ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT.  Ndb also signals
   that the error is temporary by pushing a warning with the error code
   ER_GET_TEMPORARY_ERRMSG, if the originating error is temporary.
+
+  @param      thd  a THD instance, typically of the slave SQL thread's.
+  @error_arg  the error code for assessment. 
+              defaults to zero which makes the function check the top
+              of the reported errors stack.
+
+  @return 1 as the positive and 0 as the negative verdict
 */
-static int has_temporary_error(THD *thd)
+int has_temporary_error(THD *thd, uint error_arg)
 {
+  uint error;
   DBUG_ENTER("has_temporary_error");
 
   DBUG_EXECUTE_IF("all_errors_are_temporary_errors",
@@ -2537,16 +2545,17 @@ static int has_temporary_error(THD *thd)
     error or not. This is currently the case for Incident_log_event,
     which sets no message. Return FALSE.
   */
-  if (!thd->is_error())
+  if (thd->is_fatal_error || !thd->is_error())
     DBUG_RETURN(0);
 
+  error= (error_arg == 0)? thd->stmt_da->sql_errno() : error_arg;
+
   /*
     Temporary error codes:
     currently, InnoDB deadlock detected by InnoDB or lock
     wait timeout (innodb_lock_wait_timeout exceeded
   */
-  if (thd->stmt_da->sql_errno() == ER_LOCK_DEADLOCK ||
-      thd->stmt_da->sql_errno() == ER_LOCK_WAIT_TIMEOUT)
+  if (error == ER_LOCK_DEADLOCK || error == ER_LOCK_WAIT_TIMEOUT)
     DBUG_RETURN(1);
 
 #ifdef HAVE_NDB_BINLOG
@@ -2637,6 +2646,13 @@ static int sql_delay_event(Log_event *ev
   DBUG_RETURN(0);
 }
 
+void clear_all_errors(THD *thd, Relay_log_info *rli)
+{
+  thd->is_slave_error = 0;
+  thd->clear_error();
+  rli->clear_error();
+}
+
 
 /**
   Applies the given event and advances the relay log position.
@@ -3007,10 +3023,13 @@ static int exec_relay_log_event(THD* thd
           }
         }
         else
+        {
           sql_print_error("Slave SQL thread retried transaction %lu time(s) "
                           "in vain, giving up. Consider raising the value of "
                           "the slave_transaction_retries variable.",
                           slave_trans_retries);
+          thd->is_fatal_error= 1; // to force has_temporary_error() return 0
+        }
       }
       else if ((exec_res && !temp_err) ||
                (opt_using_transactions &&
@@ -3049,6 +3068,12 @@ static bool check_io_slave_killed(THD *t
   {
     if (info && global_system_variables.log_warnings)
       sql_print_information("%s", info);
+    /*
+      don't expose internal errors such as ER_NET_READ_ERROR 1158.
+      The thread is gracefully stopped.
+    */
+    if (mi->abort_slave)
+      thd->clear_error();
     return TRUE;
   }
   return FALSE;
@@ -3240,14 +3265,15 @@ pthread_handler_t handle_slave_io(void *
 
 connected:
 
-    DBUG_EXECUTE_IF("dbug.before_get_running_status_yes",
-                    {
-                      const char act[]=
-                        "now "
-                        "wait_for signal.io_thread_let_running";
-                      DBUG_ASSERT(opt_debug_sync_timeout > 0);
-                      DBUG_ASSERT(!debug_sync_set_action(thd, 
-                                                         STRING_WITH_LEN(act)));
+  thd->clear_error();
+  DBUG_EXECUTE_IF("dbug.before_get_running_status_yes",
+                  {
+                    const char act[]=
+                      "now "
+                      "wait_for signal.io_thread_let_running";
+                    DBUG_ASSERT(opt_debug_sync_timeout > 0);
+                    DBUG_ASSERT(!debug_sync_set_action(thd, 
+                                                       STRING_WITH_LEN(act)));
                     };);
   mysql_mutex_lock(&mi->run_lock);
   mi->slave_running= MYSQL_SLAVE_RUN_CONNECT;
@@ -3491,6 +3517,7 @@ err:
     mi->mysql=0;
   }
   write_ignored_events_info_to_relay_log(thd, mi);
+  mi->display(0, NULL);
   thd_proc_info(thd, "Waiting for slave mutex on exit");
   mysql_mutex_lock(&mi->run_lock);
 
@@ -3776,53 +3803,22 @@ log '%s' at position %s, relay log '%s' 
       if (!sql_slave_killed(thd,rli))
       {
         /*
-          retrieve as much info as possible from the thd and, error
-          codes and warnings and print this to the error log as to
-          allow the user to locate the error
+          Reporting all gather errors while executing exec_relay_log_event()
+          analogously send_error()
+        */ 
+        rli->display(0, NULL);
+
+        /* 
+           Any warnings issued has been already printed.
+           Take a special care of UDF.
         */
-        uint32 const last_errno= rli->last_error().number;
-
-        if (thd->is_error())
-        {
-          char const *const errmsg= thd->stmt_da->message();
-
-          DBUG_PRINT("info",
-                     ("thd->stmt_da->sql_errno()=%d; rli->last_error.number=%d",
-                      thd->stmt_da->sql_errno(), last_errno));
-          if (last_errno == 0)
-          {
-            /*
- 	      This function is reporting an error which was not reported
- 	      while executing exec_relay_log_event().
- 	    */ 
-            rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(), "%s", errmsg);
-          }
-          else if (last_errno != thd->stmt_da->sql_errno())
-          {
-            /*
-             * An error was reported while executing exec_relay_log_event()
-             * however the error code differs from what is in the thread.
-             * This function prints out more information to help finding
-             * what caused the problem.
-             */  
-            sql_print_error("Slave (additional info): %s Error_code: %d",
-                            errmsg, thd->stmt_da->sql_errno());
-          }
-        }
-
-        /* Print any warnings issued */
         List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
         MYSQL_ERROR *err;
-        /*
-          Added controlled slave thread cancel for replication
-          of user-defined variables.
-        */
         bool udf_error = false;
         while ((err= it++))
         {
           if (err->get_sql_errno() == ER_CANT_OPEN_LIBRARY)
             udf_error = true;
-          sql_print_warning("Slave: %s Error_code: %d", err->get_message_text(), err->get_sql_errno());
         }
         if (udf_error)
           sql_print_error("Error loading user-defined library, slave SQL "
@@ -3839,6 +3835,14 @@ llstr(rli->get_group_master_log_pos(), l
       }
       goto err;
     }
+    else
+    {
+      /*
+        Event applying succeeded, reset errors and diag area status
+      */
+      clear_all_errors(thd, const_cast<Relay_log_info*>(rli));
+      thd->stmt_da->reset_diagnostics_area();
+    }
   }
 
   /* Thread stopped. Print the current replication position to the log */
@@ -3849,6 +3853,7 @@ llstr(rli->get_group_master_log_pos(), l
 
  err:
 
+  rli->display(0, NULL);
   /*
     Some events set some playgrounds, which won't be cleared because thread
     stops. Stopping of this thread may not be known to these events ("stop"

=== modified file 'sql/rpl_slave.h'
--- a/sql/rpl_slave.h	2011-02-16 17:13:30 +0000
+++ b/sql/rpl_slave.h	2011-03-27 09:53:06 +0000
@@ -213,6 +213,8 @@ void set_slave_thread_options(THD* thd);
 void set_slave_thread_default_charset(THD *thd, Relay_log_info const *rli);
 int apply_event_and_update_pos(Log_event* ev, THD* thd, Relay_log_info* rli);
 int rotate_relay_log(Master_info* mi);
+int has_temporary_error(THD *thd, uint err= 0);
+void clear_all_errors(THD *thd, Relay_log_info *rli);
 
 pthread_handler_t handle_slave_io(void *arg);
 pthread_handler_t handle_slave_sql(void *arg);


Attachment: [text/bzr-bundle] bzr/andrei.elkin@oracle.com-20110327095306-xr3uy8tru6s00u3x.bundle
Thread
bzr commit into mysql-trunk branch (andrei.elkin:3311) Bug#11748510Andrei Elkin27 Mar