From: ingo Date: February 20 2006 11:28am Subject: bk commit into 4.0 tree (ingo:1.2173) BUG#5390 List-Archive: http://lists.mysql.com/commits/2901 X-Bug: 5390 Message-Id: Below is the list of changes that have just been committed into a local 4.0 repository of mydev. When mydev does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet 1.2173 06/02/20 12:28:07 ingo@stripped +1 -0 BUG#5390 - problems with merge tables This fix is necessary because thr_multi_lock() reorderes the lock data references array. sql/lock.cc 1.57 06/02/20 12:28:05 ingo@stripped +16 -4 BUG#5390 - problems with merge tables This fix is necessary because thr_multi_lock() reorderes the lock data references array. # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: ingo # Host: chilla.local # Root: /home/mydev/mysql-4.0-bug5390 --- 1.56/sql/lock.cc 2006-01-23 19:12:27 +01:00 +++ 1.57/sql/lock.cc 2006-02-20 12:28:05 +01:00 @@ -141,7 +141,12 @@ } 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 @@ } } + /* + 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;