[Commits] c22da381725: MDEV-22331: table discovery doesn't work when undoing a rename
revision-id: c22da38172508b59aa33be7b3052db94565a83d0 (mariadb-10.5.2-450-gc22da381725) parent(s): d0c69ccab523d2bc2ea8f381c519ac47ec42ff9f author: Sergei Petrunia committer: Sergei Petrunia timestamp: 2020-06-17 12:25:25 +0300 message: MDEV-22331: table discovery doesn't work when undoing a rename In TABLE_SHARE::init_from_sql_statement_string(): - don't check thd->is_error() - instead, install a Turn_errors_to_warnings_handler object for the duration of parsing, and then examine it. in Turn_errors_to_warnings_handler, count the errors caught. --- sql/table.cc | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/sql/table.cc b/sql/table.cc index 73c3bd4b3ba..8689b3e2a53 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -3268,6 +3268,29 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, } +class Turn_errors_to_warnings_handler : public Internal_error_handler +{ +public: + int errors; + Turn_errors_to_warnings_handler() : errors(0) {} + bool handle_condition(THD *thd, + uint sql_errno, + const char* sqlstate, + Sql_condition::enum_warning_level *level, + const char* msg, + Sql_condition ** cond_hdl) + { + *cond_hdl= NULL; + if (*level == Sql_condition::WARN_LEVEL_ERROR) + { + *level= Sql_condition::WARN_LEVEL_WARN; + errors++; + } + return(0); + } +}; + + static bool sql_unusable_for_discovery(THD *thd, handlerton *engine, const char *sql) { @@ -3339,6 +3362,7 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, handlerton *hton= plugin_hton(db_plugin); LEX_CUSTRING frm= {0,0}; LEX_CSTRING db_backup= thd->db; + Turn_errors_to_warnings_handler silencer; DBUG_ENTER("TABLE_SHARE::init_from_sql_statement_string"); /* @@ -3368,6 +3392,8 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, thd->reset_db(&db); lex_start(thd); + thd->push_internal_handler(&silencer); + if (unlikely((error= parse_sql(thd, & parser_state, NULL) || sql_unusable_for_discovery(thd, hton, sql_copy)))) goto ret; @@ -3395,6 +3421,7 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, } ret: + thd->pop_internal_handler(); my_free(const_cast<uchar*>(frm.str)); lex_end(thd->lex); thd->reset_db(&db_backup); @@ -3403,9 +3430,8 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, thd->restore_active_arena(arena, &backup); reenable_binlog(thd); thd->variables.character_set_client= old_cs; - if (unlikely(thd->is_error() || error)) + if (silencer.errors || error) { - thd->clear_error(); my_error(ER_SQL_DISCOVER_ERROR, MYF(0), plugin_name(db_plugin)->str, db.str, table_name.str, sql_copy); @@ -8418,25 +8444,6 @@ bool is_simple_order(ORDER *order) return TRUE; } -class Turn_errors_to_warnings_handler : public Internal_error_handler -{ -public: - Turn_errors_to_warnings_handler() {} - bool handle_condition(THD *thd, - uint sql_errno, - const char* sqlstate, - Sql_condition::enum_warning_level *level, - const char* msg, - Sql_condition ** cond_hdl) - { - *cond_hdl= NULL; - if (*level == Sql_condition::WARN_LEVEL_ERROR) - *level= Sql_condition::WARN_LEVEL_WARN; - return(0); - } -}; - - /* to satisfy marked_for_write_or_computed() Field's assert we temporarily mark field for write before storing the generated value in it
participants (1)
-
Sergei Petrunia