mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Item_func_field doesn't have a separate Item to store the first argument.
It's now passed as args[0]. This fix allowed to resuse a lot of code.
This commit is contained in:
parent
e1aaa670cc
commit
4b9c7f8336
5 changed files with 18 additions and 68 deletions
|
@ -297,9 +297,9 @@ select FIELD('b','A' COLLATE latin1_bin,'B');
|
|||
FIELD('b','A' COLLATE latin1_bin,'B')
|
||||
0
|
||||
select FIELD(_latin2'b','A','B');
|
||||
ERROR HY000: Illegal mix of collations for operation 'field'
|
||||
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');
|
||||
ERROR HY000: Illegal mix of collations for operation 'field'
|
||||
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);
|
||||
FIELD('b',_latin2'A','B',1)
|
||||
1
|
||||
|
|
|
@ -167,9 +167,9 @@ select FIELD('b','A','B');
|
|||
select FIELD('B','A','B');
|
||||
select FIELD('b' COLLATE latin1_bin,'A','B');
|
||||
select FIELD('b','A' COLLATE latin1_bin,'B');
|
||||
--error 1269
|
||||
--error 1265
|
||||
select FIELD(_latin2'b','A','B');
|
||||
--error 1269
|
||||
--error 1265
|
||||
select FIELD('b',_latin2'A','B');
|
||||
select FIELD('b',_latin2'A','B',1);
|
||||
|
||||
|
|
|
@ -1170,32 +1170,32 @@ longlong Item_func_field::val_int()
|
|||
if (cmp_type == STRING_RESULT)
|
||||
{
|
||||
String *field;
|
||||
if (!(field=item->val_str(&value)))
|
||||
if (!(field=args[0]->val_str(&value)))
|
||||
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);
|
||||
if (tmp_value && field->length() == tmp_value->length() &&
|
||||
!sortcmp(field,tmp_value,cmp_collation.collation))
|
||||
return (longlong) (i+1);
|
||||
return (longlong) (i);
|
||||
}
|
||||
}
|
||||
else if (cmp_type == INT_RESULT)
|
||||
{
|
||||
longlong val= item->val_int();
|
||||
for (uint i=0; i < arg_count ; i++)
|
||||
longlong val= args[0]->val_int();
|
||||
for (uint i=1; i < arg_count ; i++)
|
||||
{
|
||||
if (val == args[i]->val_int())
|
||||
return (longlong) (i+1);
|
||||
return (longlong) (i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
double val= item->val();
|
||||
for (uint i=0; i < arg_count ; i++)
|
||||
double val= args[0]->val();
|
||||
for (uint i=1; i < arg_count ; i++)
|
||||
{
|
||||
if (val == args[i]->val())
|
||||
return (longlong) (i+1);
|
||||
return (longlong) (i);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -1204,42 +1204,11 @@ longlong Item_func_field::val_int()
|
|||
void Item_func_field::fix_length_and_dec()
|
||||
{
|
||||
maybe_null=0; max_length=3;
|
||||
used_tables_cache|= item->used_tables();
|
||||
const_item_cache&= item->const_item();
|
||||
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= args[0]->result_type();
|
||||
for (uint i=1; i < arg_count ; i++)
|
||||
cmp_type= item_cmp_type(cmp_type, args[i]->result_type());
|
||||
|
||||
if (cmp_type == STRING_RESULT)
|
||||
{
|
||||
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);
|
||||
agg_arg_collations_for_comparison(cmp_collation, args, arg_count);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -625,33 +625,14 @@ public:
|
|||
|
||||
class Item_func_field :public Item_int_func
|
||||
{
|
||||
Item *item;
|
||||
String value,tmp;
|
||||
Item_result cmp_type;
|
||||
DTCollation cmp_collation;
|
||||
public:
|
||||
Item_func_field(Item *a,List<Item> &list) :Item_int_func(list),item(a) {}
|
||||
~Item_func_field() { delete item; }
|
||||
Item_func_field(List<Item> &list) :Item_int_func(list) {}
|
||||
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"; }
|
||||
void fix_length_and_dec();
|
||||
void set_outer_resolving()
|
||||
{
|
||||
item->set_outer_resolving();
|
||||
Item_int_func::set_outer_resolving();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -2427,7 +2427,7 @@ simple_expr:
|
|||
$$= new Item_func_date_format (new Item_func_from_unixtime($3),$5,0);
|
||||
}
|
||||
| FIELD_FUNC '(' expr ',' expr_list ')'
|
||||
{ $$= new Item_func_field($3, *$5); }
|
||||
{ $5->push_front($3); $$= new Item_func_field(*$5); }
|
||||
| GEOMFROMTEXT '(' expr ')'
|
||||
{ $$= new Item_func_geometry_from_text($3); }
|
||||
| GEOMFROMTEXT '(' expr ',' expr ')'
|
||||
|
|
Loading…
Reference in a new issue