summaryrefslogtreecommitdiff
path: root/sql/sql_lex.h
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_lex.h
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_lex.h')
-rw-r--r--sql/sql_lex.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 8d7ec25f97b..3c34c7aaaea 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -386,12 +386,12 @@ protected:
select_result *result;
ulong found_rows_for_union;
bool res;
+public:
bool prepared, // prepare phase already performed for UNION (unit)
optimized, // optimize phase already performed for UNION (unit)
executed, // already executed
cleaned;
-public:
// list of fields which points to temporary table for union
List<Item> item_list;
/*
@@ -638,6 +638,11 @@ public:
SELECT_LEX and all nested SELECT_LEXes and SELECT_LEX_UNITs).
*/
bool cleanup();
+ /*
+ Recursively cleanup the join of this select lex and of all nested
+ select lexes.
+ */
+ void cleanup_all_joins(bool full);
};
typedef class st_select_lex SELECT_LEX;