diff options
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/sql/table.cc b/sql/table.cc index 75f392388ae..e1e61eb2a26 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8845,7 +8845,7 @@ int TABLE::update_virtual_fields(handler *h, enum_vcol_update_mode update_mode) { /* Compute the actual value of the virtual fields */ DBUG_FIX_WRITE_SET(vf); -# ifndef DBUG_OFF +# ifdef DBUG_TRACE int field_error= # endif vcol_info->expr->save_in_field(vf, 0); @@ -9753,6 +9753,73 @@ bool TABLE_LIST::is_with_table() return derived && derived->with_element; } + +/** + Check if the definition are the same. + + If versions do not match it check definitions (with checking and setting + trigger definition versions (times) + + @param[in] view TABLE_LIST of the view + @param[in] share Share object of view + + @return false on error or different definitions. + + @sa check_and_update_table_version() +*/ + +bool TABLE_LIST::is_the_same_definition(THD* thd, TABLE_SHARE *s) +{ + enum enum_table_ref_type tp= s->get_table_ref_type(); + if (m_table_ref_type == tp) + { + /* + Cache have not changed which means that definition was not changed + including triggers + */ + if (m_table_ref_version == s->get_table_ref_version()) + return TRUE; + + /* + If cache changed then check content version + */ + if ((tabledef_version.length && + tabledef_version.length == s->tabledef_version.length && + memcmp(tabledef_version.str, s->tabledef_version.str, + tabledef_version.length) == 0)) + { + // Definition have not changed, let's check if triggers changed. + if (table && table->triggers) + { + + my_hrtime_t hr_stmt_prepare= thd->hr_prepare_time; + if (hr_stmt_prepare.val) + for(uint i= 0; i < TRG_EVENT_MAX; i++) + for (uint j= 0; j < TRG_ACTION_MAX; j++) + { + Trigger *tr= + table->triggers->get_trigger((trg_event_type)i, + (trg_action_time_type)j); + if (tr) + if (hr_stmt_prepare.val <= tr->hr_create_time.val) + { + set_tabledef_version(s); + return FALSE; + } + } + } + set_table_id(s); + return TRUE; + } + else + tabledef_version.length= 0; + } + else + set_tabledef_version(s); + return FALSE; +} + + uint TABLE_SHARE::actual_n_key_parts(THD *thd) { return use_ext_keys && |