mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
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.
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user