diff options
Diffstat (limited to 'sql/item.cc')
-rw-r--r-- | sql/item.cc | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/sql/item.cc b/sql/item.cc index 0ce37cdd593..dac10eafafb 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1,15 +1,15 @@ /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -37,7 +37,7 @@ void item_init(void) Item::Item() { marker=0; - binary=maybe_null=null_value=with_sum_func=0; + binary=maybe_null=null_value=with_sum_func=unsigned_flag=0; name=0; decimals=0; max_length=0; next=current_thd->free_list; // Put in free list @@ -132,6 +132,7 @@ void Item_field::set_field(Field *field_par) table_name=field_par->table_name; field_name=field_par->field_name; binary=field_par->binary(); + unsigned_flag=test(field_par->flags & UNSIGNED_FLAG); } const char *Item_ident::full_name() const @@ -247,6 +248,22 @@ void Item_int::print(String *str) str->append(name); } +String *Item_uint::val_str(String *str) +{ + str->set((ulonglong) value); + return str; +} + +void Item_uint::print(String *str) +{ + if (!name) + { + str_value.set((ulonglong) value); + name=str_value.c_ptr(); + } + str->append(name); +} + String *Item_real::val_str(String *str) { @@ -299,13 +316,21 @@ bool Item::fix_fields(THD *thd, bool Item_field::fix_fields(THD *thd,TABLE_LIST *tables) { - if (!field) + if (!field) // If field is not checked { Field *tmp; if (!(tmp=find_field_in_tables(thd,this,tables))) return 1; set_field(tmp); } + else if (thd && thd->set_query_id && field->query_id != thd->query_id) + { + /* We only come here in unions */ + TABLE *table=field->table; + field->query_id=thd->query_id; + table->used_fields++; + table->used_keys&=field->part_of_key; + } return 0; } @@ -319,6 +344,8 @@ void Item::init_make_field(Send_field *tmp_field, tmp_field->type=field_type; tmp_field->length=max_length; tmp_field->decimals=decimals; + if (unsigned_flag) + tmp_field->flags |= UNSIGNED_FLAG; } /* ARGSUSED */ @@ -334,6 +361,13 @@ void Item_int::make_field(Send_field *tmp_field) init_make_field(tmp_field,FIELD_TYPE_LONGLONG); } +void Item_uint::make_field(Send_field *tmp_field) +{ + init_make_field(tmp_field,FIELD_TYPE_LONGLONG); + tmp_field->flags|= UNSIGNED_FLAG; + unsigned_flag=1; +} + void Item_real::make_field(Send_field *tmp_field) { init_make_field(tmp_field,FIELD_TYPE_DOUBLE); @@ -552,19 +586,19 @@ void Item_varbinary::make_field(Send_field *tmp_field) ** pack data in buffer for sending */ -bool Item::send(String *packet) +bool Item::send(THD *thd, String *packet) { char buff[MAX_FIELD_WIDTH]; + CONVERT *convert; String s(buff,sizeof(buff)),*res; if (!(res=val_str(&s))) return net_store_null(packet); - CONVERT *convert; - if ((convert=current_thd->convert_set)) + if ((convert=thd->convert_set)) return convert->store(packet,res->ptr(),res->length()); return net_store_data(packet,res->ptr(),res->length()); } -bool Item_null::send(String *packet) +bool Item_null::send(THD *thd, String *packet) { return net_store_null(packet); } @@ -578,7 +612,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables) { if (!ref) { - if (!(ref=find_item_in_list(this,thd->lex.item_list))) + if (!(ref=find_item_in_list(this,thd->lex.select->item_list))) return 1; max_length= (*ref)->max_length; maybe_null= (*ref)->maybe_null; @@ -694,5 +728,6 @@ bool field_is_equal_to_item(Field *field,Item *item) #ifdef __GNUC__ template class List<Item>; template class List_iterator<Item>; +template class List_iterator_fast<Item>; template class List<List_item>; #endif |