item.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:13k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. #ifdef __GNUC__
  17. #pragma interface /* gcc class implementation */
  18. #endif
  19. struct st_table_list;
  20. void item_init(void); /* Init item functions */
  21. class Item {
  22.   Item(const Item &); /* Prevent use of theese */
  23.   void operator=(Item &);
  24. public:
  25.   static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); }
  26.   static void operator delete(void *ptr,size_t size) {} /*lint -e715 */
  27.   enum Type {FIELD_ITEM,FUNC_ITEM,SUM_FUNC_ITEM,STRING_ITEM,
  28.      INT_ITEM,REAL_ITEM,NULL_ITEM,VARBIN_ITEM,
  29.      COPY_STR_ITEM,FIELD_AVG_ITEM,
  30.      PROC_ITEM,COND_ITEM,REF_ITEM,FIELD_STD_ITEM, CONST_ITEM};
  31.   enum cond_result { COND_UNDEF,COND_OK,COND_TRUE,COND_FALSE };
  32.   String str_value; /* used to store value */
  33.   my_string name; /* Name from select */
  34.   Item *next;
  35.   uint32 max_length;
  36.   uint8 marker,decimals;
  37.   my_bool maybe_null; /* If item may be null */
  38.   my_bool null_value; /* if item is null */
  39.   my_bool binary;
  40.   my_bool with_sum_func;
  41.   // alloc & destruct is done as start of select using sql_alloc
  42.   Item();
  43.   virtual ~Item() { name=0; } /*lint -e1509 */
  44.   void set_name(char* str,uint length=0);
  45.   void init_make_field(Send_field *tmp_field,enum enum_field_types type);
  46.   virtual bool fix_fields(THD *,struct st_table_list *);
  47.   virtual bool save_in_field(Field *field);
  48.   virtual void save_org_in_field(Field *field)
  49.     { (void) save_in_field(field); }
  50.   virtual bool send(String *str);
  51.   virtual bool eq(const Item *) const;
  52.   virtual Item_result result_type () const { return REAL_RESULT; }
  53.   virtual enum Type type() const =0;
  54.   virtual double val()=0;
  55.   virtual longlong val_int()=0;
  56.   virtual String *val_str(String*)=0;
  57.   virtual void make_field(Send_field *field)=0;
  58.   virtual Field *tmp_table_field() { return 0; }
  59.   virtual const char *full_name() const { return name ? name : "???"; }
  60.   virtual double  val_result() { return val(); }
  61.   virtual longlong val_int_result() { return val_int(); }
  62.   virtual String *str_result(String* tmp) { return val_str(tmp); }
  63.   virtual table_map used_tables() const { return (table_map) 0L; }
  64.   virtual bool basic_const_item() const { return 0; }
  65.   virtual Item *new_item() { return 0; } /* Only for const items */
  66.   virtual cond_result eq_cmp_result() const { return COND_OK; }
  67.   inline uint float_length(uint decimals_par) const
  68.   { return decimals != NOT_FIXED_DEC ? (DBL_DIG+2+decimals_par) : DBL_DIG+8;}
  69.   virtual bool const_item() const { return used_tables() == 0; }
  70.   virtual void print(String *str_arg) { str_arg->append(full_name()); }
  71.   virtual void update_used_tables() {}
  72.   virtual void split_sum_func(List<Item> &fields) {}
  73.   virtual bool get_date(TIME *ltime,bool fuzzydate);
  74.   virtual bool get_time(TIME *ltime);
  75. };
  76. class Item_ident :public Item
  77. {
  78. public:
  79.   const char *db_name;
  80.   const char *table_name;
  81.   const char *field_name;
  82.   Item_ident(const char *db_name_par,const char *table_name_par,
  83.      const char *field_name_par)
  84.     :db_name(db_name_par),table_name(table_name_par),field_name(field_name_par)
  85.     { name = (char*) field_name_par; }
  86.   const char *full_name() const;
  87. };
  88. class Item_field :public Item_ident
  89. {
  90.   void set_field(Field *field);
  91. public:
  92.   Field *field,*result_field;
  93.   // Item_field() {}
  94.   Item_field(const char *db_par,const char *table_name_par,
  95.      const char *field_name_par)
  96.     :Item_ident(db_par,table_name_par,field_name_par),field(0),result_field(0)
  97.   {}
  98.   Item_field(Field *field);
  99.   enum Type type() const { return FIELD_ITEM; }
  100.   bool eq(const Item *item) const;
  101.   double val();
  102.   longlong val_int();
  103.   String *val_str(String*);
  104.   double val_result();
  105.   longlong val_int_result();
  106.   String *str_result(String* tmp);
  107.   bool send(String *str_arg) { return result_field->send(str_arg); }
  108.   void make_field(Send_field *field);
  109.   bool fix_fields(THD *,struct st_table_list *);
  110.   bool save_in_field(Field *field);
  111.   void save_org_in_field(Field *field);
  112.   table_map used_tables() const;
  113.   enum Item_result result_type () const
  114.   {
  115.     return field->result_type();
  116.   }
  117.   Field *tmp_table_field() { return result_field; }
  118.   bool get_date(TIME *ltime,bool fuzzydate);  
  119.   bool get_time(TIME *ltime);  
  120. };
  121. class Item_null :public Item
  122. {
  123. public:
  124.   Item_null(char *name_par=0)
  125.     { maybe_null=null_value=TRUE; name= name_par ? name_par : (char*) "NULL";}
  126.   enum Type type() const { return NULL_ITEM; }
  127.   bool eq(const Item *item) const;
  128.   double val();
  129.   longlong val_int();
  130.   String *val_str(String *str);
  131.   void make_field(Send_field *field);
  132.   bool save_in_field(Field *field);
  133.   enum Item_result result_type () const
  134.   { return STRING_RESULT; }
  135.   bool send(String *str);
  136.   bool basic_const_item() const { return 1; }
  137.   Item *new_item() { return new Item_null(name); }
  138. };
  139. class Item_int :public Item
  140. {
  141. public:
  142.   const longlong value;
  143.   Item_int(int32 i,uint length=11) :value((longlong) i)
  144.     { max_length=length;}
  145. #ifdef HAVE_LONG_LONG
  146.   Item_int(longlong i,uint length=21) :value(i)
  147.     { max_length=length;}
  148. #endif
  149.   Item_int(const char *str_arg,longlong i,uint length) :value(i)
  150.     { max_length=length; name=(char*) str_arg;}
  151.   Item_int(const char *str_arg) :
  152.     value(str_arg[0] == '-' ? strtoll(str_arg,(char**) 0,10) :
  153.   (longlong) strtoull(str_arg,(char**) 0,10))
  154.     { max_length= (uint) strlen(str_arg); name=(char*) str_arg;}
  155.   enum Type type() const { return INT_ITEM; }
  156.   virtual enum Item_result result_type () const { return INT_RESULT; }
  157.   longlong val_int() { return value; }
  158.   double val() { return (double) value; }
  159.   String *val_str(String*);
  160.   void make_field(Send_field *field);
  161.   bool save_in_field(Field *field);
  162.   bool basic_const_item() const { return 1; }
  163.   Item *new_item() { return new Item_int(name,value,max_length); }
  164.   void print(String *str);
  165. };
  166. class Item_real :public Item
  167. {
  168. public:
  169.   const double value;
  170.   // Item_real() :value(0) {}
  171.   Item_real(const char *str_arg,uint length) :value(atof(str_arg))
  172.   {
  173.     name=(char*) str_arg;
  174.     decimals=nr_of_decimals(str_arg);
  175.     max_length=length;
  176.   }
  177.   Item_real(const char *str,double val_arg,uint decimal_par,uint length)
  178.     :value(val_arg)
  179.   {
  180.     name=(char*) str;
  181.     decimals=decimal_par;
  182.     max_length=length;
  183.   }
  184.   Item_real(double value_par) :value(value_par) {}
  185.   bool save_in_field(Field *field);
  186.   enum Type type() const { return REAL_ITEM; }
  187.   double val() { return value; }
  188.   longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));}
  189.   String *val_str(String*);
  190.   void make_field(Send_field *field);
  191.   bool basic_const_item() const { return 1; }
  192.   Item *new_item() { return new Item_real(name,value,decimals,max_length); }
  193. };
  194. class Item_float :public Item_real
  195. {
  196. public:
  197.   Item_float(const char *str,uint length) :Item_real(str,length)
  198.   {
  199.     decimals=NOT_FIXED_DEC;
  200.     max_length=DBL_DIG+8;
  201.   }
  202. };
  203. class Item_string :public Item
  204. {
  205. public:
  206.   Item_string(const char *str,uint length)
  207.   {
  208.     str_value.set(str,length);
  209.     max_length=length;
  210.     name=(char*) str_value.ptr();
  211.     decimals=NOT_FIXED_DEC;
  212.   }
  213.   Item_string(const char *name_par,const char *str,uint length)
  214.   {
  215.     str_value.set(str,length);
  216.     max_length=length;
  217.     name=(char*) name_par;
  218.     decimals=NOT_FIXED_DEC;
  219.   }
  220.   ~Item_string() {}
  221.   enum Type type() const { return STRING_ITEM; }
  222.   double val() { return atof(str_value.ptr()); }
  223.   longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); }
  224.   String *val_str(String*) { return (String*) &str_value; }
  225.   bool save_in_field(Field *field);
  226.   void make_field(Send_field *field);
  227.   enum Item_result result_type () const { return STRING_RESULT; }
  228.   bool basic_const_item() const { return 1; }
  229.   Item *new_item() { return new Item_string(name,str_value.ptr(),max_length); }
  230.   String *const_string() { return &str_value; }
  231.   inline void append(char *str,uint length) { str_value.append(str,length); }
  232.   void print(String *str);
  233. };
  234. /* for show tables */
  235. class Item_datetime :public Item_string
  236. {
  237. public:
  238.   Item_datetime(const char *item_name): Item_string(item_name,"",0)
  239.   { max_length=19;}
  240.   void make_field(Send_field *field);
  241. };
  242. class Item_empty_string :public Item_string
  243. {
  244. public:
  245.   Item_empty_string(const char *header,uint length) :Item_string("",0)
  246.     { name=(char*) header; max_length=length;}
  247. };
  248. class Item_varbinary :public Item
  249. {
  250. public:
  251.   Item_varbinary(const char *str,uint str_length);
  252.   ~Item_varbinary() {}
  253.   enum Type type() const { return VARBIN_ITEM; }
  254.   double val() { return (double) Item_varbinary::val_int(); }
  255.   longlong val_int();
  256.   String *val_str(String*) { return &str_value; }
  257.   bool save_in_field(Field *field);
  258.   void make_field(Send_field *field);
  259.   enum Item_result result_type () const { return INT_RESULT; }
  260. };
  261. class Item_result_field :public Item /* Item with result field */
  262. {
  263. public:
  264.   Field *result_field; /* Save result here */
  265.   Item_result_field() :result_field(0) {}
  266.   ~Item_result_field() {} /* Required with gcc 2.95 */
  267.   Field *tmp_table_field() { return result_field; }
  268.   virtual void fix_length_and_dec()=0;
  269. };
  270. class Item_ref :public Item_ident
  271. {
  272.   Item **ref;
  273. public:
  274.   Item_ref(char *db_par,char *table_name_par,char *field_name_par)
  275.     :Item_ident(db_par,table_name_par,field_name_par),ref(0) {}
  276.   Item_ref(Item **item, char *table_name_par,char *field_name_par)
  277.     :Item_ident(NullS,table_name_par,field_name_par),ref(item) {}
  278.   enum Type type() const { return REF_ITEM; }
  279.   bool eq(const Item *item) const { return (*ref)->eq(item); }
  280.   ~Item_ref() { if (ref) delete *ref; }
  281.   double val()
  282.   {
  283.     double tmp=(*ref)->val_result();
  284.     null_value=(*ref)->null_value;
  285.     return tmp;
  286.   }
  287.   longlong val_int()
  288.   {
  289.     longlong tmp=(*ref)->val_int_result();
  290.     null_value=(*ref)->null_value;
  291.     return tmp;
  292.   }
  293.   String *val_str(String* tmp)
  294.   {
  295.     tmp=(*ref)->str_result(tmp);
  296.     null_value=(*ref)->null_value;
  297.     return tmp;
  298.   }
  299.   bool get_date(TIME *ltime,bool fuzzydate)
  300.   {  
  301.     return (null_value=(*ref)->get_date(ltime,fuzzydate));
  302.   }
  303.   bool send(String *tmp) { return (*ref)->send(tmp); }
  304.   void make_field(Send_field *field) { (*ref)->make_field(field); }
  305.   bool fix_fields(THD *,struct st_table_list *);
  306.   bool save_in_field(Field *field) { return (*ref)->save_in_field(field); }
  307.   void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); }
  308.   enum Item_result result_type () const { return (*ref)->result_type(); }
  309.   table_map used_tables() const { return (*ref)->used_tables(); }
  310. };
  311. #include "item_sum.h"
  312. #include "item_func.h"
  313. #include "item_cmpfunc.h"
  314. #include "item_strfunc.h"
  315. #include "item_timefunc.h"
  316. #include "item_uniq.h"
  317. class Item_copy_string :public Item
  318. {
  319. public:
  320.   Item *item;
  321.   Item_copy_string(Item *i) :item(i)
  322.   {
  323.     null_value=maybe_null=item->maybe_null;
  324.     decimals=item->decimals;
  325.     max_length=item->max_length;
  326.     name=item->name;
  327.   }
  328.   ~Item_copy_string() { delete item; }
  329.   enum Type type() const { return COPY_STR_ITEM; }
  330.   enum Item_result result_type () const { return STRING_RESULT; }
  331.   double val()
  332.   { return null_value ? 0.0 : atof(str_value.c_ptr()); }
  333.   longlong val_int()
  334.   { return null_value ? LL(0) : strtoll(str_value.c_ptr(),(char**) 0,10); }
  335.   String *val_str(String*);
  336.   void make_field(Send_field *field) { item->make_field(field); }
  337.   void copy();
  338.   table_map used_tables() const { return (table_map) 1L; }
  339.   bool const_item() const { return 0; }
  340. };
  341. class Item_buff :public Sql_alloc
  342. {
  343. public:
  344.   my_bool null_value;
  345.   Item_buff() :null_value(0) {}
  346.   virtual bool cmp(void)=0;
  347.   virtual ~Item_buff(); /*line -e1509 */
  348. };
  349. class Item_str_buff :public Item_buff
  350. {
  351.   Item *item;
  352.   String value,tmp_value;
  353. public:
  354.   Item_str_buff(Item *arg) :item(arg),value(arg->max_length) {}
  355.   bool cmp(void);
  356.   ~Item_str_buff(); // Deallocate String:s
  357. };
  358. class Item_real_buff :public Item_buff
  359. {
  360.   Item *item;
  361.   double value;
  362. public:
  363.   Item_real_buff(Item *item_par) :item(item_par),value(0.0) {}
  364.   bool cmp(void);
  365. };
  366. class Item_int_buff :public Item_buff
  367. {
  368.   Item *item;
  369.   longlong value;
  370. public:
  371.   Item_int_buff(Item *item_par) :item(item_par),value(0) {}
  372.   bool cmp(void);
  373. };
  374. class Item_field_buff :public Item_buff
  375. {
  376.   char *buff;
  377.   Field *field;
  378.   uint length;
  379. public:
  380.   Item_field_buff(Item_field *item)
  381.   {
  382.     field=item->field;
  383.     buff= (char*) sql_calloc(length=field->pack_length());
  384.   }
  385.   bool cmp(void);
  386. };
  387. extern Item_buff *new_Item_buff(Item *item);
  388. extern Item_result item_cmp_type(Item_result a,Item_result b);
  389. extern Item *resolve_const_item(Item *item,Item *cmp_item);
  390. extern bool field_is_equal_to_item(Field *field,Item *item);
  391. Item *get_system_var(LEX_STRING name);