diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index f46d202eed8..81d605e9e86 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -5004,9 +5004,14 @@ end: } else { if (old_is_tmp && !new_is_tmp) { /* After ALTER TABLE the table statistics - needs to be rebuilt. It will be rebuilt - when the table is loaded again. */ - table->stat_initialized = FALSE; + needs to be rebuilt. Even if we close + table below there could be other + transactions using this table (e.g. + SELECT * FROM INFORMATION_SCHEMA.`TABLE_CONSTRAINTS`), + thus we can't remove table from dictionary cache + here. Therefore, we initialize the + transient statistics here. */ + dict_stats_update_transient(table); } } } diff --git a/storage/xtradb/row/row0mysql.c b/storage/xtradb/row/row0mysql.c index 49ee3d91ed4..ededbd393b1 100644 --- a/storage/xtradb/row/row0mysql.c +++ b/storage/xtradb/row/row0mysql.c @@ -4295,9 +4295,14 @@ end: } else { if (old_is_tmp && !new_is_tmp) { /* After ALTER TABLE the table statistics - needs to be rebuilt. It will be rebuilt - when the table is loaded again. */ - table->stat_initialized = FALSE; + needs to be rebuilt. Even if we close + table below there could be other + transactions using this table (e.g. + SELECT * FROM INFORMATION_SCHEMA.`TABLE_CONSTRAINTS`), + thus we can't remove table from dictionary cache + here. Therefore, we initialize the + transient statistics here. */ + dict_stats_update_transient(table); } } }