summaryrefslogtreecommitdiff
path: root/storage/innobase/row
diff options
context:
space:
mode:
authorunknown <karen.langford@oracle.com>2010-10-11 22:13:47 +0200
committerKaren Langford <karen.langford@oracle.com>2010-10-11 22:13:47 +0200
commit498ee6bd19eabc85dcbd9abebc9cf6aeb79d1985 (patch)
tree2661daa32857e606d955263f4edd93a22f36b792 /storage/innobase/row
parentcf2c8701b48417bde08dd6fdc58d9da735d53481 (diff)
downloadmariadb-git-498ee6bd19eabc85dcbd9abebc9cf6aeb79d1985.tar.gz
Fix bug #57345
Diffstat (limited to 'storage/innobase/row')
-rw-r--r--storage/innobase/row/row0sel.c14
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);