summaryrefslogtreecommitdiff
path: root/sql/lock.cc
diff options
context:
space:
mode:
authorunknown <ingo@mysql.com>2006-02-20 12:28:07 +0100
committerunknown <ingo@mysql.com>2006-02-20 12:28:07 +0100
commite204b8436fa1334061db7bf16dfdcd4ad619097b (patch)
treee96ff1366846c6a32d465d68470700edb1bf37cb /sql/lock.cc
parent70ad79088606af82a4768eee467bc63ed25fbcbe (diff)
downloadmariadb-git-e204b8436fa1334061db7bf16dfdcd4ad619097b.tar.gz
BUG#5390 - problems with merge tables
This fix is necessary because thr_multi_lock() reorderes the lock data references array.
Diffstat (limited to 'sql/lock.cc')
-rw-r--r--sql/lock.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/sql/lock.cc b/sql/lock.cc
index bae5821eaf6..713eb02d8ec 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -141,7 +141,12 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, uint flags)
}
thd->proc_info="Table lock";
thd->locked=1;
- if (thr_multi_lock(sql_lock->locks,sql_lock->lock_count))
+ /* 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))
{
thd->some_tables_deleted=1; // Try again
sql_lock->lock_count=0; // Locks are alread freed
@@ -602,13 +607,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;