Merge abotchkov@bk-internal.mysql.com:/home/bk/mysql-4.1
into deer.(none):/home/hf/work/mysql-4.1.2way
This commit is contained in:
commit
11de0b35f7
@ -1085,7 +1085,7 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||||||
out=line;
|
out=line;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (*ml_comment && !*in_string && inchar == '*' && *(pos+1) == '/')
|
else if (*ml_comment && inchar == '*' && *(pos + 1) == '/')
|
||||||
{
|
{
|
||||||
pos++;
|
pos++;
|
||||||
*ml_comment= 0;
|
*ml_comment= 0;
|
||||||
@ -1093,11 +1093,12 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
|||||||
else
|
else
|
||||||
{ // Add found char to buffer
|
{ // Add found char to buffer
|
||||||
if (inchar == *in_string)
|
if (inchar == *in_string)
|
||||||
*in_string=0;
|
*in_string= 0;
|
||||||
else if (!*in_string && (inchar == '\'' || inchar == '"' || inchar == '`'))
|
else if (!*ml_comment && !*in_string &&
|
||||||
*in_string=(char) inchar;
|
(inchar == '\'' || inchar == '"' || inchar == '`'))
|
||||||
if (!(*ml_comment))
|
*in_string= (char) inchar;
|
||||||
*out++ = (char) inchar;
|
if (!*ml_comment)
|
||||||
|
*out++= (char) inchar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (out != line || !buffer.is_empty())
|
if (out != line || !buffer.is_empty())
|
||||||
|
@ -297,9 +297,9 @@ select FIELD('b','A' COLLATE latin1_bin,'B');
|
|||||||
FIELD('b','A' COLLATE latin1_bin,'B')
|
FIELD('b','A' COLLATE latin1_bin,'B')
|
||||||
0
|
0
|
||||||
select FIELD(_latin2'b','A','B');
|
select FIELD(_latin2'b','A','B');
|
||||||
ERROR HY000: Illegal mix of collations for operation 'field'
|
ERROR HY000: Illegal mix of collations (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'field'
|
||||||
select FIELD('b',_latin2'A','B');
|
select FIELD('b',_latin2'A','B');
|
||||||
ERROR HY000: Illegal mix of collations for operation 'field'
|
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'field'
|
||||||
select FIELD('b',_latin2'A','B',1);
|
select FIELD('b',_latin2'A','B',1);
|
||||||
FIELD('b',_latin2'A','B',1)
|
FIELD('b',_latin2'A','B',1)
|
||||||
1
|
1
|
||||||
|
@ -167,9 +167,9 @@ select FIELD('b','A','B');
|
|||||||
select FIELD('B','A','B');
|
select FIELD('B','A','B');
|
||||||
select FIELD('b' COLLATE latin1_bin,'A','B');
|
select FIELD('b' COLLATE latin1_bin,'A','B');
|
||||||
select FIELD('b','A' COLLATE latin1_bin,'B');
|
select FIELD('b','A' COLLATE latin1_bin,'B');
|
||||||
--error 1269
|
--error 1268
|
||||||
select FIELD(_latin2'b','A','B');
|
select FIELD(_latin2'b','A','B');
|
||||||
--error 1269
|
--error 1268
|
||||||
select FIELD('b',_latin2'A','B');
|
select FIELD('b',_latin2'A','B');
|
||||||
select FIELD('b',_latin2'A','B',1);
|
select FIELD('b',_latin2'A','B',1);
|
||||||
|
|
||||||
|
@ -1170,32 +1170,32 @@ longlong Item_func_field::val_int()
|
|||||||
if (cmp_type == STRING_RESULT)
|
if (cmp_type == STRING_RESULT)
|
||||||
{
|
{
|
||||||
String *field;
|
String *field;
|
||||||
if (!(field=item->val_str(&value)))
|
if (!(field=args[0]->val_str(&value)))
|
||||||
return 0; // -1 if null ?
|
return 0; // -1 if null ?
|
||||||
for (uint i=0 ; i < arg_count ; i++)
|
for (uint i=1 ; i < arg_count ; i++)
|
||||||
{
|
{
|
||||||
String *tmp_value=args[i]->val_str(&tmp);
|
String *tmp_value=args[i]->val_str(&tmp);
|
||||||
if (tmp_value && field->length() == tmp_value->length() &&
|
if (tmp_value && field->length() == tmp_value->length() &&
|
||||||
!sortcmp(field,tmp_value,cmp_collation.collation))
|
!sortcmp(field,tmp_value,cmp_collation.collation))
|
||||||
return (longlong) (i+1);
|
return (longlong) (i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cmp_type == INT_RESULT)
|
else if (cmp_type == INT_RESULT)
|
||||||
{
|
{
|
||||||
longlong val= item->val_int();
|
longlong val= args[0]->val_int();
|
||||||
for (uint i=0; i < arg_count ; i++)
|
for (uint i=1; i < arg_count ; i++)
|
||||||
{
|
{
|
||||||
if (val == args[i]->val_int())
|
if (val == args[i]->val_int())
|
||||||
return (longlong) (i+1);
|
return (longlong) (i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double val= item->val();
|
double val= args[0]->val();
|
||||||
for (uint i=0; i < arg_count ; i++)
|
for (uint i=1; i < arg_count ; i++)
|
||||||
{
|
{
|
||||||
if (val == args[i]->val())
|
if (val == args[i]->val())
|
||||||
return (longlong) (i+1);
|
return (longlong) (i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1204,42 +1204,11 @@ longlong Item_func_field::val_int()
|
|||||||
void Item_func_field::fix_length_and_dec()
|
void Item_func_field::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
maybe_null=0; max_length=3;
|
maybe_null=0; max_length=3;
|
||||||
used_tables_cache|= item->used_tables();
|
cmp_type= args[0]->result_type();
|
||||||
const_item_cache&= item->const_item();
|
for (uint i=1; i < arg_count ; i++)
|
||||||
with_sum_func= with_sum_func || item->with_sum_func;
|
|
||||||
|
|
||||||
cmp_type= item->result_type();
|
|
||||||
for (uint i=0; i < arg_count ; i++)
|
|
||||||
cmp_type= item_cmp_type(cmp_type, args[i]->result_type());
|
cmp_type= item_cmp_type(cmp_type, args[i]->result_type());
|
||||||
|
|
||||||
if (cmp_type == STRING_RESULT)
|
if (cmp_type == STRING_RESULT)
|
||||||
{
|
agg_arg_collations_for_comparison(cmp_collation, args, arg_count);
|
||||||
cmp_collation.set(item->collation);
|
|
||||||
for (uint i=0 ; i < arg_count ; i++)
|
|
||||||
{
|
|
||||||
if (cmp_collation.aggregate(args[i]->collation))
|
|
||||||
{
|
|
||||||
my_error(ER_CANT_AGGREGATE_NCOLLATIONS,MYF(0),func_name());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Item_func_field::split_sum_func(Item **ref_pointer_array,
|
|
||||||
List<Item> &fields)
|
|
||||||
{
|
|
||||||
if (item->with_sum_func && item->type() != SUM_FUNC_ITEM)
|
|
||||||
item->split_sum_func(ref_pointer_array, fields);
|
|
||||||
else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
|
|
||||||
{
|
|
||||||
uint el= fields.elements;
|
|
||||||
fields.push_front(item);
|
|
||||||
ref_pointer_array[el]= item;
|
|
||||||
item= new Item_ref(ref_pointer_array + el, 0, item->name);
|
|
||||||
}
|
|
||||||
Item_func::split_sum_func(ref_pointer_array, fields);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -625,33 +625,14 @@ public:
|
|||||||
|
|
||||||
class Item_func_field :public Item_int_func
|
class Item_func_field :public Item_int_func
|
||||||
{
|
{
|
||||||
Item *item;
|
|
||||||
String value,tmp;
|
String value,tmp;
|
||||||
Item_result cmp_type;
|
Item_result cmp_type;
|
||||||
DTCollation cmp_collation;
|
DTCollation cmp_collation;
|
||||||
public:
|
public:
|
||||||
Item_func_field(Item *a,List<Item> &list) :Item_int_func(list),item(a) {}
|
Item_func_field(List<Item> &list) :Item_int_func(list) {}
|
||||||
~Item_func_field() { delete item; }
|
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
bool fix_fields(THD *thd,struct st_table_list *tlist, Item **ref)
|
|
||||||
{
|
|
||||||
return (item->fix_fields(thd, tlist, &item) || item->check_cols(1) ||
|
|
||||||
Item_func::fix_fields(thd, tlist, ref));
|
|
||||||
}
|
|
||||||
void split_sum_func(Item **ref_pointer_array, List<Item> &fields);
|
|
||||||
void update_used_tables()
|
|
||||||
{
|
|
||||||
item->update_used_tables() ; Item_func::update_used_tables();
|
|
||||||
used_tables_cache|= item->used_tables();
|
|
||||||
const_item_cache&= item->const_item();
|
|
||||||
}
|
|
||||||
const char *func_name() const { return "field"; }
|
const char *func_name() const { return "field"; }
|
||||||
void fix_length_and_dec();
|
void fix_length_and_dec();
|
||||||
void set_outer_resolving()
|
|
||||||
{
|
|
||||||
item->set_outer_resolving();
|
|
||||||
Item_int_func::set_outer_resolving();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1660,81 +1660,53 @@ void Item_func_elt::fix_length_and_dec()
|
|||||||
max_length=0;
|
max_length=0;
|
||||||
decimals=0;
|
decimals=0;
|
||||||
|
|
||||||
if (agg_arg_collations(collation, args, arg_count))
|
if (agg_arg_collations(collation, args+1, arg_count-1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (uint i=0 ; i < arg_count ; i++)
|
for (uint i=1 ; i < arg_count ; i++)
|
||||||
{
|
{
|
||||||
set_if_bigger(max_length,args[i]->max_length);
|
set_if_bigger(max_length,args[i]->max_length);
|
||||||
set_if_bigger(decimals,args[i]->decimals);
|
set_if_bigger(decimals,args[i]->decimals);
|
||||||
}
|
}
|
||||||
maybe_null=1; // NULL if wrong first arg
|
maybe_null=1; // NULL if wrong first arg
|
||||||
with_sum_func= with_sum_func || item->with_sum_func;
|
|
||||||
used_tables_cache|=item->used_tables();
|
|
||||||
const_item_cache&=item->const_item();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Item_func_elt::split_sum_func(Item **ref_pointer_array,
|
|
||||||
List<Item> &fields)
|
|
||||||
{
|
|
||||||
if (item->with_sum_func && item->type() != SUM_FUNC_ITEM)
|
|
||||||
item->split_sum_func(ref_pointer_array, fields);
|
|
||||||
else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
|
|
||||||
{
|
|
||||||
uint el= fields.elements;
|
|
||||||
fields.push_front(item);
|
|
||||||
ref_pointer_array[el]= item;
|
|
||||||
item= new Item_ref(ref_pointer_array + el, 0, item->name);
|
|
||||||
}
|
|
||||||
Item_str_func::split_sum_func(ref_pointer_array, fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Item_func_elt::update_used_tables()
|
|
||||||
{
|
|
||||||
Item_func::update_used_tables();
|
|
||||||
item->update_used_tables();
|
|
||||||
used_tables_cache|=item->used_tables();
|
|
||||||
const_item_cache&=item->const_item();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Item_func_elt::val()
|
double Item_func_elt::val()
|
||||||
{
|
{
|
||||||
uint tmp;
|
uint tmp;
|
||||||
if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count)
|
if ((tmp=(uint) args[0]->val_int()) == 0 || tmp >= arg_count)
|
||||||
{
|
{
|
||||||
null_value=1;
|
null_value=1;
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
null_value=0;
|
null_value=0;
|
||||||
return args[tmp-1]->val();
|
return args[tmp]->val();
|
||||||
}
|
}
|
||||||
|
|
||||||
longlong Item_func_elt::val_int()
|
longlong Item_func_elt::val_int()
|
||||||
{
|
{
|
||||||
uint tmp;
|
uint tmp;
|
||||||
if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count)
|
if ((tmp=(uint) args[0]->val_int()) == 0 || tmp >= arg_count)
|
||||||
{
|
{
|
||||||
null_value=1;
|
null_value=1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
null_value=0;
|
null_value=0;
|
||||||
return args[tmp-1]->val_int();
|
return args[tmp]->val_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
String *Item_func_elt::val_str(String *str)
|
String *Item_func_elt::val_str(String *str)
|
||||||
{
|
{
|
||||||
uint tmp;
|
uint tmp;
|
||||||
String *res;
|
String *res;
|
||||||
if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count)
|
if ((tmp=(uint) args[0]->val_int()) == 0 || tmp >= arg_count)
|
||||||
{
|
{
|
||||||
null_value=1;
|
null_value=1;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
null_value=0;
|
null_value=0;
|
||||||
res= args[tmp-1]->val_str(str);
|
res= args[tmp]->val_str(str);
|
||||||
res->set_charset(charset());
|
res->set_charset(charset());
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -372,29 +372,13 @@ public:
|
|||||||
|
|
||||||
class Item_func_elt :public Item_str_func
|
class Item_func_elt :public Item_str_func
|
||||||
{
|
{
|
||||||
Item *item;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Item_func_elt(Item *a,List<Item> &list) :Item_str_func(list),item(a) {}
|
Item_func_elt(List<Item> &list) :Item_str_func(list) {}
|
||||||
~Item_func_elt() { delete item; }
|
|
||||||
double val();
|
double val();
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
String *val_str(String *str);
|
String *val_str(String *str);
|
||||||
bool fix_fields(THD *thd, TABLE_LIST *tlist, Item **ref)
|
|
||||||
{
|
|
||||||
return (item->fix_fields(thd, tlist, &item) ||
|
|
||||||
item->check_cols(1) ||
|
|
||||||
Item_func::fix_fields(thd, tlist, ref));
|
|
||||||
}
|
|
||||||
void split_sum_func(Item **ref_pointer_array, List<Item> &fields);
|
|
||||||
void fix_length_and_dec();
|
void fix_length_and_dec();
|
||||||
void update_used_tables();
|
|
||||||
const char *func_name() const { return "elt"; }
|
const char *func_name() const { return "elt"; }
|
||||||
void set_outer_resolving()
|
|
||||||
{
|
|
||||||
item->set_outer_resolving();
|
|
||||||
Item_str_func::set_outer_resolving();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -380,7 +380,7 @@ longlong Item_func_time_to_sec::val_int()
|
|||||||
static bool get_interval_value(Item *args,interval_type int_type,
|
static bool get_interval_value(Item *args,interval_type int_type,
|
||||||
String *str_value, INTERVAL *t)
|
String *str_value, INTERVAL *t)
|
||||||
{
|
{
|
||||||
long array[4],value;
|
long array[5],value;
|
||||||
const char *str;
|
const char *str;
|
||||||
uint32 length;
|
uint32 length;
|
||||||
LINT_INIT(value); LINT_INIT(str); LINT_INIT(length);
|
LINT_INIT(value); LINT_INIT(str); LINT_INIT(length);
|
||||||
|
@ -2389,7 +2389,7 @@ simple_expr:
|
|||||||
| DAY_SYM '(' expr ')'
|
| DAY_SYM '(' expr ')'
|
||||||
{ $$= new Item_func_dayofmonth($3); }
|
{ $$= new Item_func_dayofmonth($3); }
|
||||||
| ELT_FUNC '(' expr ',' expr_list ')'
|
| ELT_FUNC '(' expr ',' expr_list ')'
|
||||||
{ $$= new Item_func_elt($3, *$5); }
|
{ $5->push_front($3); $$= new Item_func_elt(*$5); }
|
||||||
| MAKE_SET_SYM '(' expr ',' expr_list ')'
|
| MAKE_SET_SYM '(' expr ',' expr_list ')'
|
||||||
{ $$= new Item_func_make_set($3, *$5); }
|
{ $$= new Item_func_make_set($3, *$5); }
|
||||||
| ENCRYPT '(' expr ')'
|
| ENCRYPT '(' expr ')'
|
||||||
@ -2427,7 +2427,7 @@ simple_expr:
|
|||||||
$$= new Item_func_date_format (new Item_func_from_unixtime($3),$5,0);
|
$$= new Item_func_date_format (new Item_func_from_unixtime($3),$5,0);
|
||||||
}
|
}
|
||||||
| FIELD_FUNC '(' expr ',' expr_list ')'
|
| FIELD_FUNC '(' expr ',' expr_list ')'
|
||||||
{ $$= new Item_func_field($3, *$5); }
|
{ $5->push_front($3); $$= new Item_func_field(*$5); }
|
||||||
| GEOMFROMTEXT '(' expr ')'
|
| GEOMFROMTEXT '(' expr ')'
|
||||||
{ $$= new Item_func_geometry_from_text($3); }
|
{ $$= new Item_func_geometry_from_text($3); }
|
||||||
| GEOMFROMTEXT '(' expr ',' expr ')'
|
| GEOMFROMTEXT '(' expr ',' expr ')'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user