diff options
author | unknown <karen.langford@oracle.com> | 2010-10-11 22:13:47 +0200 |
---|---|---|
committer | Karen Langford <karen.langford@oracle.com> | 2010-10-11 22:13:47 +0200 |
commit | 498ee6bd19eabc85dcbd9abebc9cf6aeb79d1985 (patch) | |
tree | 2661daa32857e606d955263f4edd93a22f36b792 /storage/innobase/row | |
parent | cf2c8701b48417bde08dd6fdc58d9da735d53481 (diff) | |
download | mariadb-git-498ee6bd19eabc85dcbd9abebc9cf6aeb79d1985.tar.gz |
Fix bug #57345
Diffstat (limited to 'storage/innobase/row')
-rw-r--r-- | storage/innobase/row/row0sel.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/storage/innobase/row/row0sel.c b/storage/innobase/row/row0sel.c index a64dd3151ee..ecb2c492706 100644 --- a/storage/innobase/row/row0sel.c +++ b/storage/innobase/row/row0sel.c @@ -3259,6 +3259,7 @@ row_search_for_mysql( mem_heap_t* heap = NULL; ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint* offsets = offsets_; + ibool table_lock_waited = FALSE; *offsets_ = (sizeof offsets_) / sizeof *offsets_; @@ -3622,13 +3623,15 @@ shortcut_fails_too_big_rec: trx_assign_read_view(trx); prebuilt->sql_stat_start = FALSE; } else { +wait_table_again: err = lock_table(0, index->table, prebuilt->select_lock_type == LOCK_S ? LOCK_IS : LOCK_IX, thr); if (err != DB_SUCCESS) { - goto lock_wait_or_error; + table_lock_waited = TRUE; + goto lock_table_wait; } prebuilt->sql_stat_start = FALSE; } @@ -4408,6 +4411,7 @@ lock_wait_or_error: btr_pcur_store_position(pcur, &mtr); +lock_table_wait: mtr_commit(&mtr); mtr_has_extra_clust_latch = FALSE; @@ -4425,6 +4429,14 @@ lock_wait_or_error: thr->lock_state = QUE_THR_LOCK_NOLOCK; mtr_start(&mtr); + /* Table lock waited, go try to obtain table lock + again */ + if (table_lock_waited) { + table_lock_waited = FALSE; + + goto wait_table_again; + } + sel_restore_position_for_mysql(&same_user_rec, BTR_SEARCH_LEAF, pcur, moves_up, &mtr); |