diff options
author | Martin Hansson <martin.hansson@oracle.com> | 2010-09-07 09:58:05 +0200 |
---|---|---|
committer | Martin Hansson <martin.hansson@oracle.com> | 2010-09-07 09:58:05 +0200 |
commit | 446cc653c0ab13a6fec8ab54de9f5596389b08bc (patch) | |
tree | b5a71beeffb63735a0ec8e19060817e72a1751b5 /sql/sql_select.cc | |
parent | d2d4fdb23f6b38ff6718a35120043627582ee836 (diff) | |
download | mariadb-git-446cc653c0ab13a6fec8ab54de9f5596389b08bc.tar.gz |
Bug#54543: update ignore with incorrect subquery leads to assertion failure:
inited==INDEX
When an error occurs while sending the data in a temporary table there was no
cleanup performed. This caused a failed assertion in the case when different
access methods were used for populating the table vs. retrieving the data from
the table if IGNORE was specified and sql_safe_updates = 0. In this case
execution continues, but the handler expects to continue with the access
method used for row retrieval.
Fixed by doing the cleanup even if errors occur.
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4a32ca34790..f550f75c8b8 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -11157,22 +11157,20 @@ do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure) if (error == NESTED_LOOP_NO_MORE_ROWS) error= NESTED_LOOP_OK; + if (table == NULL) // If sending data to client + /* + The following will unlock all cursors if the command wasn't an + update command + */ + join->join_free(); // Unlock all cursors if (error == NESTED_LOOP_OK) { /* Sic: this branch works even if rc != 0, e.g. when send_data above returns an error. */ - if (!table) // If sending data to client - { - /* - The following will unlock all cursors if the command wasn't an - update command - */ - join->join_free(); // Unlock all cursors - if (join->result->send_eof()) - rc= 1; // Don't send error - } + if (table == NULL && join->result->send_eof()) // If sending data to client + rc= 1; // Don't send error DBUG_PRINT("info",("%ld records output", (long) join->send_records)); } else |