Loading mysql-test/t/ps.test +21 −0 Original line number Diff line number Diff line Loading @@ -900,6 +900,27 @@ execute stmt using @like; deallocate prepare stmt; drop table t1; # # Bug#13134 "Length of VARCHAR() utf8 column is increasing when table is # recreated with PS/SP" # prepare stmt from 'create table t1 (a varchar(10) character set utf8)'; execute stmt; --disable_warnings insert into t1 (a) values (repeat('a', 20)); --enable_warnings select length(a) from t1; drop table t1; execute stmt; --disable_warnings insert into t1 (a) values (repeat('a', 20)); --enable_warnings # Check that the data is truncated to the same length select length(a) from t1; drop table t1; deallocate prepare stmt; # End of 4.1 tests # Loading sql/field.cc +2 −3 Original line number Diff line number Diff line Loading @@ -8213,13 +8213,11 @@ void Field_bit_as_char::sql_type(String &res) const create_field::create_length_to_internal_length() DESCRIPTION Convert create_field::length from number of characters to number of bytes, save original value in chars_length. Convert create_field::length from number of characters to number of bytes. */ void create_field::create_length_to_internal_length(void) { chars_length= length; switch (sql_type) { case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: Loading Loading @@ -8937,6 +8935,7 @@ create_field::create_field(Field *old_field,Field *orig_field) else interval=0; def=0; char_length= length; if (!(flags & (NO_DEFAULT_VALUE_FLAG | BLOB_FLAG)) && old_field->ptr && orig_field && Loading sql/field.h +3 −2 Original line number Diff line number Diff line Loading @@ -1386,9 +1386,10 @@ class create_field :public Sql_alloc */ ulong length; /* The value of 'length' before a call to create_length_to_internal_length The value of `length' as set by parser: is the number of characters for most of the types, or of bytes for BLOBs or numeric types. */ uint32 chars_length; uint32 char_length; uint decimals, flags, pack_length, key_length; Field::utype unireg_check; TYPELIB *interval; // Which interval to use Loading sql/sql_base.cc +1 −2 Original line number Diff line number Diff line Loading @@ -3594,7 +3594,6 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2, { Field_iterator_table_ref it_1, it_2; Natural_join_column *nj_col_1, *nj_col_2; const char *field_name_1; Query_arena *arena, backup; bool add_columns= TRUE; bool result= TRUE; Loading Loading @@ -3627,6 +3626,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2, { bool is_created_1; bool found= FALSE; const char *field_name_1; if (!(nj_col_1= it_1.get_or_create_column_ref(&is_created_1))) goto err; field_name_1= nj_col_1->name(); Loading Loading @@ -3823,7 +3823,6 @@ store_natural_using_join_columns(THD *thd, TABLE_LIST *natural_using_join, { Field_iterator_table_ref it_1, it_2; Natural_join_column *nj_col_1, *nj_col_2; bool is_created; Query_arena *arena, backup; bool result= TRUE; List<Natural_join_column> *non_join_columns; Loading sql/sql_parse.cc +1 −0 Original line number Diff line number Diff line Loading @@ -5791,6 +5791,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, interval_list, cs, uint_geom_type)) DBUG_RETURN(1); new_field->char_length= new_field->length; lex->create_list.push_back(new_field); lex->last_field=new_field; DBUG_RETURN(0); Loading Loading
mysql-test/t/ps.test +21 −0 Original line number Diff line number Diff line Loading @@ -900,6 +900,27 @@ execute stmt using @like; deallocate prepare stmt; drop table t1; # # Bug#13134 "Length of VARCHAR() utf8 column is increasing when table is # recreated with PS/SP" # prepare stmt from 'create table t1 (a varchar(10) character set utf8)'; execute stmt; --disable_warnings insert into t1 (a) values (repeat('a', 20)); --enable_warnings select length(a) from t1; drop table t1; execute stmt; --disable_warnings insert into t1 (a) values (repeat('a', 20)); --enable_warnings # Check that the data is truncated to the same length select length(a) from t1; drop table t1; deallocate prepare stmt; # End of 4.1 tests # Loading
sql/field.cc +2 −3 Original line number Diff line number Diff line Loading @@ -8213,13 +8213,11 @@ void Field_bit_as_char::sql_type(String &res) const create_field::create_length_to_internal_length() DESCRIPTION Convert create_field::length from number of characters to number of bytes, save original value in chars_length. Convert create_field::length from number of characters to number of bytes. */ void create_field::create_length_to_internal_length(void) { chars_length= length; switch (sql_type) { case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: Loading Loading @@ -8937,6 +8935,7 @@ create_field::create_field(Field *old_field,Field *orig_field) else interval=0; def=0; char_length= length; if (!(flags & (NO_DEFAULT_VALUE_FLAG | BLOB_FLAG)) && old_field->ptr && orig_field && Loading
sql/field.h +3 −2 Original line number Diff line number Diff line Loading @@ -1386,9 +1386,10 @@ class create_field :public Sql_alloc */ ulong length; /* The value of 'length' before a call to create_length_to_internal_length The value of `length' as set by parser: is the number of characters for most of the types, or of bytes for BLOBs or numeric types. */ uint32 chars_length; uint32 char_length; uint decimals, flags, pack_length, key_length; Field::utype unireg_check; TYPELIB *interval; // Which interval to use Loading
sql/sql_base.cc +1 −2 Original line number Diff line number Diff line Loading @@ -3594,7 +3594,6 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2, { Field_iterator_table_ref it_1, it_2; Natural_join_column *nj_col_1, *nj_col_2; const char *field_name_1; Query_arena *arena, backup; bool add_columns= TRUE; bool result= TRUE; Loading Loading @@ -3627,6 +3626,7 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2, { bool is_created_1; bool found= FALSE; const char *field_name_1; if (!(nj_col_1= it_1.get_or_create_column_ref(&is_created_1))) goto err; field_name_1= nj_col_1->name(); Loading Loading @@ -3823,7 +3823,6 @@ store_natural_using_join_columns(THD *thd, TABLE_LIST *natural_using_join, { Field_iterator_table_ref it_1, it_2; Natural_join_column *nj_col_1, *nj_col_2; bool is_created; Query_arena *arena, backup; bool result= TRUE; List<Natural_join_column> *non_join_columns; Loading
sql/sql_parse.cc +1 −0 Original line number Diff line number Diff line Loading @@ -5791,6 +5791,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, interval_list, cs, uint_geom_type)) DBUG_RETURN(1); new_field->char_length= new_field->length; lex->create_list.push_back(new_field); lex->last_field=new_field; DBUG_RETURN(0); Loading