Commit 9910b732 authored by Satya Bodapati's avatar Satya Bodapati

Merge fix for BUG#16752251 from mysql-5.1 to mysql-5.5

parents 18b3f62e f166ec71
...@@ -1631,7 +1631,7 @@ btr_cur_upd_lock_and_undo( ...@@ -1631,7 +1631,7 @@ btr_cur_upd_lock_and_undo(
/***********************************************************//** /***********************************************************//**
Writes a redo log record of updating a record in-place. */ Writes a redo log record of updating a record in-place. */
UNIV_INLINE UNIV_INTERN
void void
btr_cur_update_in_place_log( btr_cur_update_in_place_log(
/*========================*/ /*========================*/
...@@ -1659,18 +1659,30 @@ btr_cur_update_in_place_log( ...@@ -1659,18 +1659,30 @@ btr_cur_update_in_place_log(
return; return;
} }
/* The code below assumes index is a clustered index: change index to /* For secondary indexes, we could skip writing the dummy system fields
the clustered index if we are updating a secondary index record (or we to the redo log but we have to change redo log parsing of
could as well skip writing the sys col values to the log in this case MLOG_REC_UPDATE_IN_PLACE/MLOG_COMP_REC_UPDATE_IN_PLACE or we have to add
because they are not needed for a secondary index record update) */ new redo log record. For now, just write dummy sys fields to the redo
log if we are updating a secondary index record.
index = dict_table_get_first_index(index->table); */
mach_write_to_1(log_ptr, flags); mach_write_to_1(log_ptr, flags);
log_ptr++; log_ptr++;
log_ptr = row_upd_write_sys_vals_to_log(index, trx, roll_ptr, log_ptr, if (dict_index_is_clust(index)) {
mtr); log_ptr = row_upd_write_sys_vals_to_log(
index, trx, roll_ptr, log_ptr, mtr);
} else {
/* Dummy system fields for a secondary index */
/* TRX_ID Position */
log_ptr += mach_write_compressed(log_ptr, 0);
/* ROLL_PTR */
trx_write_roll_ptr(log_ptr, 0);
log_ptr += DATA_ROLL_PTR_LEN;
/* TRX_ID */
log_ptr += mach_ull_write_compressed(log_ptr, 0);
}
mach_write_to_2(log_ptr, page_offset(rec)); mach_write_to_2(log_ptr, page_offset(rec));
log_ptr += 2; log_ptr += 2;
......
...@@ -4016,6 +4016,24 @@ updated_in_place: ...@@ -4016,6 +4016,24 @@ updated_in_place:
to btr_cur_update_in_place(). */ to btr_cur_update_in_place(). */
row_upd_rec_in_place(rec, index, offsets, row_upd_rec_in_place(rec, index, offsets,
update, page_zip); update, page_zip);
/* Log the update in place operation. During recovery
MLOG_COMP_REC_UPDATE_IN_PLACE/MLOG_REC_UPDATE_IN_PLACE
expects trx_id, roll_ptr for secondary indexes. So we
just write dummy trx_id(0), roll_ptr(0) */
btr_cur_update_in_place_log(BTR_KEEP_SYS_FLAG, rec,
index, update,
NULL, 0, mtr);
DBUG_EXECUTE_IF(
"crash_after_log_ibuf_upd_inplace",
log_buffer_flush_to_disk();
fprintf(stderr,
"InnoDB: Wrote log record for ibuf "
"update in place operation\n");
DBUG_SUICIDE();
);
goto updated_in_place; goto updated_in_place;
} }
......
...@@ -636,6 +636,21 @@ btr_cur_set_deleted_flag_for_ibuf( ...@@ -636,6 +636,21 @@ btr_cur_set_deleted_flag_for_ibuf(
uncompressed */ uncompressed */
ibool val, /*!< in: value to set */ ibool val, /*!< in: value to set */
mtr_t* mtr); /*!< in/out: mini-transaction */ mtr_t* mtr); /*!< in/out: mini-transaction */
/***********************************************************//**
Writes a redo log record of updating a record in-place. */
UNIV_INTERN
void
btr_cur_update_in_place_log(
/*========================*/
ulint flags, /*!< in: flags */
rec_t* rec, /*!< in: record */
dict_index_t* index, /*!< in: index where cursor positioned */
const upd_t* update, /*!< in: update vector */
trx_t* trx, /*!< in: transaction */
roll_ptr_t roll_ptr, /*!< in: roll ptr */
mtr_t* mtr); /*!< in: mtr */
/*######################################################################*/ /*######################################################################*/
/** In the pessimistic delete, if the page data size drops below this /** In the pessimistic delete, if the page data size drops below this
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment