From 28461fe5ef419a06b93cae9358918e6cf40a5b07 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Wed, 22 Aug 2018 22:06:38 +0300 Subject: [PATCH] MDEV-16330 Allow instant change of WITH SYSTEM VERSIONING column attribute cleanup change_fields_versioning_try(): use innodb_col_no() instead of a manual loop change_fields_versioning_cache(): use innodb_col_no() instead of a manual loop --- storage/innobase/handler/handler0alter.cc | 48 +++-------------------- 1 file changed, 5 insertions(+), 43 deletions(-) diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 3f31f253b3f..2f4d49d79a3 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -8491,36 +8491,17 @@ change_fields_versioning_try( DBUG_RETURN(false); } - uint virtual_count = 0; - List_iterator_fast it( ha_alter_info->alter_info->create_list); - for (uint i = 0; i < table->s->fields; i++) { - const Field* field = table->field[i]; - - if (innobase_is_v_fld(field)) { - virtual_count++; - continue; - } - - const Create_field* create_field = NULL; - while (const Create_field* cf = it++) { - if (cf->field == field) { - create_field = cf; - break; - } - } - it.rewind(); - DBUG_ASSERT(create_field); - + while (const Create_field* create_field = it++) { if (create_field->versioning == Column_definition::VERSIONING_NOT_SET) { continue; } const dict_table_t* new_table = ctx->new_table; - ulint pos = i - virtual_count; + const uint pos = innodb_col_no(create_field->field); const dict_col_t* col = dict_table_get_nth_col(new_table, pos); DBUG_ASSERT(!col->vers_sys_start()); @@ -8560,31 +8541,12 @@ change_fields_versioning_cache( DBUG_ASSERT(ctx); DBUG_ASSERT(ha_alter_info->handler_flags & ALTER_COLUMN_UNVERSIONED); - uint virtual_count = 0; - List_iterator_fast it( ha_alter_info->alter_info->create_list); - for (uint i = 0; i < table->s->fields; i++) { - const Field* field = table->field[i]; - - if (innobase_is_v_fld(field)) { - virtual_count++; - continue; - } - - const Create_field* create_field = NULL; - while (const Create_field* cf = it++) { - if (cf->field == field) { - create_field = cf; - break; - } - } - it.rewind(); - DBUG_ASSERT(create_field); - - dict_col_t* col - = dict_table_get_nth_col(ctx->new_table, i - virtual_count); + while (const Create_field* create_field = it++) { + dict_col_t* col = dict_table_get_nth_col( + ctx->new_table, innodb_col_no(create_field->field)); if (create_field->versioning == Column_definition::WITHOUT_VERSIONING) {