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:
@ -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
|
||||||
|
11
sql/table.cc
11
sql/table.cc
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user