Commit 4646cc58 authored by unknown's avatar unknown

BUG#5390 - problems with merge tables

This fix is necessary because thr_multi_lock()
reorderes the lock data references array.

parent 15ecf922
...@@ -141,7 +141,12 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, uint flags) ...@@ -141,7 +141,12 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, uint flags)
} }
thd->proc_info="Table lock"; thd->proc_info="Table lock";
thd->locked=1; 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 thd->some_tables_deleted=1; // Try again
sql_lock->lock_count=0; // Locks are alread freed 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, ...@@ -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*) if (!(sql_lock= (MYSQL_LOCK*)
my_malloc(sizeof(*sql_lock)+ my_malloc(sizeof(*sql_lock) +
sizeof(THR_LOCK_DATA*)*tables+sizeof(table_ptr)*lock_count, sizeof(THR_LOCK_DATA*) * tables * 2 +
sizeof(table_ptr) * lock_count,
MYF(0)))) MYF(0))))
DBUG_RETURN(0); DBUG_RETURN(0);
locks= locks_buf= sql_lock->locks= (THR_LOCK_DATA**) (sql_lock + 1); 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->table_count=lock_count;
sql_lock->lock_count=tables; sql_lock->lock_count=tables;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment