From 870e4d21a6fb8cf0c7d7b2690de7b12319490295 Mon Sep 17 00:00:00 2001 From: lilinhua Date: Mon, 2 Dec 2024 19:45:57 +0800 Subject: [PATCH] fix: fk table may corrupt if upgrade from 5.7 to 8.0 and use instant add column PROBLEM ======= total_col_count, current_col_count, current_row_version, initial_col_count has the wrong value if upgrade from 5.7 to 8.0 of fk table, when use instant add column, physical_pos of se_private_data in mysql.columns are set to a wrong value, which lead to a corrupted table. SOLUTION ======== Use dd_table_get_column_counters to get the right value to update total_col_count, current_col_count, current_row_version, initial_col_count. --- storage/innobase/dict/dict0upgrade.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/storage/innobase/dict/dict0upgrade.cc b/storage/innobase/dict/dict0upgrade.cc index 2a330c7..f5ffb81 100644 --- a/storage/innobase/dict/dict0upgrade.cc +++ b/storage/innobase/dict/dict0upgrade.cc @@ -887,6 +887,10 @@ bool dd_upgrade_table(THD *thd, const char *db_name, const char *table_name, dd::Table *dd_table, TABLE *srv_table) { char norm_name[FN_REFLEN]; dict_table_t *ib_table = nullptr; + uint32_t i_c = 0; + uint32_t c_c = 0; + uint32_t t_c = 0; + uint32_t c_r_v = 0; /* 2 * NAME_CHAR_LEN is for dbname and tablename, 5 assumes max bytes for charset, + 2 is for path separator and +1 is for NULL. */ @@ -918,6 +922,14 @@ bool dd_upgrade_table(THD *thd, const char *db_name, const char *table_name, return (true); } + dd_table_get_column_counters(dd_table->table(), i_c, c_c, t_c, c_r_v); + + /* Setup column counters and current row version for table */ + ib_table->initial_col_count = i_c; + ib_table->current_col_count = c_c; + ib_table->total_col_count = t_c; + ib_table->current_row_version = c_r_v; + /* We don't support upgrade from 5.7 with discarded Tablespaces. Upgrade should stop in a dd_upgrade_tablespace function. */ ut_ad(!dict_table_is_discarded(ib_table)); -- 1.8.3.1