diff options
author | Gleb Shchepa <gshchepa@mysql.com> | 2008-10-09 20:24:31 +0500 |
---|---|---|
committer | Gleb Shchepa <gshchepa@mysql.com> | 2008-10-09 20:24:31 +0500 |
commit | a83f5b18efaa54df3b56c86c1ab9244280447f24 (patch) | |
tree | 7a030e3d8bd24bd4a696e2b4f62c1a7eac37ae97 /sql/sql_update.cc | |
parent | 7b628ade5f016ee2986a843b32162f30afcced91 (diff) | |
download | mariadb-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.cc | 20 |
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 |