mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Reuse more code: two equal pieces for ENUM and SET where moved
into a function.
This commit is contained in:
@ -799,3 +799,16 @@ select * from t1 where b like 'foob%';
|
|||||||
a b
|
a b
|
||||||
2 foobar
|
2 foobar
|
||||||
drop table t1;
|
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;
|
||||||
|
@ -644,3 +644,15 @@ create table t1 (
|
|||||||
insert into t1 values(1,'foo'),(2,'foobar');
|
insert into t1 values(1,'foo'),(2,'foobar');
|
||||||
select * from t1 where b like 'foob%';
|
select * from t1 where b like 'foob%';
|
||||||
drop table t1;
|
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;
|
||||||
|
@ -4091,6 +4091,31 @@ bool mysql_test_parse_for_slave(THD *thd, char *inBuf, uint length)
|
|||||||
#endif
|
#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
|
** Store field definition for create
|
||||||
** Return 0 if ok
|
** 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)
|
if (new_field->pack_length > 4)
|
||||||
new_field->pack_length=8;
|
new_field->pack_length=8;
|
||||||
new_field->interval=interval;
|
new_field->interval=interval;
|
||||||
new_field->length=0;
|
uint dummy_max_length;
|
||||||
uint *lengths;
|
calculate_interval_lengths(thd, interval,
|
||||||
const char **pos;
|
&dummy_max_length, &new_field->length);
|
||||||
for (pos=interval->type_names,
|
new_field->length+= (interval->count - 1);
|
||||||
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--;
|
|
||||||
set_if_smaller(new_field->length,MAX_FIELD_WIDTH-1);
|
set_if_smaller(new_field->length,MAX_FIELD_WIDTH-1);
|
||||||
if (default_value)
|
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->interval=interval;
|
||||||
new_field->pack_length=interval->count < 256 ? 1 : 2; // Should be safe
|
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 dummy_tot_length;
|
||||||
uint *lengths;
|
calculate_interval_lengths(thd, interval,
|
||||||
const char **pos;
|
&new_field->length, &dummy_tot_length);
|
||||||
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);
|
|
||||||
}
|
|
||||||
set_if_smaller(new_field->length,MAX_FIELD_WIDTH-1);
|
set_if_smaller(new_field->length,MAX_FIELD_WIDTH-1);
|
||||||
if (default_value)
|
if (default_value)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user