mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
BUG#9998 MySQL client hangs on "USE database"
Use open_normal_and_derived_tables instead of open_and_lock_tables when reading metadata for a table. Add two test cases, one for "USE database" and one for "SHOW COLUMNS FROM table" mysql-test/r/lock_multi.result: Updated test results for test case for bug9998 mysql-test/r/mysql.result: Updated results for test case for bug9998 mysql-test/t/lock_multi.test: Test that "show columsn from t1" is not locked by another thread having a write lock on t1 mysql-test/t/mysql.test: Add test case for BUG9998 - lock table t1 for write from mysql-test, then execute 'mysql' and call "USE test". This will test exactly what caused the bug. sql/sql_show.cc: Open tables without locking when reading metadata
This commit is contained in:
@ -348,7 +348,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
|
||||
table_list->table_name));
|
||||
|
||||
/* Only one table for now, but VIEW can involve several tables */
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
if (open_normal_and_derived_tables(thd, table_list))
|
||||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
@ -539,8 +539,7 @@ mysqld_list_fields(THD *thd, TABLE_LIST *table_list, const char *wild)
|
||||
DBUG_ENTER("mysqld_list_fields");
|
||||
DBUG_PRINT("enter",("table: %s",table_list->table_name));
|
||||
|
||||
table_list->lock_type= TL_UNLOCK;
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
if (open_normal_and_derived_tables(thd, table_list))
|
||||
DBUG_VOID_RETURN;
|
||||
table= table_list->table;
|
||||
|
||||
@ -1938,7 +1937,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
bool res;
|
||||
|
||||
lex->all_selects_list= lsel;
|
||||
res= open_and_lock_tables(thd, show_table_list);
|
||||
res= open_normal_and_derived_tables(thd, show_table_list);
|
||||
if (schema_table->process_table(thd, show_table_list,
|
||||
table, res, show_table_list->db,
|
||||
show_table_list->alias))
|
||||
@ -2043,7 +2042,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
show_table_list->lock_type= lock_type;
|
||||
lex->all_selects_list= &sel;
|
||||
lex->derived_tables= 0;
|
||||
res= open_and_lock_tables(thd, show_table_list);
|
||||
res= open_normal_and_derived_tables(thd, show_table_list);
|
||||
if (schema_table->process_table(thd, show_table_list, table,
|
||||
res, base_name,
|
||||
show_table_list->alias))
|
||||
|
Reference in New Issue
Block a user