diff options
author | Jorgen Loland <jorgen.loland@oracle.com> | 2010-11-15 16:18:04 +0100 |
---|---|---|
committer | Jorgen Loland <jorgen.loland@oracle.com> | 2010-11-15 16:18:04 +0100 |
commit | 4bfd2121776d0ce7ebd6761b807f083da87cb185 (patch) | |
tree | 7f5fd88d64ca0dfb00050c67d5ba64c567d6db1d /sql/sql_insert.cc | |
parent | 616f90b37250d4618fa0c71b881c754f72c00069 (diff) | |
download | mariadb-git-4bfd2121776d0ce7ebd6761b807f083da87cb185.tar.gz |
Bug#54812: assert in Diagnostics_area::set_ok_status
during EXPLAIN
Before the patch, send_eof() of some subclasses of
select_result (e.g., select_send::send_eof()) could
handle being called after an error had occured while others
could not. The methods that were not well-behaved would trigger
an ASSERT on debug builds. Release builds were not affected.
Consider the following query as an example for how the ASSERT
could be triggered:
A user without execute privilege on f() does
SELECT MAX(key1) INTO @dummy FROM t1 WHERE f() < 1;
resulting in "ERROR 42000: execute command denied to user..."
The server would end the query by calling send_eof(). The
fact that the error had occured would make the ASSERT trigger.
select_dumpvar::send_eof() was the offending method in the
bug report, but the problem also applied to other
subclasses of select_result. This patch uniforms send_eof()
of all subclasses of select_result to handle being called
after an error has occured.
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r-- | sql/sql_insert.cc | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 1f8da3fab5c..a81c9ae15a0 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -3506,6 +3506,9 @@ bool select_insert::send_eof() error= (thd->locked_tables_mode <= LTM_LOCK_TABLES ? table->file->ha_end_bulk_insert() : 0); + if (!error && thd->is_error()) + error= thd->stmt_da->sql_errno(); + table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE); @@ -4049,7 +4052,7 @@ bool select_create::send_eof() { bool tmp=select_insert::send_eof(); if (tmp) - abort(); + abort_result_set(); else { /* @@ -4081,7 +4084,7 @@ void select_create::abort_result_set() DBUG_ENTER("select_create::abort_result_set"); /* - In select_insert::abort() we roll back the statement, including + In select_insert::abort_result_set() we roll back the statement, including truncating the transaction cache of the binary log. To do this, we pretend that the statement is transactional, even though it might be the case that it was not. |