row0ins.c:

  The UNIV_DEBUG version asserted if a foreign key check failed because of a lock wait timeout
btr0cur.c:
  Fix a bug: if the primary key was updated (or delete + insert) so that only the case of characters changed, we were left with a dangling adaptive hash index pointer, often causing an assertion failure in page0page.ic line 515
parent 1111a8d6
...@@ -1355,6 +1355,12 @@ btr_cur_update_in_place( ...@@ -1355,6 +1355,12 @@ btr_cur_update_in_place(
block = buf_block_align(rec); block = buf_block_align(rec);
if (block->is_hashed) { if (block->is_hashed) {
if (row_upd_changes_ord_field_binary(NULL, index, update)) {
/* Remove possible hash index pointer to this record */
btr_search_update_hash_on_delete(cursor);
}
rw_lock_x_lock(&btr_search_latch); rw_lock_x_lock(&btr_search_latch);
} }
......
...@@ -627,6 +627,7 @@ row_ins_check_foreign_constraint( ...@@ -627,6 +627,7 @@ row_ins_check_foreign_constraint(
dict_table_t* check_table; dict_table_t* check_table;
dict_index_t* check_index; dict_index_t* check_index;
ulint n_fields_cmp; ulint n_fields_cmp;
ibool timeout_expired;
rec_t* rec; rec_t* rec;
btr_pcur_t pcur; btr_pcur_t pcur;
ibool moved; ibool moved;
...@@ -790,10 +791,15 @@ row_ins_check_foreign_constraint( ...@@ -790,10 +791,15 @@ row_ins_check_foreign_constraint(
thr_get_trx(thr)->error_state = err; thr_get_trx(thr)->error_state = err;
que_thr_stop_for_mysql(thr); que_thr_stop_for_mysql(thr);
timeout_expired = srv_suspend_mysql_thread(thr);
row_mysql_handle_errors(&err, thr_get_trx(thr), thr, NULL); if (!timeout_expired) {
goto run_again;
}
goto run_again; err = DB_LOCK_WAIT_TIMEOUT;
} }
return(err); return(err);
......
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