diff options
Diffstat (limited to 'sql/handler.cc')
-rw-r--r-- | sql/handler.cc | 78 |
1 files changed, 19 insertions, 59 deletions
diff --git a/sql/handler.cc b/sql/handler.cc index 4f152cfd99c..a8e6b08cf42 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -5113,22 +5113,19 @@ static my_bool discover_handlerton(THD *thd, plugin_ref plugin, int ha_discover_table(THD *thd, TABLE_SHARE *share) { DBUG_ENTER("ha_discover_table"); - int found; - DBUG_ASSERT(share->error == OPEN_FRM_OPEN_ERROR); // share is not OK yet + int found = 0; - if (!engines_with_discover) - found= FALSE; - else if (share->db_plugin) - found= discover_handlerton(thd, share->db_plugin, share); - else - found= plugin_foreach(thd, discover_handlerton, - MYSQL_STORAGE_ENGINE_PLUGIN, share); - - if (!found) - open_table_error(share, OPEN_FRM_OPEN_ERROR, ENOENT); // not found + if (engines_with_discover) + { + if (share->db_plugin) + found = discover_handlerton(thd, share->db_plugin, share); + else + found = plugin_foreach(thd, discover_handlerton, + MYSQL_STORAGE_ENGINE_PLUGIN, share); + } - DBUG_RETURN(share->error != OPEN_FRM_OK); + DBUG_RETURN(found); } static my_bool file_ext_exists(char *path, size_t path_len, const char *ext) @@ -5163,43 +5160,6 @@ static my_bool discover_existence(THD *thd, plugin_ref plugin, return ht->discover_table_existence(ht, args->db, args->table_name); } -class Table_exists_error_handler : public Internal_error_handler -{ -public: - Table_exists_error_handler() - : m_handled_errors(0), m_unhandled_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 (sql_errno == ER_NO_SUCH_TABLE || - sql_errno == ER_NO_SUCH_TABLE_IN_ENGINE || - sql_errno == ER_WRONG_OBJECT) - { - m_handled_errors++; - return TRUE; - } - - if (*level == Sql_condition::WARN_LEVEL_ERROR) - m_unhandled_errors++; - return FALSE; - } - - bool safely_trapped_errors() - { - return ((m_handled_errors > 0) && (m_unhandled_errors == 0)); - } - -private: - int m_handled_errors; - int m_unhandled_errors; -}; /** Check if a given table exists, without doing a full discover, if possible @@ -5298,24 +5258,24 @@ bool ha_table_exists(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *table_n if (need_full_discover_for_existence) { TABLE_LIST table; - uint flags = GTS_TABLE | GTS_VIEW; + uint flags = GTS_TABLE | GTS_VIEW | GTS_NO_ERROR_IF_MISSING; if (!hton) flags|= GTS_NOLOCK; - Table_exists_error_handler no_such_table_handler; - thd->push_internal_handler(&no_such_table_handler); table.init_one_table(db, table_name, 0, TL_READ); TABLE_SHARE *share= tdc_acquire_share(thd, &table, flags); - thd->pop_internal_handler(); - if (hton && share) + // Share returned, table exists. + if (share) { - *hton= share->db_type(); + if (hton) + *hton= share->db_type(); tdc_release_share(share); + DBUG_RETURN(TRUE); } - - // the table doesn't exist if we've caught ER_NO_SUCH_TABLE and nothing else - DBUG_RETURN(!no_such_table_handler.safely_trapped_errors()); + // No share, if errors have been reported, we assume the table exists. + if (thd->is_error()) + DBUG_RETURN(TRUE); } DBUG_RETURN(FALSE); |