summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorMartin Hansson <martin.hansson@oracle.com>2010-09-07 09:58:05 +0200
committerMartin Hansson <martin.hansson@oracle.com>2010-09-07 09:58:05 +0200
commit446cc653c0ab13a6fec8ab54de9f5596389b08bc (patch)
treeb5a71beeffb63735a0ec8e19060817e72a1751b5 /sql/sql_select.cc
parentd2d4fdb23f6b38ff6718a35120043627582ee836 (diff)
downloadmariadb-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.cc18
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