summaryrefslogtreecommitdiff
path: root/sql/sql_union.cc
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2005-10-13 11:53:00 +0400
committerunknown <konstantin@mysql.com>2005-10-13 11:53:00 +0400
commitd31e997d57c51ba5d1c4e80bbf402495a126f192 (patch)
tree1b8bb03febfb001c7548f0c3e434fa74bc71c9da /sql/sql_union.cc
parent20a6f1524aef600d4dc39b9826ddcc4663a8049f (diff)
downloadmariadb-git-d31e997d57c51ba5d1c4e80bbf402495a126f192.tar.gz
A fix and a test case for Bug#12736 "Server crash during a select".
The bug was in JOIN::join_free which was wrongly determining that all joins have been already executed and therefore all used tables can be closed. mysql-test/r/subselect_innodb.result: - test results fixed (Bug#12736 "Server crash during a select mysql-test/t/subselect_innodb.test: - a test case for Bug#12736 "Server crash during a select": test that ha_index_or_rnd_end and mysql_unlock_tables are called for all used tables in proper order. sql/item_subselect.cc: - implement subselect_union_engine::is_executed sql/item_subselect.h: - implement Item_subselect::is_evaluated. This function is used to check whether we can clean up a non-correlated join of a subquery when cleaning up the join of the outer query sql/sql_lex.h: - declare st_select_lex::cleanup_all_joins sql/sql_select.cc: - remove an argument from JOIN::join_free, it's now not used - reimplement JOIN::join_free to not unlock tables if there is a subquery that has not yet been evaluated. Make sure that the new implementation calls ha_index_or_rnd_end for every table in the join and inner joins, because all table cursors must be closed before mysql_unlock_tables. sql/sql_select.h: - JOIN::join_free signature changed sql/sql_union.cc: - implement a helper method st_select_lex::cleanup_all_joins, which recursively walks over a tree of joins and calls cleanup() for each join.
Diffstat (limited to 'sql/sql_union.cc')
-rw-r--r--sql/sql_union.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 951248e8cd8..dee88af7d83 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -720,3 +720,17 @@ bool st_select_lex::cleanup()
DBUG_RETURN(error);
}
+
+void st_select_lex::cleanup_all_joins(bool full)
+{
+ SELECT_LEX_UNIT *unit;
+ SELECT_LEX *sl;
+
+ if (join)
+ join->cleanup(full);
+
+ for (unit= first_inner_unit(); unit; unit= unit->next_unit())
+ for (sl= unit->first_select(); sl; sl= sl->next_select())
+ sl->cleanup_all_joins(full);
+}
+