diff options
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 60 |
1 files changed, 43 insertions, 17 deletions
diff --git a/sql/field.cc b/sql/field.cc index dd125a06bad..b2cc721c258 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7063,9 +7063,16 @@ uint Field::is_equal(Create_field *new_field) uint Field_str::is_equal(Create_field *new_field) { - return new_field->type_handler() == type_handler() && - new_field->charset == field_charset && - new_field->length == max_display_length(); + if (new_field->type_handler() == type_handler() && + new_field->charset == field_charset) + { + if (new_field->length == max_display_length()) + return IS_EQUAL_YES; + if (new_field->length > max_display_length() && + (table->file->ha_table_flags() & HA_EXTENDED_TYPES_CONVERSION)) + return IS_EQUAL_PACK_LENGTH; + } + return IS_EQUAL_NO; } @@ -7901,16 +7908,26 @@ Field *Field_varstring::new_key_field(MEM_ROOT *root, TABLE *new_table, uint Field_varstring::is_equal(Create_field *new_field) { - if (new_field->type_handler() == type_handler() && - new_field->charset == field_charset && + if (new_field->charset == field_charset && !new_field->compression_method() == !compression_method()) { - if (new_field->length == field_length) - return IS_EQUAL_YES; - if (new_field->length > field_length && - ((new_field->length <= 255 && field_length <= 255) || - (new_field->length > 255 && field_length > 255))) - return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length + bool extended= (table->file->ha_table_flags() & HA_EXTENDED_TYPES_CONVERSION); + if (extended && new_field->type_handler() == &type_handler_string && + new_field->length >= field_length) + { + return IS_EQUAL_PACK_LENGTH; + } + if (new_field->type_handler() == type_handler()) + { + if (new_field->length == field_length) + return IS_EQUAL_YES; + if (new_field->length > field_length) + { + if (extended || (new_field->length <= 255 && field_length <= 255) || + (new_field->length > 255 && field_length > 255)) + return IS_EQUAL_PACK_LENGTH; // VARCHAR, longer variable length + } + } } return IS_EQUAL_NO; } @@ -9480,12 +9497,21 @@ bool Field_num::eq_def(const Field *field) const uint Field_num::is_equal(Create_field *new_field) { - return ((new_field->type_handler() == type_handler()) && - ((new_field->flags & UNSIGNED_FLAG) == - (uint) (flags & UNSIGNED_FLAG)) && - ((new_field->flags & AUTO_INCREMENT_FLAG) == - (uint) (flags & AUTO_INCREMENT_FLAG)) && - (new_field->pack_length == pack_length())); + bool extended= (table->file->ha_table_flags() & HA_EXTENDED_TYPES_CONVERSION); + bool signed_equal= ((new_field->flags & UNSIGNED_FLAG) == + (uint) (flags & UNSIGNED_FLAG)); + if ((extended ? + new_field->type_handler()->result_type() == type_handler()->result_type() : + new_field->type_handler() == type_handler()) && + ((new_field->flags & AUTO_INCREMENT_FLAG) == (uint) (flags & AUTO_INCREMENT_FLAG))) + { + if (signed_equal && new_field->pack_length == pack_length()) + return IS_EQUAL_YES; + if (extended && new_field->pack_length > pack_length() && + (signed_equal || !(new_field->flags & UNSIGNED_FLAG))) + return IS_EQUAL_PACK_LENGTH; + } + return IS_EQUAL_NO; } |