Loading include/my_base.h +3 −1 Original line number Diff line number Diff line Loading @@ -411,7 +411,9 @@ enum ha_base_keytype { statement */ #define HA_ERR_CORRUPT_EVENT 171 /* The event was corrupt, leading to illegal data being read */ #define HA_ERR_LAST 171 /*Copy last error nr.*/ #define HA_ERR_ROWS_EVENT_APPLY 172 /* The event could not be processed no other hanlder error happened */ #define HA_ERR_LAST 172 /*Copy last error nr.*/ /* Add error numbers before HA_ERR_LAST and change it accordingly. */ #define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) Loading mysql-test/extra/rpl_tests/rpl_row_tabledefs.test +3 −3 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ ALTER TABLE t1_bit ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test'; # ... and add one non-nullable INT column last in table 't1_text' # with no default, ALTER TABLE t1_nodef ADD x INT NOT NULL; ALTER TABLE t1_nodef ADD x INT NOT NULL, ADD y INT NOT NULL, ADD z INT NOT NULL; # ... and remove the last column in t2 ALTER TABLE t2 DROP b; # ... change the type of the single column in table 't4' Loading Loading @@ -222,8 +222,8 @@ sync_slave_with_master; --echo **** On Slave **** connection slave; INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); INSERT INTO t1_nodef VALUES (1,2,3,4,5); INSERT INTO t1_nodef VALUES (2,4,6,8,10); --echo **** On Master **** connection master; Loading sql/log_event.cc +40 −12 Original line number Diff line number Diff line Loading @@ -99,12 +99,23 @@ static const char *HA_ERR(int i) case HA_ERR_RECORD_IS_THE_SAME: return "HA_ERR_RECORD_IS_THE_SAME"; case HA_ERR_LOGGING_IMPOSSIBLE: return "HA_ERR_LOGGING_IMPOSSIBLE"; case HA_ERR_CORRUPT_EVENT: return "HA_ERR_CORRUPT_EVENT"; case HA_ERR_ROWS_EVENT_APPLY : return "HA_ERR_ROWS_EVENT_APPLY"; } return 0; } /** macro to call from different branches of Rows_log_event::do_apply_event Error reporting facility for Rows_log_event::do_apply_event @param level error, warning or info @param ha_error HA_ERR_ code @param rli pointer to the active Relay_log_info instance @param thd pointer to the slave thread's thd @param table pointer to the event's table object @param type the type of the event @param log_name the master binlog file name @param pos the master binlog file pos (the next after the event) */ static void inline slave_rows_error_report(enum loglevel level, int ha_error, Relay_log_info const *rli, THD *thd, Loading @@ -112,14 +123,27 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error, const char *log_name, ulong pos) { const char *handler_error= HA_ERR(ha_error); char buff[MAX_SLAVE_ERRMSG], *slider; const char *buff_end= buff + sizeof(buff); uint len; List_iterator_fast<MYSQL_ERROR> it(thd->warn_list); MYSQL_ERROR *err; buff[0]= 0; for (err= it++, slider= buff; err && slider < buff_end - 1; slider += len, err= it++) { len= my_snprintf(slider, buff_end - slider, " %s, Error_code: %d;", err->msg, err->code); } rli->report(level, thd->net.last_errno, "Could not execute %s event on table %s.%s;" "%s%s handler error %s; " "%s handler error %s; " "the event's master log %s, end_log_pos %lu", type, table->s->db.str, table->s->table_name.str, thd->net.last_error[0] != 0 ? thd->net.last_error : "", thd->net.last_error[0] != 0 ? ";" : "", buff, handler_error == NULL? "<unknown>" : handler_error, log_name, pos); } Loading Loading @@ -7675,7 +7699,7 @@ Rows_log_event::write_row(const Relay_log_info *const rli, /* fill table->record[0] with default values */ if ((error= prepare_record(rli, table, m_width, if ((error= prepare_record(table, m_width, TRUE /* check if columns have def. values */))) DBUG_RETURN(error); Loading Loading @@ -7990,12 +8014,16 @@ int Rows_log_event::find_row(const Relay_log_info *rli) DBUG_ASSERT(m_table && m_table->in_use != NULL); TABLE *table= m_table; int error; int error= 0; /* unpack row - missing fields get default values */ /* rpl_row_tabledefs.test specifies that if the extra field on the slave does not have a default value and this is okay with Delete or Update events. Todo: fix wl3228 hld that requires defauls for all types of events */ // TODO: shall we check and report errors here? prepare_record(NULL,table,m_width,FALSE /* don't check errors */); prepare_record(table, m_width, FALSE); error= unpack_current_row(rli); #ifndef DBUG_OFF Loading sql/log_event.h +2 −0 Original line number Diff line number Diff line Loading @@ -3131,6 +3131,8 @@ class Rows_log_event : public Log_event ASSERT_OR_RETURN_ERROR(m_curr_row < m_rows_end, HA_ERR_CORRUPT_EVENT); int const result= ::unpack_row(rli, m_table, m_width, m_curr_row, &m_cols, &m_curr_row_end, &m_master_reclength); if (m_curr_row_end > m_rows_end) my_error(ER_SLAVE_CORRUPT_EVENT, MYF(0)); ASSERT_OR_RETURN_ERROR(m_curr_row_end <= m_rows_end, HA_ERR_CORRUPT_EVENT); return result; } Loading sql/log_event_old.cc +2 −2 Original line number Diff line number Diff line Loading @@ -2077,7 +2077,7 @@ Old_rows_log_event::write_row(const Relay_log_info *const rli, /* fill table->record[0] with default values */ if ((error= prepare_record(rli, table, m_width, if ((error= prepare_record(table, m_width, TRUE /* check if columns have def. values */))) DBUG_RETURN(error); Loading Loading @@ -2288,7 +2288,7 @@ int Old_rows_log_event::find_row(const Relay_log_info *rli) /* unpack row - missing fields get default values */ // TODO: shall we check and report errors here? prepare_record(NULL,table,m_width,FALSE /* don't check errors */); prepare_record(table, m_width, FALSE /* don't check errors */); error= unpack_current_row(rli); #ifndef DBUG_OFF Loading Loading
include/my_base.h +3 −1 Original line number Diff line number Diff line Loading @@ -411,7 +411,9 @@ enum ha_base_keytype { statement */ #define HA_ERR_CORRUPT_EVENT 171 /* The event was corrupt, leading to illegal data being read */ #define HA_ERR_LAST 171 /*Copy last error nr.*/ #define HA_ERR_ROWS_EVENT_APPLY 172 /* The event could not be processed no other hanlder error happened */ #define HA_ERR_LAST 172 /*Copy last error nr.*/ /* Add error numbers before HA_ERR_LAST and change it accordingly. */ #define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) Loading
mysql-test/extra/rpl_tests/rpl_row_tabledefs.test +3 −3 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ ALTER TABLE t1_bit ALTER TABLE t1_char ADD x CHAR(20) DEFAULT 'Just a test'; # ... and add one non-nullable INT column last in table 't1_text' # with no default, ALTER TABLE t1_nodef ADD x INT NOT NULL; ALTER TABLE t1_nodef ADD x INT NOT NULL, ADD y INT NOT NULL, ADD z INT NOT NULL; # ... and remove the last column in t2 ALTER TABLE t2 DROP b; # ... change the type of the single column in table 't4' Loading Loading @@ -222,8 +222,8 @@ sync_slave_with_master; --echo **** On Slave **** connection slave; INSERT INTO t1_nodef VALUES (1,2,3); INSERT INTO t1_nodef VALUES (2,4,6); INSERT INTO t1_nodef VALUES (1,2,3,4,5); INSERT INTO t1_nodef VALUES (2,4,6,8,10); --echo **** On Master **** connection master; Loading
sql/log_event.cc +40 −12 Original line number Diff line number Diff line Loading @@ -99,12 +99,23 @@ static const char *HA_ERR(int i) case HA_ERR_RECORD_IS_THE_SAME: return "HA_ERR_RECORD_IS_THE_SAME"; case HA_ERR_LOGGING_IMPOSSIBLE: return "HA_ERR_LOGGING_IMPOSSIBLE"; case HA_ERR_CORRUPT_EVENT: return "HA_ERR_CORRUPT_EVENT"; case HA_ERR_ROWS_EVENT_APPLY : return "HA_ERR_ROWS_EVENT_APPLY"; } return 0; } /** macro to call from different branches of Rows_log_event::do_apply_event Error reporting facility for Rows_log_event::do_apply_event @param level error, warning or info @param ha_error HA_ERR_ code @param rli pointer to the active Relay_log_info instance @param thd pointer to the slave thread's thd @param table pointer to the event's table object @param type the type of the event @param log_name the master binlog file name @param pos the master binlog file pos (the next after the event) */ static void inline slave_rows_error_report(enum loglevel level, int ha_error, Relay_log_info const *rli, THD *thd, Loading @@ -112,14 +123,27 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error, const char *log_name, ulong pos) { const char *handler_error= HA_ERR(ha_error); char buff[MAX_SLAVE_ERRMSG], *slider; const char *buff_end= buff + sizeof(buff); uint len; List_iterator_fast<MYSQL_ERROR> it(thd->warn_list); MYSQL_ERROR *err; buff[0]= 0; for (err= it++, slider= buff; err && slider < buff_end - 1; slider += len, err= it++) { len= my_snprintf(slider, buff_end - slider, " %s, Error_code: %d;", err->msg, err->code); } rli->report(level, thd->net.last_errno, "Could not execute %s event on table %s.%s;" "%s%s handler error %s; " "%s handler error %s; " "the event's master log %s, end_log_pos %lu", type, table->s->db.str, table->s->table_name.str, thd->net.last_error[0] != 0 ? thd->net.last_error : "", thd->net.last_error[0] != 0 ? ";" : "", buff, handler_error == NULL? "<unknown>" : handler_error, log_name, pos); } Loading Loading @@ -7675,7 +7699,7 @@ Rows_log_event::write_row(const Relay_log_info *const rli, /* fill table->record[0] with default values */ if ((error= prepare_record(rli, table, m_width, if ((error= prepare_record(table, m_width, TRUE /* check if columns have def. values */))) DBUG_RETURN(error); Loading Loading @@ -7990,12 +8014,16 @@ int Rows_log_event::find_row(const Relay_log_info *rli) DBUG_ASSERT(m_table && m_table->in_use != NULL); TABLE *table= m_table; int error; int error= 0; /* unpack row - missing fields get default values */ /* rpl_row_tabledefs.test specifies that if the extra field on the slave does not have a default value and this is okay with Delete or Update events. Todo: fix wl3228 hld that requires defauls for all types of events */ // TODO: shall we check and report errors here? prepare_record(NULL,table,m_width,FALSE /* don't check errors */); prepare_record(table, m_width, FALSE); error= unpack_current_row(rli); #ifndef DBUG_OFF Loading
sql/log_event.h +2 −0 Original line number Diff line number Diff line Loading @@ -3131,6 +3131,8 @@ class Rows_log_event : public Log_event ASSERT_OR_RETURN_ERROR(m_curr_row < m_rows_end, HA_ERR_CORRUPT_EVENT); int const result= ::unpack_row(rli, m_table, m_width, m_curr_row, &m_cols, &m_curr_row_end, &m_master_reclength); if (m_curr_row_end > m_rows_end) my_error(ER_SLAVE_CORRUPT_EVENT, MYF(0)); ASSERT_OR_RETURN_ERROR(m_curr_row_end <= m_rows_end, HA_ERR_CORRUPT_EVENT); return result; } Loading
sql/log_event_old.cc +2 −2 Original line number Diff line number Diff line Loading @@ -2077,7 +2077,7 @@ Old_rows_log_event::write_row(const Relay_log_info *const rli, /* fill table->record[0] with default values */ if ((error= prepare_record(rli, table, m_width, if ((error= prepare_record(table, m_width, TRUE /* check if columns have def. values */))) DBUG_RETURN(error); Loading Loading @@ -2288,7 +2288,7 @@ int Old_rows_log_event::find_row(const Relay_log_info *rli) /* unpack row - missing fields get default values */ // TODO: shall we check and report errors here? prepare_record(NULL,table,m_width,FALSE /* don't check errors */); prepare_record(table, m_width, FALSE /* don't check errors */); error= unpack_current_row(rli); #ifndef DBUG_OFF Loading