Commit 3209aa1e authored by dlenev@mockturtle.local's avatar dlenev@mockturtle.local

Merge bk-internal.mysql.com:/home/bk/mysql-5.1-runtime

into  mockturtle.local:/home/dlenev/src/mysql-5.1-cts-3
parents aff90798 d748e4de
...@@ -688,4 +688,24 @@ select * from t2; ...@@ -688,4 +688,24 @@ select * from t2;
drop table t2; drop table t2;
#
# Tests for bug #28415 "Some ALTER TABLE statements no longer work
# under LOCK TABLES" and some aspects of fast ALTER TABLE behaviour
# for transactional tables.
#
--disable_warnings
drop table if exists t1, t2;
--enable_warnings
create table t1 (i int);
alter table t1 modify i int default 1;
alter table t1 modify i int default 2, rename t2;
lock table t2 write;
alter table t2 modify i int default 3;
unlock tables;
lock table t2 write;
alter table t2 modify i int default 4, rename t1;
unlock tables;
drop table t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -733,4 +733,15 @@ k a c ...@@ -733,4 +733,15 @@ k a c
11 15 1 11 15 1
12 20 1 12 20 1
drop table t2; drop table t2;
drop table if exists t1, t2;
create table t1 (i int);
alter table t1 modify i int default 1;
alter table t1 modify i int default 2, rename t2;
lock table t2 write;
alter table t2 modify i int default 3;
unlock tables;
lock table t2 write;
alter table t2 modify i int default 4, rename t1;
unlock tables;
drop table t1;
End of 5.1 tests End of 5.1 tests
...@@ -6673,6 +6673,7 @@ view_err: ...@@ -6673,6 +6673,7 @@ view_err:
} }
if (! need_copy_table) if (! need_copy_table)
{ {
bool needs_unlink= FALSE;
if (! table) if (! table)
{ {
if (new_name != table_name || new_db != db) if (new_name != table_name || new_db != db)
...@@ -6683,11 +6684,41 @@ view_err: ...@@ -6683,11 +6684,41 @@ view_err:
table_list->db= new_db; table_list->db= new_db;
table_list->db_length= strlen(new_db); table_list->db_length= strlen(new_db);
} }
else
{
/*
TODO: Creation of name-lock placeholder here is a temporary
work-around. Long term we should change close_cached_table() call
which we invoke before table renaming operation in such way that
it will leave placeholders for table in table cache/THD::open_tables
list. By doing this we will be able easily reopen and relock these
tables later and therefore behave under LOCK TABLES in the same way
on all platforms.
*/
char key[MAX_DBKEY_LENGTH];
uint key_length;
key_length= create_table_def_key(thd, key, table_list, 0);
if (!(name_lock= table_cache_insert_placeholder(thd, key,
key_length)))
{
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
if (! (table= open_ltable(thd, table_list, TL_WRITE_ALLOW_READ)))
goto err; goto err;
VOID(pthread_mutex_lock(&LOCK_open)); }
name_lock->next= thd->open_tables;
thd->open_tables= name_lock;
}
table_list->table= name_lock;
if (reopen_name_locked_table(thd, table_list, FALSE))
{
VOID(pthread_mutex_unlock(&LOCK_open));
goto err;
}
table= table_list->table;
/*
We can't rely on later close_cached_table() calls to close
this instance of the table since it was not properly locked.
*/
needs_unlink= TRUE;
} }
/* Tell the handler that a new frm file is in place. */ /* Tell the handler that a new frm file is in place. */
if (table->file->create_handler_files(path, NULL, CHF_INDEX_FLAG, if (table->file->create_handler_files(path, NULL, CHF_INDEX_FLAG,
...@@ -6696,6 +6727,11 @@ view_err: ...@@ -6696,6 +6727,11 @@ view_err:
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
goto err; goto err;
} }
if (needs_unlink)
{
unlink_open_table(thd, table, FALSE);
table= name_lock= 0;
}
} }
if (thd->lock || new_name != table_name || no_table_reopen) // True if WIN32 if (thd->lock || new_name != table_name || no_table_reopen) // True if WIN32
......
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