You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
1.4 KiB

Bug #58730 Assertion failed: table->key_read == 0 in close_thread_table, temptable views The TABLE::key_read field indicates if the optimizer has found that row retrieval only should access the index tree. The triggered assert inside close_thread_table() checks that this field has been reset when the table is about to be closed. During normal execution, these fields are reset right before tables are closed at the end of mysql_execute_command(). But in the case of errors, tables are closed earlier. The patch for Bug#52044 refactored the open tables code so that close_thread_tables() is called immediately if opening of tables fails. At this point in the execution, it could happend that all TABLE::key_read fields had not been properly reset, therefore triggering the assert. The problematic statement in this case was EXPLAIN where the query accessed two derived tables and where the first derived table was processed successfully while the second derived table was not. Since it was an EXPLAIN, TABLE::key_read fields were not reset after successful derived table processing since the state needs to be accessible afterwards. When processing of the second derived table failed, it's corresponding SELECT_LEX_UNIT was cleaned, which caused it's TABLE::key_read fields to be reset. Since processing failed, the error path of open_and_lock_tables() was entered and close_thread_tables() was called. The assert was then triggered due to the TABLE::key_read fields set during processing of the first derived table. This patch fixes the problem by adding a new derived table processor, mysql_derived_cleanup() that is called after mysql_derived_filling(). It causes cleanup of all SELECT_LEX_UNITs to be called, resetting all relevant TABLE::key_read fields. Test case added to derived.test.
15 years ago
  1. /* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
  2. This program is free software; you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation; version 2 of the License.
  5. This program is distributed in the hope that it will be useful,
  6. but WITHOUT ANY WARRANTY; without even the implied warranty of
  7. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  8. GNU General Public License for more details.
  9. You should have received a copy of the GNU General Public License
  10. along with this program; if not, write to the Free Software
  11. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
  12. #ifndef SQL_DERIVED_INCLUDED
  13. #define SQL_DERIVED_INCLUDED
  14. struct TABLE_LIST;
  15. class THD;
  16. struct LEX;
  17. bool mysql_handle_derived(LEX *lex, uint phases);
  18. bool mysql_handle_single_derived(LEX *lex, TABLE_LIST *derived, uint phases);
  19. bool mysql_handle_list_of_derived(LEX *lex, TABLE_LIST *dt_list, uint phases);
  20. /**
  21. Cleans up the SELECT_LEX_UNIT for the derived table (if any).
  22. @param thd Thread handler
  23. @param lex LEX for this thread
  24. @param derived TABLE_LIST for the derived table
  25. @retval false Success
  26. @retval true Failure
  27. */
  28. bool mysql_derived_cleanup(THD *thd, LEX *lex, TABLE_LIST *derived);
  29. #endif /* SQL_DERIVED_INCLUDED */