1
0
mirror of https://github.com/MariaDB/server.git synced 2025-06-15 00:02:46 +03:00

MDEV-13290: Assertion Assertion !is_set() || (m_status == DA_OK_BULK && is_bulk_op())' or ! is_set()' failed

followup for 97c2a7354b - don't use thd->is_error(),
the error could've been set before TABLE_LIST::cleanup_items.
Use the error handler to count errors.

This fixes rpl.rpl_row_binlog_max_cache_size - it was failing when
ER_STMT_CACHE_FULL happened duing multi-table update. Because
multi_update::abort_result_set() calls do_updates() to update
as much as possible, so one cannot rely on thd->is_error() after that.
This commit is contained in:
Sergei Golubchik
2017-09-20 20:02:01 +02:00
parent b7434bacbd
commit 378beed0a6
2 changed files with 29 additions and 4 deletions

View File

@ -1468,6 +1468,28 @@ public:
}; };
/**
Implements the trivial error handler which counts errors as they happen.
*/
class Counting_error_handler : public Internal_error_handler
{
public:
int errors;
bool handle_condition(THD *thd,
uint sql_errno,
const char* sqlstate,
Sql_condition::enum_warning_level level,
const char* msg,
Sql_condition ** cond_hdl)
{
errors++;
return false;
}
Counting_error_handler() : errors(0) {}
};
/** /**
This class is an internal error handler implementation for This class is an internal error handler implementation for
DROP TABLE statements. The thing is that there may be warnings during DROP TABLE statements. The thing is that there may be warnings during

View File

@ -4628,7 +4628,13 @@ void TABLE_LIST::cleanup_items()
int TABLE_LIST::view_check_option(THD *thd, bool ignore_failure) int TABLE_LIST::view_check_option(THD *thd, bool ignore_failure)
{ {
if (check_option && check_option->val_int() == 0) Counting_error_handler ceh;
thd->push_internal_handler(&ceh);
bool res= check_option && check_option->val_int() == 0;
thd->pop_internal_handler();
if (ceh.errors)
return(VIEW_CHECK_ERROR);
if (res)
{ {
TABLE_LIST *main_view= top_table(); TABLE_LIST *main_view= top_table();
if (ignore_failure) if (ignore_failure)
@ -4642,9 +4648,6 @@ int TABLE_LIST::view_check_option(THD *thd, bool ignore_failure)
main_view->view_name.str); main_view->view_name.str);
return(VIEW_CHECK_ERROR); return(VIEW_CHECK_ERROR);
} }
/* We check thd->error() because it can be set by conversion problem. */
if (thd->is_error())
return(VIEW_CHECK_ERROR);
return(VIEW_CHECK_OK); return(VIEW_CHECK_OK);
} }