summaryrefslogtreecommitdiff
path: root/innobase/row
diff options
context:
space:
mode:
authorunknown <heikki@hundin.mysql.fi>2002-11-07 15:05:26 +0200
committerunknown <heikki@hundin.mysql.fi>2002-11-07 15:05:26 +0200
commitf5e71883bef3d89cb05fa9ab6497dbaed66ad9b0 (patch)
treeb7d0117d6a1fa0e5669fe785b1e1ef4d25d62fde /innobase/row
parentec2df91657ed9042c706b3d0bd5f5574051ad3f7 (diff)
downloadmariadb-git-f5e71883bef3d89cb05fa9ab6497dbaed66ad9b0.tar.gz
row0mysql.c:
Backport from 4.0: Fix corruption of ON DELETE CASCADE in lock wait timeout innobase/row/row0mysql.c: Backport from 4.0: Fix corruption of ON DELETE CASCADE in lock wait timeout
Diffstat (limited to 'innobase/row')
-rw-r--r--innobase/row/row0mysql.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index 26878f8c97c..ebb3cbe8dc8 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -1000,8 +1000,8 @@ row_update_cascade_for_mysql(
or set null operation */
dict_table_t* table) /* in: table where we do the operation */
{
- ulint err;
- trx_t* trx;
+ ulint err;
+ trx_t* trx;
trx = thr_get_trx(thr);
run_again:
@@ -1012,11 +1012,26 @@ run_again:
err = trx->error_state;
+ /* Note that the cascade node is a subnode of another InnoDB
+ query graph node. We do a normal lock wait in this node, but
+ all errors are handled by the parent node. */
+
if (err == DB_LOCK_WAIT) {
- que_thr_stop_for_mysql(thr);
+ /* Handle lock wait here */
- row_mysql_handle_errors(&err, trx, thr, NULL);
+ que_thr_stop_for_mysql(thr);
+ srv_suspend_mysql_thread(thr);
+
+ /* Note that a lock wait may also end in a lock wait timeout */
+
+ if (trx->error_state != DB_SUCCESS) {
+
+ return(trx->error_state);
+ }
+
+ /* Retry operation after a normal lock wait */
+
goto run_again;
}