diff options
author | unknown <ingo@mysql.com> | 2006-02-20 15:30:15 +0100 |
---|---|---|
committer | unknown <ingo@mysql.com> | 2006-02-20 15:30:15 +0100 |
commit | 5785c37e6e66b9778067b11be002f42826aa7a74 (patch) | |
tree | 0603ff34d3c6cc14db828ba76e06984b597ab0fb /sql/lock.cc | |
parent | ab16adb7dd56106bf73172799fdbe8ce6809adab (diff) | |
parent | 8c9ac3ecb42366c59321dc94c41331bcce122f58 (diff) | |
download | mariadb-git-5785c37e6e66b9778067b11be002f42826aa7a74.tar.gz |
Merge mysql.com:/home/mydev/mysql-4.1-bug5390
into mysql.com:/home/mydev/mysql-5.0-bug5390
sql/lock.cc:
BUG#5390 - problems with merge tables
Merge from 4.1
Diffstat (limited to 'sql/lock.cc')
-rw-r--r-- | sql/lock.cc | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sql/lock.cc b/sql/lock.cc index bff7cfd6734..22c3b03f8c1 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -155,7 +155,14 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, } thd->proc_info="Table lock"; thd->locked=1; - rc= thr_lock_errno_to_mysql[(int) thr_multi_lock(sql_lock->locks, + /* Copy the lock data array. thr_multi_lock() reorders its contens. */ + memcpy(sql_lock->locks + sql_lock->lock_count, sql_lock->locks, + sql_lock->lock_count * sizeof(*sql_lock->locks)); + /* Lock on the copied half of the lock data array. */ + if (thr_multi_lock(sql_lock->locks + sql_lock->lock_count, + sql_lock->lock_count)) + rc= thr_lock_errno_to_mysql[(int) thr_multi_lock(sql_lock->locks + + sql_lock->lock_count, sql_lock->lock_count, thd->lock_id)]; if (rc > 1) /* a timeout or a deadlock */ @@ -659,13 +666,20 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count, } } + /* + Allocating twice the number of pointers for lock data for use in + thr_mulit_lock(). This function reorders the lock data, but cannot + update the table values. So the second part of the array is copied + from the first part immediately before calling thr_multi_lock(). + */ if (!(sql_lock= (MYSQL_LOCK*) - my_malloc(sizeof(*sql_lock)+ - sizeof(THR_LOCK_DATA*)*tables+sizeof(table_ptr)*lock_count, + my_malloc(sizeof(*sql_lock) + + sizeof(THR_LOCK_DATA*) * tables * 2 + + sizeof(table_ptr) * lock_count, MYF(0)))) DBUG_RETURN(0); locks= locks_buf= sql_lock->locks= (THR_LOCK_DATA**) (sql_lock + 1); - to= table_buf= sql_lock->table= (TABLE**) (locks + tables); + to= table_buf= sql_lock->table= (TABLE**) (locks + tables * 2); sql_lock->table_count=lock_count; sql_lock->lock_count=tables; |