home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / sql / item_func.h < prev    next >
C/C++ Source or Header  |  2000-11-16  |  23KB  |  868 lines

  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.  
  17.  
  18. /* Function items used by mysql */
  19.  
  20. #ifdef __GNUC__
  21. #pragma interface            /* gcc class implementation */
  22. #endif
  23.  
  24. #ifdef HAVE_IEEEFP_H
  25. extern "C"                /* Bug in BSDI include file */
  26. {
  27. #include <ieeefp.h>
  28. }
  29. #endif
  30.  
  31. class Item_func :public Item_result_field
  32. {
  33. protected:
  34.   Item **args,*tmp_arg[2];
  35. public:
  36.   uint arg_count;
  37.   table_map used_tables_cache;
  38.   bool const_item_cache;
  39.   enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
  40.           GE_FUNC,GT_FUNC,FT_FUNC,
  41.           LIKE_FUNC,NOTLIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC,
  42.           COND_AND_FUNC,COND_OR_FUNC,BETWEEN,IN_FUNC,INTERVAL_FUNC};
  43.   enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL };
  44.   enum Type type() const { return FUNC_ITEM; }
  45.   virtual enum Functype functype() const   { return UNKNOWN_FUNC; }
  46.   Item_func(void)
  47.   {
  48.     arg_count=0; with_sum_func=0;
  49.   }
  50.   Item_func(Item *a)
  51.   {
  52.     arg_count=1;
  53.     args=tmp_arg;
  54.     args[0]=a;
  55.     with_sum_func=a->with_sum_func;
  56.   }
  57.   Item_func(Item *a,Item *b)
  58.   {
  59.     arg_count=2;
  60.     args=tmp_arg;
  61.     args[0]=a; args[1]=b;
  62.     with_sum_func=a->with_sum_func || b->with_sum_func;
  63.   }
  64.   Item_func(Item *a,Item *b,Item *c)
  65.   {
  66.     arg_count=0;
  67.     if ((args=(Item**) sql_alloc(sizeof(Item*)*3)))
  68.     {
  69.       arg_count=3;
  70.       args[0]=a; args[1]=b; args[2]=c;
  71.       with_sum_func=a->with_sum_func || b->with_sum_func || c->with_sum_func;
  72.     }
  73.   }
  74.   Item_func(Item *a,Item *b,Item *c,Item *d)
  75.   {
  76.     arg_count=0;
  77.     if ((args=(Item**) sql_alloc(sizeof(Item*)*4)))
  78.     {
  79.       arg_count=4;
  80.       args[0]=a; args[1]=b; args[2]=c; args[3]=d;
  81.       with_sum_func=a->with_sum_func || b->with_sum_func || c->with_sum_func ||
  82.     d->with_sum_func;
  83.     }
  84.   }
  85.   Item_func(Item *a,Item *b,Item *c,Item *d,Item* e)
  86.   {
  87.     arg_count=5;
  88.     if ((args=(Item**) sql_alloc(sizeof(Item*)*5)))
  89.     {
  90.       args[0]=a; args[1]=b; args[2]=c; args[3]=d; args[4]=e;
  91.       with_sum_func=a->with_sum_func || b->with_sum_func || c->with_sum_func ||
  92.     d->with_sum_func || e->with_sum_func ;
  93.     }
  94.   }
  95.   Item_func(List<Item> &list);
  96.   ~Item_func() {} /* Nothing to do; Items are freed automaticly */
  97.   bool fix_fields(THD *,struct st_table_list *);
  98.   void make_field(Send_field *field);
  99.   table_map used_tables() const;
  100.   void update_used_tables();
  101.   bool eq(const Item *item) const;
  102.   virtual optimize_type select_optimize() const { return OPTIMIZE_NONE; }
  103.   virtual bool have_rev_func() const { return 0; }
  104.   virtual Item *key_item() const { return args[0]; }
  105.   virtual const char *func_name() const { return "?"; }
  106.   virtual bool const_item() const { return const_item_cache; }
  107.   inline Item **arguments() const { return args; }
  108.   inline uint argument_count() const { return arg_count; }
  109.   inline void remove_arguments() { arg_count=0; }
  110.   virtual void split_sum_func(List<Item> &fields);
  111.   void print(String *str);
  112.   void print_op(String *str);
  113.   void fix_num_length_and_dec();
  114.   inline bool get_arg0_date(TIME *ltime,bool fuzzy_date)
  115.   {
  116.     return (null_value=args[0]->get_date(ltime,fuzzy_date));
  117.   }
  118.   inline bool get_arg0_time(TIME *ltime)
  119.   {
  120.     return (null_value=args[0]->get_time(ltime));
  121.   }
  122.   friend class udf_handler;
  123. };
  124.  
  125.  
  126. class Item_real_func :public Item_func
  127. {
  128. public:
  129.   Item_real_func() :Item_func() {}
  130.   Item_real_func(Item *a) :Item_func(a) {}
  131.   Item_real_func(Item *a,Item *b) :Item_func(a,b) {}
  132.   Item_real_func(List<Item> &list) :Item_func(list) {}
  133.   String *val_str(String*str);
  134.   longlong val_int() { return (longlong) val(); }
  135.   enum Item_result result_type () const { return REAL_RESULT; }
  136.   void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
  137. };
  138.  
  139. class Item_num_func :public Item_func
  140. {
  141.  protected:
  142.   Item_result hybrid_type;
  143. public:
  144.   Item_num_func(Item *a) :Item_func(a),hybrid_type(REAL_RESULT) {}
  145.   Item_num_func(Item *a,Item *b) :Item_func(a,b),hybrid_type(REAL_RESULT) {}
  146.   String *val_str(String*str);
  147.   longlong val_int() { return (longlong) val(); }
  148.   enum Item_result result_type () const { return hybrid_type; }
  149.   void fix_length_and_dec() { fix_num_length_and_dec(); }
  150. };
  151.  
  152.  
  153. class Item_num_op :public Item_func
  154. {
  155.  protected:
  156.   Item_result hybrid_type;
  157.  public:
  158.   Item_num_op(Item *a,Item *b) :Item_func(a,b),hybrid_type(REAL_RESULT) {}
  159.   String *val_str(String*str);
  160.   void print(String *str) { print_op(str); }
  161.   enum Item_result result_type () const { return hybrid_type; }
  162.   void fix_length_and_dec() { fix_num_length_and_dec(); find_num_type(); }
  163.   void find_num_type(void);
  164. };
  165.  
  166.  
  167. class Item_int_func :public Item_func
  168. {
  169. public:
  170.   Item_int_func() :Item_func() {}
  171.   Item_int_func(Item *a) :Item_func(a) {}
  172.   Item_int_func(Item *a,Item *b) :Item_func(a,b) {}
  173.   Item_int_func(Item *a,Item *b,Item *c) :Item_func(a,b,c) {}
  174.   Item_int_func(List<Item> &list) :Item_func(list) {}
  175.   double val() { return (double) val_int(); }
  176.   String *val_str(String*str);
  177.   enum Item_result result_type () const { return INT_RESULT; }
  178.   void fix_length_and_dec() { decimals=0; max_length=21; }
  179. };
  180.  
  181. class Item_func_plus :public Item_num_op
  182. {
  183. public:
  184.   Item_func_plus(Item *a,Item *b) :Item_num_op(a,b) {}
  185.   const char *func_name() const { return "+"; }
  186.   double val();
  187.   longlong val_int();
  188. };
  189.  
  190. class Item_func_minus :public Item_num_op
  191. {
  192. public:
  193.   Item_func_minus(Item *a,Item *b) :Item_num_op(a,b) {}
  194.   const char *func_name() const { return "-"; }
  195.   double val();
  196.   longlong val_int();
  197. };
  198.  
  199. class Item_func_mul :public Item_num_op
  200. {
  201. public:
  202.   Item_func_mul(Item *a,Item *b) :Item_num_op(a,b) {}
  203.   const char *func_name() const { return "*"; }
  204.   double val();
  205.   longlong val_int();
  206. };
  207.  
  208.  
  209. class Item_func_div :public Item_num_op
  210. {
  211. public:
  212.   Item_func_div(Item *a,Item *b) :Item_num_op(a,b) {}
  213.   double val();
  214.   longlong val_int();
  215.   const char *func_name() const { return "/"; }
  216.   void fix_length_and_dec();
  217. };
  218.  
  219.  
  220. class Item_func_mod :public Item_num_op
  221. {
  222. public:
  223.   Item_func_mod(Item *a,Item *b) :Item_num_op(a,b) {}
  224.   double val();
  225.   longlong val_int();
  226.   const char *func_name() const { return "%"; }
  227.   void fix_length_and_dec();
  228. };
  229.  
  230.  
  231. class Item_func_neg :public Item_num_func
  232. {
  233. public:
  234.   Item_func_neg(Item *a) :Item_num_func(a) {}
  235.   double val();
  236.   longlong val_int();
  237.   const char *func_name() const { return "-"; }
  238.   void fix_length_and_dec();
  239. };
  240.  
  241.  
  242. class Item_func_abs :public Item_num_func
  243. {
  244. public:
  245.   Item_func_abs(Item *a) :Item_num_func(a) {}
  246.   const char *func_name() const { return "abs"; }
  247.   double val();
  248.   longlong val_int();
  249.   enum Item_result result_type () const
  250.   { return args[0]->result_type() == INT_RESULT ? INT_RESULT : REAL_RESULT; }
  251.   void fix_length_and_dec();
  252. };
  253.  
  254. // A class to handle logaritmic and trigometric functions
  255.  
  256. class Item_dec_func :public Item_real_func
  257. {
  258.  public:
  259.   Item_dec_func(Item *a) :Item_real_func(a) {}
  260.   Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {}
  261.   void fix_length_and_dec()
  262.   {
  263.     decimals=6; max_length=float_length(decimals);
  264.     maybe_null=1;
  265.   }
  266.   inline double fix_result(double value)
  267.   {
  268. #ifndef HAVE_FINITE
  269.     return value;
  270. #else
  271.     if (finite(value) && value != POSTFIX_ERROR)
  272.       return value;
  273.     null_value=1;
  274.     return 0.0;
  275. #endif
  276.   }
  277. };
  278.  
  279. class Item_func_exp :public Item_dec_func
  280. {
  281. public:
  282.   Item_func_exp(Item *a) :Item_dec_func(a) {}
  283.   double val();
  284.   const char *func_name() const { return "exp"; }
  285. };
  286.  
  287. class Item_func_log :public Item_dec_func
  288. {
  289. public:
  290.   Item_func_log(Item *a) :Item_dec_func(a) {}
  291.   double val();
  292.   const char *func_name() const { return "log"; }
  293. };
  294.  
  295.  
  296. class Item_func_log10 :public Item_dec_func
  297. {
  298. public:
  299.   Item_func_log10(Item *a) :Item_dec_func(a) {}
  300.   double val();
  301.   const char *func_name() const { return "log10"; }
  302. };
  303.  
  304.  
  305. class Item_func_sqrt :public Item_dec_func
  306. {
  307. public:
  308.   Item_func_sqrt(Item *a) :Item_dec_func(a) {}
  309.   double val();
  310.   const char *func_name() const { return "sqrt"; }
  311. };
  312.  
  313.  
  314. class Item_func_pow :public Item_dec_func
  315. {
  316. public:
  317.   Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {}
  318.   double val();
  319.   const char *func_name() const { return "pow"; }
  320. };
  321.  
  322.  
  323. class Item_func_acos :public Item_dec_func
  324. {
  325.  public:
  326.   Item_func_acos(Item *a) :Item_dec_func(a) {}
  327.   double val();
  328.   const char *func_name() const { return "acos"; }
  329. };
  330.  
  331. class Item_func_asin :public Item_dec_func
  332. {
  333.  public:
  334.   Item_func_asin(Item *a) :Item_dec_func(a) {}
  335.   double val();
  336.   const char *func_name() const { return "asin"; }
  337. };
  338.  
  339. class Item_func_atan :public Item_dec_func
  340. {
  341.  public:
  342.   Item_func_atan(Item *a) :Item_dec_func(a) {}
  343.   Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {}
  344.   double val();
  345.   const char *func_name() const { return "atan"; }
  346. };
  347.  
  348. class Item_func_cos :public Item_dec_func
  349. {
  350.  public:
  351.   Item_func_cos(Item *a) :Item_dec_func(a) {}
  352.   double val();
  353.   const char *func_name() const { return "cos"; }
  354. };
  355.  
  356. class Item_func_sin :public Item_dec_func
  357. {
  358.  public:
  359.   Item_func_sin(Item *a) :Item_dec_func(a) {}
  360.   double val();
  361.   const char *func_name() const { return "sin"; }
  362. };
  363.  
  364. class Item_func_tan :public Item_dec_func
  365. {
  366.  public:
  367.   Item_func_tan(Item *a) :Item_dec_func(a) {}
  368.   double val();
  369.   const char *func_name() const { return "tan"; }
  370. };
  371.  
  372. class Item_func_integer :public Item_int_func
  373. {
  374. public:
  375.   inline Item_func_integer(Item *a) :Item_int_func(a) {}
  376.   void fix_length_and_dec();
  377. };
  378.  
  379.  
  380. class Item_func_ceiling :public Item_func_integer
  381. {
  382.   Item_func_ceiling();                /* Never called */
  383. public:
  384.   Item_func_ceiling(Item *a) :Item_func_integer(a) {}
  385.   const char *func_name() const { return "ceiling"; }
  386.   longlong val_int();
  387. };
  388.  
  389. class Item_func_floor :public Item_func_integer
  390. {
  391. public:
  392.   Item_func_floor(Item *a) :Item_func_integer(a) {}
  393.   const char *func_name() const { return "floor"; }
  394.   longlong val_int();
  395. };
  396.  
  397. /* This handles round and truncate */
  398.  
  399. class Item_func_round :public Item_real_func
  400. {
  401.   bool truncate;
  402. public:
  403.   Item_func_round(Item *a,Item *b,bool trunc_arg)
  404.     :Item_real_func(a,b),truncate(trunc_arg) {}
  405.   const char *func_name() const { return truncate ? "truncate" : "round"; }
  406.   double val();
  407.   void fix_length_and_dec();
  408. };
  409.  
  410.  
  411. class Item_func_rand :public Item_real_func
  412. {
  413. public:
  414.   Item_func_rand(Item *a) :Item_real_func(a) {}
  415.   Item_func_rand()      :Item_real_func()  {}
  416.   double val();
  417.   const char *func_name() const { return "rand"; }
  418.   void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
  419.   bool const_item() const { return 0; }
  420.   table_map used_tables() const { return RAND_TABLE_BIT; }
  421. };
  422.  
  423.  
  424. class Item_func_sign :public Item_int_func
  425. {
  426. public:
  427.   Item_func_sign(Item *a) :Item_int_func(a) {}
  428.   const char *func_name() const { return "sign"; }
  429.   longlong val_int();
  430. };
  431.  
  432.  
  433. class Item_func_units :public Item_real_func
  434. {
  435.   char *name;
  436.   double mul,add;
  437.  public:
  438.   Item_func_units(char *name_arg,Item *a,double mul_arg,double add_arg)
  439.     :Item_real_func(a),name(name_arg),mul(mul_arg),add(add_arg) {}
  440.   double val();
  441.   const char *func_name() const { return name; }
  442.   void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
  443. };
  444.  
  445.  
  446. class Item_func_min_max :public Item_func
  447. {
  448.   Item_result cmp_type;
  449.   String tmp_value;
  450.   int cmp_sign;
  451. public:
  452.   Item_func_min_max(List<Item> &list,int cmp_sign_arg) :Item_func(list),
  453.     cmp_sign(cmp_sign_arg) {}
  454.   double val();
  455.   longlong val_int();
  456.   String *val_str(String *);
  457.   void fix_length_and_dec();
  458.   enum Item_result result_type () const { return cmp_type; }
  459. };
  460.  
  461. class Item_func_min :public Item_func_min_max
  462. {
  463. public:
  464.   Item_func_min(List<Item> &list) :Item_func_min_max(list,1) {}
  465.   const char *func_name() const { return "least"; }
  466. };
  467.  
  468. class Item_func_max :public Item_func_min_max
  469. {
  470. public:
  471.   Item_func_max(List<Item> &list) :Item_func_min_max(list,-1) {}
  472.   const char *func_name() const { return "greatest"; }
  473. };
  474.  
  475.  
  476. class Item_func_length :public Item_int_func
  477. {
  478.   String value;
  479. public:
  480.   Item_func_length(Item *a) :Item_int_func(a) {}
  481.   longlong val_int();
  482.   const char *func_name() const { return "length"; }
  483.   void fix_length_and_dec() { max_length=10; }
  484. };
  485.  
  486. class Item_func_char_length :public Item_int_func
  487. {
  488.   String value;
  489. public:
  490.   Item_func_char_length(Item *a) :Item_int_func(a) {}
  491.   longlong val_int();
  492.   const char *func_name() const { return "char_length"; }
  493.   void fix_length_and_dec() { max_length=10; }
  494. };
  495.  
  496. class Item_func_locate :public Item_int_func
  497. {
  498.   String value1,value2;
  499. public:
  500.   Item_func_locate(Item *a,Item *b) :Item_int_func(a,b) {}
  501.   Item_func_locate(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
  502.   const char *func_name() const { return "locate"; }
  503.   longlong val_int();
  504.   void fix_length_and_dec() { maybe_null=0; max_length=11; }
  505. };
  506.  
  507.  
  508. class Item_func_field :public Item_int_func
  509. {
  510.   Item *item;
  511.   String value,tmp;
  512. public:
  513.   Item_func_field(Item *a,List<Item> &list) :Item_int_func(list),item(a) {}
  514.   ~Item_func_field() { delete item; }
  515.   longlong val_int();
  516.   bool fix_fields(THD *thd,struct st_table_list *tlist)
  517.   {
  518.     return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist));
  519.   }
  520.   void update_used_tables()
  521.   {
  522.     item->update_used_tables() ; Item_func::update_used_tables();
  523.     used_tables_cache|=item->used_tables();
  524.   }
  525.   const char *func_name() const { return "field"; }
  526.   void fix_length_and_dec()
  527.   { maybe_null=0; max_length=2; used_tables_cache|=item->used_tables();}
  528. };
  529.  
  530.  
  531. class Item_func_ascii :public Item_int_func
  532. {
  533.   String value;
  534. public:
  535.   Item_func_ascii(Item *a) :Item_int_func(a) {}
  536.   longlong val_int();
  537.   const char *func_name() const { return "ascii"; }
  538.   void fix_length_and_dec() { max_length=3; }
  539. };
  540.  
  541. class Item_func_ord :public Item_int_func
  542. {
  543.   String value;
  544. public:
  545.   Item_func_ord(Item *a) :Item_int_func(a) {}
  546.   longlong val_int();
  547.   const char *func_name() const { return "ord"; }
  548.   void fix_length_and_dec() { max_length=21; }
  549. };
  550.  
  551. class Item_func_find_in_set :public Item_int_func
  552. {
  553.   String value,value2;
  554.   uint enum_value;
  555.   ulonglong enum_bit;
  556. public:
  557.   Item_func_find_in_set(Item *a,Item *b) :Item_int_func(a,b),enum_value(0) {}
  558.   longlong val_int();
  559.   const char *func_name() const { return "find_in_set"; }
  560.   void fix_length_and_dec();
  561. };
  562.  
  563.  
  564. class Item_func_bit_or :public Item_int_func
  565. {
  566. public:
  567.   Item_func_bit_or(Item *a,Item *b) :Item_int_func(a,b) {}
  568.   longlong val_int();
  569.   const char *func_name() const { return "|"; }
  570.   void fix_length_and_dec() { decimals=0; max_length=21; }
  571. };
  572.  
  573. class Item_func_bit_and :public Item_int_func
  574. {
  575. public:
  576.   Item_func_bit_and(Item *a,Item *b) :Item_int_func(a,b) {}
  577.   longlong val_int();
  578.   const char *func_name() const { return "&"; }
  579.   void fix_length_and_dec() { decimals=0; max_length=21; }
  580. };
  581.  
  582. class Item_func_bit_count :public Item_int_func
  583. {
  584. public:
  585.   Item_func_bit_count(Item *a) :Item_int_func(a) {}
  586.   longlong val_int();
  587.   const char *func_name() const { return "bit_count"; }
  588.   void fix_length_and_dec() { decimals=0; max_length=2; }
  589. };
  590.  
  591. class Item_func_shift_left :public Item_int_func
  592. {
  593. public:
  594.   Item_func_shift_left(Item *a,Item *b) :Item_int_func(a,b) {}
  595.   longlong val_int();
  596.   const char *func_name() const { return "<<"; }
  597.   void fix_length_and_dec() { decimals=0; max_length=21; }
  598. };
  599.  
  600. class Item_func_shift_right :public Item_int_func
  601. {
  602. public:
  603.   Item_func_shift_right(Item *a,Item *b) :Item_int_func(a,b) {}
  604.   longlong val_int();
  605.   const char *func_name() const { return ">>"; }
  606.   void fix_length_and_dec() { decimals=0; max_length=21; }
  607. };
  608.  
  609. class Item_func_bit_neg :public Item_int_func
  610. {
  611. public:
  612.   Item_func_bit_neg(Item *a) :Item_int_func(a) {}
  613.   longlong val_int();
  614.   const char *func_name() const { return "~"; }
  615.   void fix_length_and_dec() { decimals=0; max_length=21; }
  616. };
  617.  
  618. class Item_func_set_last_insert_id :public Item_int_func
  619. {
  620. public:
  621.   Item_func_set_last_insert_id(Item *a) :Item_int_func(a) {}
  622.   longlong val_int();
  623.   const char *func_name() const { return "last_insert_id"; }
  624.   void fix_length_and_dec() { decimals=0; max_length=args[0]->max_length; }
  625. };
  626.  
  627. class Item_func_benchmark :public Item_int_func
  628. {
  629.   ulong loop_count;
  630.  public:
  631.   Item_func_benchmark(ulong loop_count_arg,Item *expr)
  632.     :Item_int_func(expr), loop_count(loop_count_arg)
  633.   {}
  634.   longlong val_int();
  635.   const char *func_name() const { return "benchmark"; }
  636.   void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=0; }
  637. };
  638.  
  639.  
  640. #ifdef HAVE_DLOPEN
  641.  
  642. class Item_udf_func :public Item_func
  643. {
  644.  protected:
  645.   udf_handler udf;
  646.  
  647. public:
  648.   Item_udf_func(udf_func *udf_arg) :Item_func(), udf(udf_arg) {}
  649.   Item_udf_func(udf_func *udf_arg, List<Item> &list)
  650.     :Item_func(list), udf(udf_arg) {}
  651.   ~Item_udf_func() {}
  652.   const char *func_name() const { return udf.name(); }
  653.   bool fix_fields(THD *thd,struct st_table_list *tables)
  654.   {
  655.     bool res=udf.fix_fields(thd,tables,this,arg_count,args);
  656.     used_tables_cache=udf.used_tables_cache;
  657.     const_item_cache=udf.const_item_cache;
  658.     return res;
  659.   }
  660.   Item_result result_type () const { return udf.result_type(); }
  661. };
  662.  
  663.  
  664. class Item_func_udf_float :public Item_udf_func
  665. {
  666.  public:
  667.   Item_func_udf_float(udf_func *udf_arg) :Item_udf_func(udf_arg) {}
  668.   Item_func_udf_float(udf_func *udf_arg, List<Item> &list)
  669.     :Item_udf_func(udf_arg,list) {}
  670.   ~Item_func_udf_float() {}
  671.   longlong val_int() { return (longlong) Item_func_udf_float::val(); }
  672.   double val();
  673.   String *val_str(String *str);
  674.   void fix_length_and_dec() { fix_num_length_and_dec(); }
  675. };
  676.  
  677.  
  678. class Item_func_udf_int :public Item_udf_func
  679. {
  680. public:
  681.   Item_func_udf_int(udf_func *udf_arg) :Item_udf_func(udf_arg) {}
  682.   Item_func_udf_int(udf_func *udf_arg, List<Item> &list)
  683.     :Item_udf_func(udf_arg,list) {}
  684.   ~Item_func_udf_int() {}
  685.   longlong val_int();
  686.   double val() { return (double) Item_func_udf_int::val_int(); }
  687.   String *val_str(String *str);
  688.   enum Item_result result_type () const { return INT_RESULT; }
  689.   void fix_length_and_dec() { decimals=0; max_length=21; }
  690. };
  691.  
  692.  
  693. class Item_func_udf_str :public Item_udf_func
  694. {
  695. public:
  696.   Item_func_udf_str(udf_func *udf_arg) :Item_udf_func(udf_arg) {}
  697.   Item_func_udf_str(udf_func *udf_arg, List<Item> &list)
  698.     :Item_udf_func(udf_arg,list) {}
  699.   ~Item_func_udf_str() {}
  700.   String *val_str(String *);
  701.   double val()
  702.   {
  703.     String *res;  res=val_str(&str_value);
  704.     return res ? atof(res->c_ptr()) : 0.0;
  705.   }
  706.   longlong val_int()
  707.   {
  708.     String *res;  res=val_str(&str_value);
  709.     return res ? strtoll(res->c_ptr(),(char**) 0,10) : (longlong) 0;
  710.   }
  711.   enum Item_result result_type () const { return STRING_RESULT; }
  712.   void fix_length_and_dec();
  713. };
  714.  
  715. #else /* Dummy functions to get sql_yacc.cc compiled */
  716.  
  717. class Item_func_udf_float :public Item_real_func
  718. {
  719.  public:
  720.   Item_func_udf_float(udf_func *udf_arg) :Item_real_func() {}
  721.   Item_func_udf_float(udf_func *udf_arg, List<Item> &list) :Item_real_func(list) {}
  722.   ~Item_func_udf_float() {}
  723.   double val() { return 0.0; }
  724. };
  725.  
  726.  
  727. class Item_func_udf_int :public Item_int_func
  728. {
  729. public:
  730.   Item_func_udf_int(udf_func *udf_arg) :Item_int_func() {}
  731.   Item_func_udf_int(udf_func *udf_arg, List<Item> &list) :Item_int_func(list) {}
  732.   ~Item_func_udf_int() {}
  733.   longlong val_int() { return 0; }
  734. };
  735.  
  736.  
  737. class Item_func_udf_str :public Item_func
  738. {
  739. public:
  740.   Item_func_udf_str(udf_func *udf_arg) :Item_func() {}
  741.   Item_func_udf_str(udf_func *udf_arg, List<Item> &list)  :Item_func(list) {}
  742.   ~Item_func_udf_str() {}
  743.   String *val_str(String *) { null_value=1; return 0; }
  744.   double val() { null_value=1; return 0.0; }
  745.   longlong val_int() { null_value=1; return 0; }
  746.   enum Item_result result_type () const { return STRING_RESULT; }
  747.   void fix_length_and_dec() { maybe_null=1; max_length=0; }
  748. };
  749.  
  750. #endif /* HAVE_DLOPEN */
  751.  
  752. /*
  753. ** User level locks
  754. */
  755.  
  756. class ULL;
  757. void item_user_lock_init(void);
  758. void item_user_lock_release(ULL *ull);
  759. void item_user_lock_free(void);
  760.  
  761. class Item_func_get_lock :public Item_int_func
  762. {
  763.   String value;
  764.  public:
  765.   Item_func_get_lock(Item *a,Item *b) :Item_int_func(a,b) {}
  766.   longlong val_int();
  767.   const char *func_name() const { return "get_lock"; }
  768.   void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
  769. };
  770.  
  771. class Item_func_release_lock :public Item_int_func
  772. {
  773.   String value;
  774.  public:
  775.   Item_func_release_lock(Item *a) :Item_int_func(a) {}
  776.   longlong val_int();
  777.   const char *func_name() const { return "release_lock"; }
  778.   void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
  779. };
  780.  
  781.  
  782. /* Handling of user definiable variables */
  783.  
  784. class user_var_entry;
  785.  
  786. class Item_func_set_user_var :public Item_func
  787. {
  788.   enum Item_result cached_result_type;
  789.   LEX_STRING name;
  790.   user_var_entry *entry;
  791.  
  792. public:
  793.   Item_func_set_user_var(LEX_STRING a,Item *b): Item_func(b), name(a) {}
  794.   double val();
  795.   longlong val_int();
  796.   String *val_str(String *str);
  797.   void update_hash(void *ptr, uint length, enum Item_result type);
  798.   bool update();
  799.   enum Item_result result_type () const { return cached_result_type; }
  800.   bool fix_fields(THD *thd,struct st_table_list *tables);
  801.   void fix_length_and_dec();
  802.   const char *func_name() const { return "set_user_var"; }
  803. };
  804.  
  805.  
  806. class Item_func_get_user_var :public Item_func
  807. {
  808.   LEX_STRING name;
  809.   user_var_entry *entry;
  810.  
  811. public:
  812.   Item_func_get_user_var(LEX_STRING a): Item_func(), name(a) {}
  813.   user_var_entry *get_entry();
  814.   double val();
  815.   longlong val_int();
  816.   String *val_str(String* str);
  817.   void fix_length_and_dec();
  818.   enum Item_result result_type() const;
  819.   const char *func_name() const { return "get_user_var"; }
  820. };
  821.  
  822. class Item_func_inet_aton : public Item_int_func
  823. {
  824. public:
  825.    Item_func_inet_aton(Item *a) :Item_int_func(a) {}
  826.    longlong val_int();
  827.    const char *func_name() const { return "inet_aton"; }
  828.    void fix_length_and_dec() { decimals = 0; max_length = 21; maybe_null=1;}
  829. };
  830.  
  831.  
  832. /* for fulltext search */
  833. #include <ft_global.h>
  834.  
  835. class Item_func_match :public Item_real_func
  836. {
  837. public:
  838.   List<Item> fields;
  839.   TABLE *table;
  840.   uint key;
  841.   bool join_key;
  842.   Item_func_match *master;
  843.   FT_DOCLIST *ft_handler;
  844.  
  845.   Item_func_match(List<Item> &a, Item *b): Item_real_func(b),
  846.   fields(a), table(0),  join_key(0), master(0), ft_handler(0) {}
  847.   ~Item_func_match()
  848.   {
  849.     if (!master)
  850.     {
  851.       if (ft_handler)
  852.     ft_close_search(ft_handler);
  853.       if(join_key)
  854.         table->file->ft_handler=0;
  855.     }
  856.   }
  857.   const char *func_name() const { return "match"; }
  858.   enum Functype functype() const { return FT_FUNC; }
  859.   void update_used_tables() {}
  860.   bool fix_fields(THD *thd,struct st_table_list *tlist);
  861.   bool eq(const Item *) const;
  862.   double val();
  863.   longlong val_int() { return val()!=0.0; }
  864.  
  865.   bool fix_index();
  866.   void init_search(bool no_order);
  867. };
  868.