diff options
Diffstat (limited to 'sql/sql_error.cc')
-rw-r--r-- | sql/sql_error.cc | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/sql/sql_error.cc b/sql/sql_error.cc index cef9e6cec00..85be61c34ef 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -204,6 +204,7 @@ Sql_condition::copy_opt_attributes(const Sql_condition *cond) copy_string(m_mem_root, & m_table_name, & cond->m_table_name); copy_string(m_mem_root, & m_column_name, & cond->m_column_name); copy_string(m_mem_root, & m_cursor_name, & cond->m_cursor_name); + m_row_number= cond->m_row_number; } @@ -216,7 +217,7 @@ Sql_condition::set_builtin_message_text(const char* str) */ const char* copy; - copy= strdup_root(m_mem_root, str); + copy= m_mem_root ? strdup_root(m_mem_root, str) : str; m_message_text.set(copy, strlen(copy), error_message_charset_info); DBUG_ASSERT(! m_message_text.is_alloced()); } @@ -500,7 +501,7 @@ Diagnostics_area::disable_status() Warning_info::Warning_info(ulonglong warn_id_arg, bool allow_unlimited_warnings, bool initialize) :m_current_statement_warn_count(0), - m_current_row_for_warning(1), + m_current_row_for_warning(0), m_warn_id(warn_id_arg), m_error_condition(NULL), m_allow_unlimited_warnings(allow_unlimited_warnings), @@ -557,7 +558,7 @@ void Warning_info::clear(ulonglong new_id) free_memory(); memset(m_warn_count, 0, sizeof(m_warn_count)); m_current_statement_warn_count= 0; - m_current_row_for_warning= 1; /* Start counting from the first row */ + m_current_row_for_warning= 0; clear_error_condition(); } @@ -663,7 +664,8 @@ void Warning_info::reserve_space(THD *thd, uint count) Sql_condition *Warning_info::push_warning(THD *thd, const Sql_condition_identity *value, - const char *msg) + const char *msg, + ulong current_row_number) { Sql_condition *cond= NULL; @@ -672,7 +674,8 @@ Sql_condition *Warning_info::push_warning(THD *thd, if (m_allow_unlimited_warnings || m_warn_list.elements() < thd->variables.max_error_count) { - cond= new (& m_warn_root) Sql_condition(& m_warn_root, *value, msg); + cond= new (& m_warn_root) Sql_condition(& m_warn_root, *value, msg, + current_row_number); if (cond) m_warn_list.push_back(cond); } @@ -688,7 +691,8 @@ Sql_condition *Warning_info::push_warning(THD *thd, const Sql_condition *sql_condition) { Sql_condition *new_condition= push_warning(thd, sql_condition, - sql_condition->get_message_text()); + sql_condition->get_message_text(), + sql_condition->m_row_number); if (new_condition) new_condition->copy_opt_attributes(sql_condition); @@ -723,7 +727,7 @@ void push_warning(THD *thd, Sql_condition::enum_warning_level level, if (level == Sql_condition::WARN_LEVEL_ERROR) level= Sql_condition::WARN_LEVEL_WARN; - (void) thd->raise_condition(code, NULL, level, msg); + (void) thd->raise_condition(code, "\0\0\0\0\0", level, msg); /* Make sure we also count warnings pushed after calling set_ok_status(). */ thd->get_stmt_da()->increment_warning(); |