diff --git a/storage/tokudb/ha_tokudb_alter_56.cc b/storage/tokudb/ha_tokudb_alter_56.cc index 2fad65f11b2..9934cba48da 100644 --- a/storage/tokudb/ha_tokudb_alter_56.cc +++ b/storage/tokudb/ha_tokudb_alter_56.cc @@ -147,6 +147,13 @@ fix_handler_flags(TABLE *table, TABLE *altered_table, Alter_inplace_info *ha_alt handler_flags &= ~Alter_inplace_info::TOKU_ALTER_RENAME; } + // ALTER_COLUMN_TYPE may be set when no columns have been changed, so turn off the flag + if (handler_flags & Alter_inplace_info::ALTER_COLUMN_TYPE) { + if (all_fields_are_same_type(table, altered_table)) { + handler_flags &= ~Alter_inplace_info::ALTER_COLUMN_TYPE; + } + } + return handler_flags; } @@ -219,13 +226,14 @@ ha_tokudb::check_if_supported_inplace_alter(TABLE *altered_table, Alter_inplace_ result = HA_ALTER_INPLACE_EXCLUSIVE_LOCK; } else // column rename - if (only_flags(ctx->handler_flags, Alter_inplace_info::ALTER_COLUMN_NAME + Alter_inplace_info::ALTER_COLUMN_DEFAULT)) { + if (ctx->handler_flags & Alter_inplace_info::ALTER_COLUMN_NAME && + only_flags(ctx->handler_flags, Alter_inplace_info::ALTER_COLUMN_NAME + Alter_inplace_info::ALTER_COLUMN_DEFAULT)) { // we have identified a possible column rename, // but let's do some more checks - + // we will only allow an hcr if there are no changes // in column positions (ALTER_COLUMN_ORDER is not set) - + // now need to verify that one and only one column // has changed only its name. If we find anything to // the contrary, we don't allow it, also check indexes @@ -234,7 +242,8 @@ ha_tokudb::check_if_supported_inplace_alter(TABLE *altered_table, Alter_inplace_ result = HA_ALTER_INPLACE_EXCLUSIVE_LOCK; } else // add column - if (only_flags(ctx->handler_flags, Alter_inplace_info::ADD_COLUMN + Alter_inplace_info::ALTER_COLUMN_ORDER)) { + if (ctx->handler_flags & Alter_inplace_info::ADD_COLUMN && + only_flags(ctx->handler_flags, Alter_inplace_info::ADD_COLUMN + Alter_inplace_info::ALTER_COLUMN_ORDER)) { uint32_t added_columns[altered_table->s->fields]; uint32_t num_added_columns = 0; int r = find_changed_columns(added_columns, &num_added_columns, table, altered_table); @@ -250,7 +259,8 @@ ha_tokudb::check_if_supported_inplace_alter(TABLE *altered_table, Alter_inplace_ } } else // drop column - if (only_flags(ctx->handler_flags, Alter_inplace_info::DROP_COLUMN + Alter_inplace_info::ALTER_COLUMN_ORDER)) { + if (ctx->handler_flags & Alter_inplace_info::DROP_COLUMN && + only_flags(ctx->handler_flags, Alter_inplace_info::DROP_COLUMN + Alter_inplace_info::ALTER_COLUMN_ORDER)) { uint32_t dropped_columns[table->s->fields]; uint32_t num_dropped_columns = 0; int r = find_changed_columns(dropped_columns, &num_dropped_columns, altered_table, table); diff --git a/storage/tokudb/ha_tokudb_alter_common.cc b/storage/tokudb/ha_tokudb_alter_common.cc index 561f1bffeef..40810dafc1c 100644 --- a/storage/tokudb/ha_tokudb_alter_common.cc +++ b/storage/tokudb/ha_tokudb_alter_common.cc @@ -565,6 +565,19 @@ ha_tokudb::fill_row_mutator( return pos-buf; } +static bool +all_fields_are_same_type(TABLE *table_a, TABLE *table_b) { + if (table_a->s->fields != table_b->s->fields) + return false; + for (uint i = 0; i < table_a->s->fields; i++) { + Field *field_a = table_a->field[i]; + Field *field_b = table_b->field[i]; + if (!fields_are_same_type(field_a, field_b)) + return false; + } + return true; +} + static bool column_rename_supported( TABLE* orig_table, @@ -584,13 +597,13 @@ column_rename_supported( retval = false; goto cleanup; } + if (!all_fields_are_same_type(orig_table, new_table)) { + retval = false; + goto cleanup; + } for (uint i = 0; i < orig_table->s->fields; i++) { Field* orig_field = orig_table->field[i]; Field* new_field = new_table->field[i]; - if (!fields_are_same_type(orig_field, new_field)) { - retval = false; - goto cleanup; - } if (!fields_have_same_name(orig_field, new_field)) { num_fields_with_different_names++; field_with_different_name = i;