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

MySQL数据库

开发平台:

Visual C++

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