diff options
author | unknown <bar@mysql.com> | 2004-10-26 09:13:52 +0500 |
---|---|---|
committer | unknown <bar@mysql.com> | 2004-10-26 09:13:52 +0500 |
commit | 52da7eb858bc680280cce9c67a8ebcc25f3985ba (patch) | |
tree | f265d1e066b488cd57e2a5b2a8dab92a29698496 | |
parent | f4295a053754e93daa7373686e93e77521273158 (diff) | |
download | mariadb-git-52da7eb858bc680280cce9c67a8ebcc25f3985ba.tar.gz |
Reuse more code: two equal pieces for ENUM and SET where moved
into a function.
-rw-r--r-- | mysql-test/r/ctype_utf8.result | 13 | ||||
-rw-r--r-- | mysql-test/t/ctype_utf8.test | 12 | ||||
-rw-r--r-- | sql/sql_parse.cc | 59 |
3 files changed, 58 insertions, 26 deletions
diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index e65eb96cb68..858ba84bbe0 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -799,3 +799,16 @@ select * from t1 where b like 'foob%'; a b 2 foobar drop table t1; +create table t1 ( +a enum('петя','вася','анюта') character set utf8 not null default 'анюта', +b set('петя','вася','анюта') character set utf8 not null default 'анюта' +); +create table t2 select concat(a,_utf8'') as a, concat(b,_utf8'')as b from t1; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` char(5) character set utf8 NOT NULL default '', + `b` char(15) character set utf8 NOT NULL default '' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t2; +drop table t1; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 238cd6daef3..1b85379353a 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -644,3 +644,15 @@ create table t1 ( insert into t1 values(1,'foo'),(2,'foobar'); select * from t1 where b like 'foob%'; drop table t1; + +# +# Test for calculate_interval_lengths() function +# +create table t1 ( + a enum('петя','вася','анюта') character set utf8 not null default 'анюта', + b set('петя','вася','анюта') character set utf8 not null default 'анюта' +); +create table t2 select concat(a,_utf8'') as a, concat(b,_utf8'')as b from t1; +show create table t2; +drop table t2; +drop table t1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index dfe6fc049e0..61049360b93 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -4091,6 +4091,31 @@ bool mysql_test_parse_for_slave(THD *thd, char *inBuf, uint length) #endif +/* + Calculate interval lengths. + Strip trailing spaces from all strings. + After this function call: + - ENUM uses max_length + - SET uses tot_length. +*/ +void calculate_interval_lengths(THD *thd, TYPELIB *interval, + uint *max_length, uint *tot_length) +{ + const char **pos; + uint *len; + CHARSET_INFO *cs= thd->variables.character_set_client; + *max_length= *tot_length= 0; + for (pos= interval->type_names, len= interval->type_lengths; + *pos ; pos++, len++) + { + *len= (uint) strip_sp((char*) *pos); + uint length= cs->cset->numchars(cs, *pos, *pos + *len); + *tot_length+= length; + set_if_bigger(*max_length, length); + } +} + + /***************************************************************************** ** Store field definition for create ** Return 0 if ok @@ -4405,19 +4430,10 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, if (new_field->pack_length > 4) new_field->pack_length=8; new_field->interval=interval; - new_field->length=0; - uint *lengths; - const char **pos; - for (pos=interval->type_names, - lengths= interval->type_lengths; *pos ; pos++, lengths++) - { - CHARSET_INFO *cs= thd->variables.character_set_client; - uint length= (uint) strip_sp((char*) *pos)+1; - set_if_smaller(*lengths, length); - length= cs->cset->numchars(cs, *pos, *pos+length); - new_field->length+= length; - } - new_field->length--; + uint dummy_max_length; + calculate_interval_lengths(thd, interval, + &dummy_max_length, &new_field->length); + new_field->length+= (interval->count - 1); set_if_smaller(new_field->length,MAX_FIELD_WIDTH-1); if (default_value) { @@ -4442,19 +4458,10 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, { new_field->interval=interval; new_field->pack_length=interval->count < 256 ? 1 : 2; // Should be safe - new_field->length=(uint) strip_sp((char*) interval->type_names[0]); - set_if_smaller(interval->type_lengths[0], new_field->length); - uint *lengths; - const char **pos; - for (pos= interval->type_names+1, - lengths= interval->type_lengths+1; *pos ; pos++, lengths++) - { - CHARSET_INFO *cs= thd->variables.character_set_client; - uint length=(uint) strip_sp((char*) *pos); - set_if_smaller(*lengths, length); - length= cs->cset->numchars(cs, *pos, *pos+length); - set_if_bigger(new_field->length,length); - } + + uint dummy_tot_length; + calculate_interval_lengths(thd, interval, + &new_field->length, &dummy_tot_length); set_if_smaller(new_field->length,MAX_FIELD_WIDTH-1); if (default_value) { |