Commit bb356127 authored by Oystein Grovlen's avatar Oystein Grovlen

Bug#57704 Cleanup code dies with void TABLE::set_keyread(bool): Assertion `file' failed.

This bug was introduced in this revision: 
kostja@sun.com-20100727102553-b4n2ojcyfj79l2x7
("A pre-requisite patch for the fix for Bug#52044.")

It happens because close_thread_tables() is now called in
open_and_lock_tables upon failure.  Hence, table is no longer
open when optimizer tries to do cleanup.

Fix: Make sure to do cleanup in st_select_lex_unit::prepare()
upon failure. This way, cleanup() is called before tables are
released.

mysql-test/r/subselect.result:
  Added test case for Bug#57704.
mysql-test/t/subselect.test:
  Added test case for Bug#57704.
sql/sql_union.cc:
  st_select_lex_unit::prepare():  On failure, make sure cleanup()
  is called.
parent ebed5380
...@@ -5005,3 +5005,15 @@ SELECT * FROM t2 UNION SELECT * FROM t2 ...@@ -5005,3 +5005,15 @@ SELECT * FROM t2 UNION SELECT * FROM t2
ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE)); ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
DROP TABLE t1,t2; DROP TABLE t1,t2;
End of 5.1 tests End of 5.1 tests
#
# Bug #57704: Cleanup code dies with void TABLE::set_keyread(bool):
# Assertion `file' failed.
#
CREATE TABLE t1 (a INT);
SELECT 1 FROM
(SELECT ROW(
(SELECT 1 FROM t1 RIGHT JOIN
(SELECT 1 FROM t1, t1 t2) AS d ON 1),
1) FROM t1) AS e;
ERROR 21000: Operand should contain 1 column(s)
DROP TABLE t1;
...@@ -3946,3 +3946,21 @@ DROP TABLE t1,t2; ...@@ -3946,3 +3946,21 @@ DROP TABLE t1,t2;
--enable_result_log --enable_result_log
--echo End of 5.1 tests --echo End of 5.1 tests
--echo #
--echo # Bug #57704: Cleanup code dies with void TABLE::set_keyread(bool):
--echo # Assertion `file' failed.
--echo #
CREATE TABLE t1 (a INT);
--error ER_OPERAND_COLUMNS
SELECT 1 FROM
(SELECT ROW(
(SELECT 1 FROM t1 RIGHT JOIN
(SELECT 1 FROM t1, t1 t2) AS d ON 1),
1) FROM t1) AS e;
DROP TABLE t1;
...@@ -434,6 +434,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, ...@@ -434,6 +434,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
err: err:
thd_arg->lex->current_select= lex_select_save; thd_arg->lex->current_select= lex_select_save;
(void) cleanup();
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
......
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