diff options
Diffstat (limited to 'sql/item.h')
-rw-r--r-- | sql/item.h | 143 |
1 files changed, 116 insertions, 27 deletions
diff --git a/sql/item.h b/sql/item.h index 408010d211a..c669c266f0f 100644 --- a/sql/item.h +++ b/sql/item.h @@ -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 */ @@ -23,7 +23,7 @@ struct st_table_list; void item_init(void); /* Init item functions */ class Item { - Item(const Item &); /* Prevent use of theese */ + Item(const Item &); /* Prevent use of these */ void operator=(Item &); public: static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); } @@ -31,7 +31,7 @@ public: enum Type {FIELD_ITEM,FUNC_ITEM,SUM_FUNC_ITEM,STRING_ITEM, INT_ITEM,REAL_ITEM,NULL_ITEM,VARBIN_ITEM, - COPY_STR_ITEM,FIELD_AVG_ITEM, + COPY_STR_ITEM,FIELD_AVG_ITEM, DEFAULT_ITEM, PROC_ITEM,COND_ITEM,REF_ITEM,FIELD_STD_ITEM, CONST_ITEM}; enum cond_result { COND_UNDEF,COND_OK,COND_TRUE,COND_FALSE }; @@ -43,6 +43,7 @@ public: my_bool maybe_null; /* If item may be null */ my_bool null_value; /* if item is null */ my_bool binary; + my_bool unsigned_flag; my_bool with_sum_func; @@ -52,12 +53,12 @@ public: void set_name(char* str,uint length=0); void init_make_field(Send_field *tmp_field,enum enum_field_types type); virtual bool fix_fields(THD *,struct st_table_list *); - virtual bool save_in_field(Field *field); + virtual bool save_in_field(Field *field, bool no_conversions); virtual void save_org_in_field(Field *field) - { (void) save_in_field(field); } + { (void) save_in_field(field, 1); } virtual bool save_safe_in_field(Field *field) - { return save_in_field(field); } - virtual bool send(String *str); + { return save_in_field(field, 1); } + virtual bool send(THD *thd, String *str); virtual bool eq(const Item *, bool binary_cmp) const; virtual Item_result result_type () const { return REAL_RESULT; } virtual enum Type type() const =0; @@ -65,7 +66,7 @@ public: virtual longlong val_int()=0; virtual String *val_str(String*)=0; virtual void make_field(Send_field *field)=0; - virtual Field *tmp_table_field() { return 0; } + virtual Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return 0; } virtual const char *full_name() const { return name ? name : "???"; } virtual double val_result() { return val(); } virtual longlong val_int_result() { return val_int(); } @@ -82,6 +83,13 @@ public: virtual void split_sum_func(List<Item> &fields) {} virtual bool get_date(TIME *ltime,bool fuzzydate); virtual bool get_time(TIME *ltime); + virtual bool is_null() { return 0; } + virtual unsigned int size_of()= 0; + virtual void top_level_item() {} + virtual void set_result_field(Field *field) {} + virtual bool is_result_field() { return 0; } + virtual void save_in_result_field(bool no_conversions) {} + virtual void no_rows_in_result() {} }; @@ -96,8 +104,10 @@ public: :db_name(db_name_par),table_name(table_name_par),field_name(field_name_par) { name = (char*) field_name_par; } const char *full_name() const; + unsigned int size_of() { return sizeof(*this);} }; + class Item_field :public Item_ident { void set_field(Field *field); @@ -118,19 +128,24 @@ public: double val_result(); longlong val_int_result(); String *str_result(String* tmp); - bool send(String *str_arg) { return result_field->send(str_arg); } + bool send(THD *thd, String *str_arg) + { + return result_field->send(thd,str_arg); + } void make_field(Send_field *field); bool fix_fields(THD *,struct st_table_list *); - bool save_in_field(Field *field); + bool save_in_field(Field *field,bool no_conversions); void save_org_in_field(Field *field); table_map used_tables() const; enum Item_result result_type () const { return field->result_type(); } - Field *tmp_table_field() { return result_field; } + Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; } bool get_date(TIME *ltime,bool fuzzydate); bool get_time(TIME *ltime); + bool is_null() { return field->is_null(); } + unsigned int size_of() { return sizeof(*this);} }; @@ -145,13 +160,15 @@ public: longlong val_int(); String *val_str(String *str); void make_field(Send_field *field); - bool save_in_field(Field *field); + bool save_in_field(Field *field, bool no_conversions); bool save_safe_in_field(Field *field); enum Item_result result_type () const { return STRING_RESULT; } - bool send(String *str); + bool send(THD *thd, String *str); bool basic_const_item() const { return 1; } Item *new_item() { return new Item_null(name); } + bool is_null() { return 1; } + unsigned int size_of() { return sizeof(*this);} }; @@ -177,10 +194,26 @@ public: double val() { return (double) value; } String *val_str(String*); void make_field(Send_field *field); - bool save_in_field(Field *field); + bool save_in_field(Field *field, bool no_conversions); bool basic_const_item() const { return 1; } Item *new_item() { return new Item_int(name,value,max_length); } void print(String *str); + unsigned int size_of() { return sizeof(*this);} +}; + + +class Item_uint :public Item_int +{ +public: + Item_uint(const char *str_arg, uint length) : + Item_int(str_arg, (longlong) strtoull(str_arg,(char**) 0,10), length) {} + Item_uint(uint32 i) :Item_int((longlong) i, 10) {} + double val() { return ulonglong2double(value); } + String *val_str(String*); + void make_field(Send_field *field); + Item *new_item() { return new Item_uint(name,max_length); } + void print(String *str); + unsigned int size_of() { return sizeof(*this);} }; @@ -192,18 +225,18 @@ public: Item_real(const char *str_arg,uint length) :value(atof(str_arg)) { name=(char*) str_arg; - decimals=nr_of_decimals(str_arg); + decimals=(uint8) nr_of_decimals(str_arg); max_length=length; } Item_real(const char *str,double val_arg,uint decimal_par,uint length) :value(val_arg) { name=(char*) str; - decimals=decimal_par; + decimals=(uint8) decimal_par; max_length=length; } Item_real(double value_par) :value(value_par) {} - bool save_in_field(Field *field); + bool save_in_field(Field *field, bool no_conversions); enum Type type() const { return REAL_ITEM; } double val() { return value; } longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));} @@ -211,6 +244,7 @@ public: void make_field(Send_field *field); bool basic_const_item() const { return 1; } Item *new_item() { return new Item_real(name,value,decimals,max_length); } + unsigned int size_of() { return sizeof(*this);} }; @@ -222,6 +256,7 @@ public: decimals=NOT_FIXED_DEC; max_length=DBL_DIG+8; } + unsigned int size_of() { return sizeof(*this);} }; class Item_string :public Item @@ -246,7 +281,7 @@ public: double val() { return atof(str_value.ptr()); } longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); } String *val_str(String*) { return (String*) &str_value; } - bool save_in_field(Field *field); + bool save_in_field(Field *field, bool no_conversions); void make_field(Send_field *field); enum Item_result result_type () const { return STRING_RESULT; } bool basic_const_item() const { return 1; } @@ -255,8 +290,31 @@ public: String *const_string() { return &str_value; } inline void append(char *str,uint length) { str_value.append(str,length); } void print(String *str); + unsigned int size_of() { return sizeof(*this);} }; + +/* For INSERT ... VALUES (DEFAULT) */ + +class Item_default :public Item +{ +public: + Item_default() { name= (char*) "DEFAULT"; } + enum Type type() const { return DEFAULT_ITEM; } + void make_field(Send_field *field) {} + bool save_in_field(Field *field, bool no_conversions) + { + field->set_default(); + return 0; + } + virtual double val() { return 0.0; } + virtual longlong val_int() { return 0; } + virtual String *val_str(String *str) { return 0; } + bool basic_const_item() const { return 1; } + unsigned int size_of() { return sizeof(*this);} +}; + + /* for show tables */ class Item_datetime :public Item_string @@ -265,6 +323,7 @@ public: Item_datetime(const char *item_name): Item_string(item_name,"",0) { max_length=19;} void make_field(Send_field *field); + unsigned int size_of() { return sizeof(*this);} }; class Item_empty_string :public Item_string @@ -272,6 +331,7 @@ class Item_empty_string :public Item_string public: Item_empty_string(const char *header,uint length) :Item_string("",0) { name=(char*) header; max_length=length;} + unsigned int size_of() { return sizeof(*this);} }; class Item_varbinary :public Item @@ -283,9 +343,10 @@ public: double val() { return (double) Item_varbinary::val_int(); } longlong val_int(); String *val_str(String*) { return &str_value; } - bool save_in_field(Field *field); + bool save_in_field(Field *field, bool no_conversions); void make_field(Send_field *field); enum Item_result result_type () const { return INT_RESULT; } + unsigned int size_of() { return sizeof(*this);} }; @@ -295,15 +356,23 @@ public: Field *result_field; /* Save result here */ Item_result_field() :result_field(0) {} ~Item_result_field() {} /* Required with gcc 2.95 */ - Field *tmp_table_field() { return result_field; } + Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; } table_map used_tables() const { return 1; } virtual void fix_length_and_dec()=0; + unsigned int size_of() { return sizeof(*this);} + void set_result_field(Field *field) { result_field= field; } + bool is_result_field() { return 1; } + void save_in_result_field(bool no_conversions) + { + save_in_field(result_field, no_conversions); + } }; class Item_ref :public Item_ident { public: + Field *result_field; /* Save result here */ Item **ref; Item_ref(char *db_par,char *table_name_par,char *field_name_par) :Item_ident(db_par,table_name_par,field_name_par),ref(0) {} @@ -331,17 +400,30 @@ public: null_value=(*ref)->null_value; return tmp; } + bool is_null() + { + (void) (*ref)->val_int_result(); + return (*ref)->null_value; + } bool get_date(TIME *ltime,bool fuzzydate) { return (null_value=(*ref)->get_date(ltime,fuzzydate)); } - bool send(String *tmp) { return (*ref)->send(tmp); } + bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); } void make_field(Send_field *field) { (*ref)->make_field(field); } bool fix_fields(THD *,struct st_table_list *); - bool save_in_field(Field *field) { return (*ref)->save_in_field(field); } + bool save_in_field(Field *field, bool no_conversions) + { return (*ref)->save_in_field(field, no_conversions); } void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } table_map used_tables() const { return (*ref)->used_tables(); } + unsigned int size_of() { return sizeof(*this);} + void set_result_field(Field *field) { result_field= field; } + bool is_result_field() { return 1; } + void save_in_result_field(bool no_conversions) + { + (*ref)->save_in_field(result_field, no_conversions); + } }; @@ -357,10 +439,11 @@ class Item_int_with_ref :public Item_int public: Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg) {} - bool save_in_field(Field *field) + bool save_in_field(Field *field, bool no_conversions) { - return ref->save_in_field(field); + return ref->save_in_field(field, no_conversions); } + unsigned int size_of() { return sizeof(*this);} }; @@ -394,6 +477,8 @@ public: void copy(); table_map used_tables() const { return (table_map) 1L; } bool const_item() const { return 0; } + bool is_null() { return null_value; } + unsigned int size_of() { return sizeof(*this);} }; @@ -404,6 +489,7 @@ public: Item_buff() :null_value(0) {} virtual bool cmp(void)=0; virtual ~Item_buff(); /*line -e1509 */ + unsigned int size_of() { return sizeof(*this);} }; class Item_str_buff :public Item_buff @@ -414,6 +500,7 @@ public: Item_str_buff(Item *arg) :item(arg),value(arg->max_length) {} bool cmp(void); ~Item_str_buff(); // Deallocate String:s + unsigned int size_of() { return sizeof(*this);} }; @@ -424,6 +511,7 @@ class Item_real_buff :public Item_buff public: Item_real_buff(Item *item_par) :item(item_par),value(0.0) {} bool cmp(void); + unsigned int size_of() { return sizeof(*this);} }; class Item_int_buff :public Item_buff @@ -433,6 +521,7 @@ class Item_int_buff :public Item_buff public: Item_int_buff(Item *item_par) :item(item_par),value(0) {} bool cmp(void); + unsigned int size_of() { return sizeof(*this);} }; @@ -449,10 +538,10 @@ public: buff= (char*) sql_calloc(length=field->pack_length()); } bool cmp(void); + unsigned int size_of() { return sizeof(*this);} }; extern Item_buff *new_Item_buff(Item *item); extern Item_result item_cmp_type(Item_result a,Item_result b); extern Item *resolve_const_item(Item *item,Item *cmp_item); extern bool field_is_equal_to_item(Field *field,Item *item); -Item *get_system_var(LEX_STRING name); |