diff options
author | unknown <serg@serg.mylan> | 2003-07-15 14:58:04 +0200 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2003-07-15 14:58:04 +0200 |
commit | 5aa330863bad40282cd26feb3bacf105f785032c (patch) | |
tree | f96f1bb78939f05b9e3cfc29c02f3823b908475c | |
parent | 5c0075496ec02ab882cd5e8b5e12a4e159d92047 (diff) | |
parent | 4b3eecf46b640b3601527ea59d819ddaec5820f8 (diff) | |
download | mariadb-git-5aa330863bad40282cd26feb3bacf105f785032c.tar.gz |
Merge bk-internal:/home/bk/mysql-4.1/
into serg.mylan:/usr/home/serg/Abk/mysql-4.1
sql/item_func.h:
Auto merged
sql/sql_yacc.yy:
Auto merged
-rw-r--r-- | client/mysql.cc | 14 | ||||
-rw-r--r-- | mysql-test/r/func_str.result | 4 | ||||
-rw-r--r-- | mysql-test/t/func_str.test | 4 | ||||
-rw-r--r-- | sql/item_func.cc | 55 | ||||
-rw-r--r-- | sql/item_func.h | 21 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 2 |
6 files changed, 26 insertions, 74 deletions
diff --git a/client/mysql.cc b/client/mysql.cc index 45b0e4bf2ea..4c07c1bbab7 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1085,7 +1085,7 @@ static bool add_line(String &buffer,char *line,char *in_string, out=line; } } - else if (*ml_comment && !*in_string && inchar == '*' && *(pos+1) == '/') + else if (*ml_comment && inchar == '*' && *(pos + 1) == '/') { pos++; *ml_comment= 0; @@ -1093,11 +1093,13 @@ static bool add_line(String &buffer,char *line,char *in_string, else { // Add found char to buffer if (inchar == *in_string) - *in_string=0; - else if (!*in_string && (inchar == '\'' || inchar == '"' || inchar == '`')) - *in_string=(char) inchar; - if (!(*ml_comment)) - *out++ = (char) inchar; + *in_string= 0; + else if (!*ml_comment) + { + if (!*in_string && (inchar == '\'' || inchar == '"' || inchar == '`')) + *in_string= (char) inchar; + *out++= (char) inchar; + } } } if (out != line || !buffer.is_empty()) diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 611660675c8..208efc51acb 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -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 diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index 1fabd997366..7748694169f 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -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); diff --git a/sql/item_func.cc b/sql/item_func.cc index 7264a3b5225..7e236225067 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -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); } diff --git a/sql/item_func.h b/sql/item_func.h index cb3869bd7cc..aefecdbe94d 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -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(); - } }; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index eaa4de71f7d..dc68d0165fd 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -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 ')' |