diff options
author | unknown <salle@geopard.(none)> | 2002-11-08 16:40:19 +0200 |
---|---|---|
committer | unknown <salle@geopard.(none)> | 2002-11-08 16:40:19 +0200 |
commit | cbc851c605e96023a6058949b0ea7fa68b89441c (patch) | |
tree | 6b2ece89a1241986fcdb4c93a1e8652c534244a7 | |
parent | 7bf4febc2539c22ec8a337446d531a9fd2849e07 (diff) | |
parent | de6eea8b6f320ccb59f533476d2056a737311226 (diff) | |
download | mariadb-git-cbc851c605e96023a6058949b0ea7fa68b89441c.tar.gz |
Merge akeremidarski@work.mysql.com:/home/bk/mysql
into geopard.(none):/storage/bk/mysql-3.23
-rw-r--r-- | innobase/row/row0mysql.c | 23 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 |
2 files changed, 21 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; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 0c3c19c6e69..3596fdc0c05 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4970,6 +4970,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), } else { + if (end_of_records) + DBUG_RETURN(0); join->first_record=1; VOID(test_if_group_changed(join->group_fields)); } |