summaryrefslogtreecommitdiff
path: root/sql/lock.cc
diff options
context:
space:
mode:
authoringo@mysql.com <>2006-04-05 14:39:20 +0200
committeringo@mysql.com <>2006-04-05 14:39:20 +0200
commitc864ac15a57d2f9f39fca646dab844b1ad0c1477 (patch)
tree58dba73a68ad820207efd5be977587951dcc2488 /sql/lock.cc
parentac52c977aa91679c490c09ad4b9f512b70ad68e3 (diff)
downloadmariadb-git-c864ac15a57d2f9f39fca646dab844b1ad0c1477.tar.gz
BUG#5390 - problems with merge tables
Additional fix for INSERT DELAYED with subselect. Originally detected in 5.1, but 5.0 could also be affected. The user thread creates a dummy table object, which is not included in the lock. The 'real' table is opened and locked by the 'delayed' system thread. The dummy object is now marked as not locked and this is tested in mysql_lock_have_duplicate().
Diffstat (limited to 'sql/lock.cc')
-rw-r--r--sql/lock.cc13
1 files changed, 9 insertions, 4 deletions
diff --git a/sql/lock.cc b/sql/lock.cc
index 01cdca0b6ee..a584b063a0b 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -530,8 +530,11 @@ TABLE_LIST *mysql_lock_have_duplicate(THD *thd, TABLE_LIST *needle,
THR_LOCK_DATA **end_data2;
DBUG_ENTER("mysql_lock_have_duplicate");
- /* Table may not be defined for derived or view tables. */
- if (! (table= needle->table))
+ /*
+ Table may not be defined for derived or view tables.
+ Table may not be part of a lock for delayed operations.
+ */
+ if (! (table= needle->table) || ! table->lock_count)
goto end;
/* A temporary table does not have locks. */
@@ -550,7 +553,8 @@ TABLE_LIST *mysql_lock_have_duplicate(THD *thd, TABLE_LIST *needle,
lock_tables= mylock->table;
/* Prepare table related variables that don't change in loop. */
- DBUG_ASSERT(table == lock_tables[table->lock_position]);
+ DBUG_ASSERT((table->lock_position < mylock->table_count) &&
+ (table == lock_tables[table->lock_position]));
table_lock_data= lock_locks + table->lock_data_start;
end_data= table_lock_data + table->lock_count;
@@ -563,7 +567,8 @@ TABLE_LIST *mysql_lock_have_duplicate(THD *thd, TABLE_LIST *needle,
continue;
/* All tables in list must be in lock. */
- DBUG_ASSERT(table2 == lock_tables[table2->lock_position]);
+ DBUG_ASSERT((table2->lock_position < mylock->table_count) &&
+ (table2 == lock_tables[table2->lock_position]));
for (lock_data2= lock_locks + table2->lock_data_start,
end_data2= lock_data2 + table2->lock_count;