summaryrefslogtreecommitdiff
path: root/sql/sql_update.cc
diff options
context:
space:
mode:
authorGleb Shchepa <gshchepa@mysql.com>2008-10-09 20:24:31 +0500
committerGleb Shchepa <gshchepa@mysql.com>2008-10-09 20:24:31 +0500
commita83f5b18efaa54df3b56c86c1ab9244280447f24 (patch)
tree7a030e3d8bd24bd4a696e2b4f62c1a7eac37ae97 /sql/sql_update.cc
parent7b628ade5f016ee2986a843b32162f30afcced91 (diff)
downloadmariadb-git-a83f5b18efaa54df3b56c86c1ab9244280447f24.tar.gz
Bug#38499: flush tables and multitable table update with
derived table cause crash When a multi-UPDATE command fails to lock some table, and subsequently succeeds, the tables need to be reopened if they were altered. But the reopening procedure failed for derived tables. Extra cleanup has been added. mysql-test/r/lock_multi.result: Added test case for bug #38499. mysql-test/t/lock_multi.test: Added test case for bug #38499. sql/sql_union.cc: Bug#38499: flush tables and multitable table update with derived table cause crash Obsolete assertion has been removed. sql/sql_update.cc: Bug#38499: flush tables and multitable table update with derived table cause crash Extra cleanup for derived tables has been added: 1) unit.cleanup(), 2) unit->reinit_exec_mechanism().
Diffstat (limited to 'sql/sql_update.cc')
-rw-r--r--sql/sql_update.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 109786df7de..eb4e9b7ed73 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -876,6 +876,26 @@ reopen_tables:
tbl->cleanup_items();
/*
+ To not to hog memory (as a result of the
+ unit->reinit_exec_mechanism() call below):
+ */
+ lex->unit.cleanup();
+
+ for (SELECT_LEX *sl= lex->all_selects_list;
+ sl;
+ sl= sl->next_select_in_list())
+ {
+ SELECT_LEX_UNIT *unit= sl->master_unit();
+ unit->reinit_exec_mechanism(); // reset unit->prepared flags
+ /*
+ Reset 'clean' flag back to force normal execution of
+ unit->cleanup() in Prepared_statement::cleanup_stmt()
+ (call to lex->unit.cleanup() above sets this flag to TRUE).
+ */
+ unit->unclean();
+ }
+
+ /*
Also we need to cleanup Natural_join_column::table_field items.
To not to traverse a join tree we will cleanup whole
thd->free_list (in PS execution mode that list may not contain