diff --git a/include/my_base.h b/include/my_base.h index 22587ec8be1..fadeffd3fde 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -334,6 +334,7 @@ is the global server default. */ #define HA_OPTION_NO_STATS_PERSISTENT 8192 #define HA_OPTION_TEMP_COMPRESS_RECORD ((uint) 16384) /* set by isamchk */ #define HA_OPTION_READ_ONLY_DATA ((uint) 32768) /* Set by isamchk */ +#define HA_OPTION_PACK_KEYS_NOT_SUPPORTED ((uint) 65536) /* Bits in flag to create() */ diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b1bf21a76a7..4ab2b1846b8 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3493,6 +3493,9 @@ mysql_prepare_create_table(THD *thd, const char *error_schema_name, uint total_uneven_bit_length= 0; DBUG_ENTER("mysql_prepare_create_table"); + if (create_info->db_type->db_type == DB_TYPE_INNODB) + *db_options |= HA_OPTION_PACK_KEYS_NOT_SUPPORTED; + LEX_STRING* connect_string = &create_info->connect_string; if (connect_string->length != 0 && connect_string->length > CONNECT_STRING_MAXLEN && @@ -4412,6 +4415,7 @@ mysql_prepare_create_table(THD *thd, const char *error_schema_name, key_part_info->length= (uint16) key_part_length; /* Use packed keys for long strings on the first column */ if (!((*db_options) & HA_OPTION_NO_PACK_KEYS) && + !((*db_options) & HA_OPTION_PACK_KEYS_NOT_SUPPORTED) && !((create_info->table_options & HA_OPTION_NO_PACK_KEYS)) && (key_part_length >= KEY_DEFAULT_PACK_LENGTH && (sql_field->sql_type == MYSQL_TYPE_STRING || @@ -6248,8 +6252,13 @@ static bool has_index_def_changed(Alter_inplace_info *ha_alter_info, check lengths first as in case when fields differ it is likely that lengths differ too and checking fields is more expensive in general case. + We allow InnoDB VARCHAR extension as long as the number of length + indicator bytes does not change. */ - if (key_part->length != new_part->length) + if (key_part->length != new_part->length + && ! (ha_alter_info->handler_flags & + Alter_inplace_info::ALTER_COLUMN_EQUAL_PACK_LENGTH) + ) return true; new_field= get_field_by_index(alter_info, new_part->fieldnr);