diff --git a/sql/log_event.cc b/sql/log_event.cc index 9f3b4c4e487c995cb8366c7583ce6ee8a5698263..cfac7df21a8c566b4923027879dece8b82e1deb1 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -7602,7 +7602,7 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) DBUG_RETURN(error); } - // We can't use pisition() - try other methods. + // We can't use position() - try other methods. /* We need to retrieve all fields @@ -7610,6 +7610,12 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) */ table->use_all_columns(); + /* + Save copy of the record in table->record[1]. It might be needed + later if linear search is used to find exact match. + */ + store_record(table,record[1]); + if (table->s->keys > 0) { DBUG_PRINT("info",("locating record using primary key (index_read)")); @@ -7643,8 +7649,9 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) */ my_ptrdiff_t const pos= table->s->null_bytes > 0 ? table->s->null_bytes - 1 : 0; - table->record[1][pos]= 0xFF; - if ((error= table->file->index_read_map(table->record[1], m_key, + table->record[0][pos]= 0xFF; + + if ((error= table->file->index_read_map(table->record[0], m_key, HA_WHOLE_KEY, HA_READ_KEY_EXACT))) { @@ -7684,8 +7691,8 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) /* In case key is not unique, we still have to iterate over records found - and find the one which is identical to the row given. The row is unpacked - in record[1] where missing columns are filled with default values. + and find the one which is identical to the row given. A copy of the + record we are looking for is stored in record[1]. */ DBUG_PRINT("info",("non-unique index, scanning it to find matching record")); @@ -7702,11 +7709,11 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) */ if (table->s->null_bytes > 0) { - table->record[1][table->s->null_bytes - 1]|= + table->record[0][table->s->null_bytes - 1]|= 256U - (1U << table->s->last_null_bit_pos); } - if ((error= table->file->index_next(table->record[1]))) + if ((error= table->file->index_next(table->record[0]))) { DBUG_PRINT("info",("no record matching the given row found")); table->file->print_error(error, MYF(0)); @@ -7738,13 +7745,11 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) /* Continue until we find the right record or have made a full loop */ do { - error= table->file->rnd_next(table->record[1]); + error= table->file->rnd_next(table->record[0]); switch (error) { case 0: - DBUG_DUMP("record found", table->record[0], table->s->reclength); - case HA_ERR_RECORD_DELETED: break; @@ -7773,6 +7778,8 @@ int Rows_log_event::find_row(const RELAY_LOG_INFO *rli) */ if (restart_count == 2) DBUG_PRINT("info", ("Record not found")); + else + DBUG_DUMP("record found", table->record[0], table->s->reclength); table->file->ha_rnd_end(); DBUG_ASSERT(error == HA_ERR_END_OF_FILE || error == 0);