Loading mysql-test/r/ps.result +14 −0 Original line number Diff line number Diff line Loading @@ -733,3 +733,17 @@ count(*) 5 deallocate prepare stmt; drop table t1; prepare stmt from 'create table t1 (a varchar(10) character set utf8)'; execute stmt; insert into t1 (a) values (repeat('a', 20)); select length(a) from t1; length(a) 10 drop table t1; execute stmt; insert into t1 (a) values (repeat('a', 20)); select length(a) from t1; length(a) 10 drop table t1; deallocate prepare stmt; mysql-test/t/ps.test +22 −1 Original line number Diff line number Diff line Loading @@ -763,5 +763,26 @@ execute stmt using @like; deallocate prepare stmt; drop table t1; # End of 4.1 tests # # 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 sql/field.cc +2 −3 Original line number Diff line number Diff line Loading @@ -6516,13 +6516,11 @@ bool Field_num::eq_def(Field *field) 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 @@ -6775,6 +6773,7 @@ create_field::create_field(Field *old_field,Field *orig_field) break; } char_length= length; decimals= old_field->decimals(); if (sql_type == FIELD_TYPE_STRING) { Loading sql/field.h +1 −1 Original line number Diff line number Diff line Loading @@ -1188,7 +1188,7 @@ class create_field :public Sql_alloc { /* The value of 'length' before a call to create_length_to_internal_length */ uint32 chars_length; uint32 char_length; uint decimals,flags,pack_length; Field::utype unireg_check; TYPELIB *interval; // Which interval to use Loading sql/sql_parse.cc +2 −0 Original line number Diff line number Diff line Loading @@ -4480,6 +4480,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, NOT_FIXED_DEC-1) : 0; new_field->sql_type=type; new_field->length=0; new_field->char_length= 0; new_field->change=change; new_field->interval=0; new_field->pack_length=0; Loading Loading @@ -4750,6 +4751,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, FIELD_TYPE_STRING : new_field->sql_type, new_field->length); 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/r/ps.result +14 −0 Original line number Diff line number Diff line Loading @@ -733,3 +733,17 @@ count(*) 5 deallocate prepare stmt; drop table t1; prepare stmt from 'create table t1 (a varchar(10) character set utf8)'; execute stmt; insert into t1 (a) values (repeat('a', 20)); select length(a) from t1; length(a) 10 drop table t1; execute stmt; insert into t1 (a) values (repeat('a', 20)); select length(a) from t1; length(a) 10 drop table t1; deallocate prepare stmt;
mysql-test/t/ps.test +22 −1 Original line number Diff line number Diff line Loading @@ -763,5 +763,26 @@ execute stmt using @like; deallocate prepare stmt; drop table t1; # End of 4.1 tests # # 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
sql/field.cc +2 −3 Original line number Diff line number Diff line Loading @@ -6516,13 +6516,11 @@ bool Field_num::eq_def(Field *field) 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 @@ -6775,6 +6773,7 @@ create_field::create_field(Field *old_field,Field *orig_field) break; } char_length= length; decimals= old_field->decimals(); if (sql_type == FIELD_TYPE_STRING) { Loading
sql/field.h +1 −1 Original line number Diff line number Diff line Loading @@ -1188,7 +1188,7 @@ class create_field :public Sql_alloc { /* The value of 'length' before a call to create_length_to_internal_length */ uint32 chars_length; uint32 char_length; uint decimals,flags,pack_length; Field::utype unireg_check; TYPELIB *interval; // Which interval to use Loading
sql/sql_parse.cc +2 −0 Original line number Diff line number Diff line Loading @@ -4480,6 +4480,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, NOT_FIXED_DEC-1) : 0; new_field->sql_type=type; new_field->length=0; new_field->char_length= 0; new_field->change=change; new_field->interval=0; new_field->pack_length=0; Loading Loading @@ -4750,6 +4751,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, FIELD_TYPE_STRING : new_field->sql_type, new_field->length); new_field->char_length= new_field->length; lex->create_list.push_back(new_field); lex->last_field=new_field; DBUG_RETURN(0); Loading