diff options
author | unknown <kroki/tomash@moonlight.intranet> | 2006-07-28 15:06:23 +0400 |
---|---|---|
committer | unknown <kroki/tomash@moonlight.intranet> | 2006-07-28 15:06:23 +0400 |
commit | 0abc107cd23978e95dc9e2b927f65d1c2b41e887 (patch) | |
tree | bdd3f448cf9a340822fb06223056bce8a3bdb3fb /mysql-test/t | |
parent | ec4a7522ce6b3363881b3b9b2d7140e672297347 (diff) | |
download | mariadb-git-0abc107cd23978e95dc9e2b927f65d1c2b41e887.tar.gz |
Bug#16581: deadlock: server and client both read from connection in
'conc_sys' test
Concurrent execution of SELECT involing at least two INFORMATION_SCHEMA
tables, DROP DATABASE statement and DROP TABLE statement could have
resulted in stalled connection for this SELECT statement.
The problem was that for the first query of a join there was a race
between select from I_S.TABLES and DROP DATABASE, and the error (no
such database) was prepared to be send to the client, but the join
processing was continued. On second query to I_S.COLUMNS there was a
race with DROP TABLE, but this error (no such table) was downgraded to
warning, and thd->net.report_error was reset. And so neither result
nor error was sent to the client.
The solution is to stop join processing once it is clear we are going
to report a error, and also to downgrade to warnings file system errors
like 'no such database' (unless we are in the 'SHOW' command), because
I_S is designed not to use locks and the query to I_S should not abort
if something is dropped in the middle.
No test case is provided since this bug is a result of a race, and is
timing dependant. But we test that plain SHOW TABLES and SHOW COLUMNS
give a error if there is no such database or a table respectively.
mysql-test/r/show_check.result:
Add result for the test that SHOW TABLES and SHOW COLUMNS give a error
if there is no such database or a table respectively.
mysql-test/t/show_check.test:
Add test case that SHOW TABLES and SHOW COLUMNS give a error
if there is no such database or a table respectively.
sql/mysql_priv.h:
Remove prototype of mysql_find_files(), which is made static under
find_files() name.
sql/sql_show.cc:
Rename mysql_find_files() to find_files() and make it static.
Return FIND_FILES_OK for success, FIND_FILES_OOM for out of memory,
and FIND_FILES_DIR for directory reading error.
Downgrade error to warning in get_all_tables() if it is a
FIND_FILES_DIR error, and we are not in the 'SHOW' command.
Once 'result' is set to 1 in get_schema_tables_result(), there's no
need in continuing iterations, as we are about to return a error.
Diffstat (limited to 'mysql-test/t')
-rw-r--r-- | mysql-test/t/show_check.test | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 6937cbe949d..65a81545c87 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -495,4 +495,15 @@ SHOW CREATE VIEW v1; DROP PROCEDURE p1; DROP VIEW v1; + +# +# Check that SHOW TABLES and SHOW COLUMNS give a error if there is no +# referenced database and table respectively. +# +--error ER_BAD_DB_ERROR +SHOW TABLES FROM no_such_database; +--error ER_NO_SUCH_TABLE +SHOW COLUMNS FROM no_such_table; + + # End of 5.0 tests. |