summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-12-02 14:43:51 +0200
committerunknown <monty@mysql.com>2004-12-02 14:43:51 +0200
commit93cf297fcb932aaaf1c006d7066ec453c9a907cb (patch)
tree8f90ede7dbeae77977acb6dee6d00daeb9081399 /sql/field.cc
parentb18b1be91323358b1078e5eb409b3c2042a54786 (diff)
downloadmariadb-git-93cf297fcb932aaaf1c006d7066ec453c9a907cb.tar.gz
Cleanups during review stage
Added auto-correct of field length for enum/set tables for ALTER TABLE This is becasue of a bug in previous MySQL 4.1 versions where the length for enum/set was set incorrectly after ALTER TABLE mysql-test/r/rpl_start_stop_slave.result: Fixed wrong test mysql-test/r/type_enum.result: Added test for wrong enum/set length after alter table mysql-test/t/ps.test: removed empty line mysql-test/t/type_enum.test: Added test for wrong enum/set length after alter table sql/field.cc: Added auto-correct of field length for enum/set tables. This is becasue of a bug in previous MySQL 4.1 versions where the length for enum/set was set incorrectly after ALTER TABLE sql/item_cmpfunc.cc: Simple optimization sql/mysql_priv.h: Made local function global sql/set_var.cc: Simple cleanup sql/sql_table.cc: Simple cleanups & optimizations
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc60
1 files changed, 42 insertions, 18 deletions
diff --git a/sql/field.cc b/sql/field.cc
index 72c27b6adf9..eee7f6f1684 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5842,25 +5842,47 @@ bool Field_num::eq_def(Field *field)
void create_field::create_length_to_internal_length(void)
{
- switch (sql_type)
+ switch (sql_type) {
+ case MYSQL_TYPE_TINY_BLOB:
+ case MYSQL_TYPE_MEDIUM_BLOB:
+ case MYSQL_TYPE_LONG_BLOB:
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_VAR_STRING:
+ case MYSQL_TYPE_STRING:
+ length*= charset->mbmaxlen;
+ pack_length= calc_pack_length(sql_type == FIELD_TYPE_VAR_STRING ?
+ FIELD_TYPE_STRING : sql_type, length);
+ break;
+#ifdef CORRECT_CODE_BUT_CANT_YET_BE_USED
+ case MYSQL_TYPE_ENUM:
+ case MYSQL_TYPE_SET:
+ length*= charset->mbmaxlen;
+ break;
+#else
+ /*
+ Because of a bug in MySQL 4.1 where length was extended for ENUM and SET
+ fields for every ALTER TABLE, we have to recalculate lengths here
+ */
+ case MYSQL_TYPE_ENUM:
{
- case MYSQL_TYPE_TINY_BLOB:
- case MYSQL_TYPE_MEDIUM_BLOB:
- case MYSQL_TYPE_LONG_BLOB:
- case MYSQL_TYPE_BLOB:
- case MYSQL_TYPE_VAR_STRING:
- case MYSQL_TYPE_STRING:
- length*= charset->mbmaxlen;
- pack_length= calc_pack_length(sql_type == FIELD_TYPE_VAR_STRING ?
- FIELD_TYPE_STRING : sql_type, length);
- break;
- case MYSQL_TYPE_ENUM:
- case MYSQL_TYPE_SET:
- length*= charset->mbmaxlen;
- break;
- default:
- /* do nothing */
- break;
+ uint32 tot_length, max_length;
+ calculate_interval_lengths(current_thd, interval,
+ &max_length, &tot_length);
+ length= max_length * charset->mbmaxlen;
+ break;
+ }
+ case MYSQL_TYPE_SET:
+ {
+ uint32 tot_length, max_length;
+ calculate_interval_lengths(current_thd, interval,
+ &max_length, &tot_length);
+ length= (tot_length + (interval->count - 1)) * charset->mbmaxlen;
+ break;
+ }
+#endif
+ default:
+ /* do nothing */
+ break;
}
}
@@ -6085,6 +6107,8 @@ create_field::create_field(Field *old_field,Field *orig_field)
}
length=(length+charset->mbmaxlen-1)/charset->mbmaxlen; // QQ: Probably not needed
break;
+ case MYSQL_TYPE_ENUM:
+ case MYSQL_TYPE_SET:
case FIELD_TYPE_STRING:
case FIELD_TYPE_VAR_STRING:
length=(length+charset->mbmaxlen-1)/charset->mbmaxlen;