item_func.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:31k
源码类别:

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 USE_PRAGMA_INTERFACE
  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.   /*
  28.     Allowed numbers of columns in result (usually 1, which means scalar value)
  29.     0 means get this number from first argument
  30.   */
  31.   uint allowed_arg_cols;
  32. public:
  33.   uint arg_count;
  34.   table_map used_tables_cache, not_null_tables_cache;
  35.   bool const_item_cache;
  36.   enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
  37.   GE_FUNC,GT_FUNC,FT_FUNC,
  38.   LIKE_FUNC,NOTLIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC,
  39.   COND_AND_FUNC, COND_OR_FUNC, COND_XOR_FUNC, BETWEEN, IN_FUNC,
  40.   INTERVAL_FUNC, ISNOTNULLTEST_FUNC,
  41.   SP_EQUALS_FUNC, SP_DISJOINT_FUNC,SP_INTERSECTS_FUNC,
  42.   SP_TOUCHES_FUNC,SP_CROSSES_FUNC,SP_WITHIN_FUNC,
  43.   SP_CONTAINS_FUNC,SP_OVERLAPS_FUNC,
  44.   SP_STARTPOINT,SP_ENDPOINT,SP_EXTERIORRING,
  45.   SP_POINTN,SP_GEOMETRYN,SP_INTERIORRINGN,
  46.   NOT_FUNC, NOT_ALL_FUNC, NOW_FUNC, VAR_VALUE_FUNC};
  47.   enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL };
  48.   enum Type type() const { return FUNC_ITEM; }
  49.   virtual enum Functype functype() const   { return UNKNOWN_FUNC; }
  50.   Item_func(void):
  51.     allowed_arg_cols(1), arg_count(0)
  52.   {
  53.     with_sum_func= 0;
  54.   }
  55.   Item_func(Item *a):
  56.     allowed_arg_cols(1), arg_count(1)
  57.   {
  58.     args= tmp_arg;
  59.     args[0]= a;
  60.     with_sum_func= a->with_sum_func;
  61.   }
  62.   Item_func(Item *a,Item *b):
  63.     allowed_arg_cols(1), arg_count(2)
  64.   {
  65.     args= tmp_arg;
  66.     args[0]= a; args[1]= b;
  67.     with_sum_func= a->with_sum_func || b->with_sum_func;
  68.   }
  69.   Item_func(Item *a,Item *b,Item *c):
  70.     allowed_arg_cols(1)
  71.   {
  72.     arg_count= 0;
  73.     if ((args= (Item**) sql_alloc(sizeof(Item*)*3)))
  74.     {
  75.       arg_count= 3;
  76.       args[0]= a; args[1]= b; args[2]= c;
  77.       with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func;
  78.     }
  79.   }
  80.   Item_func(Item *a,Item *b,Item *c,Item *d):
  81.     allowed_arg_cols(1)
  82.   {
  83.     arg_count= 0;
  84.     if ((args= (Item**) sql_alloc(sizeof(Item*)*4)))
  85.     {
  86.       arg_count= 4;
  87.       args[0]= a; args[1]= b; args[2]= c; args[3]= d;
  88.       with_sum_func= a->with_sum_func || b->with_sum_func ||
  89. c->with_sum_func || d->with_sum_func;
  90.     }
  91.   }
  92.   Item_func(Item *a,Item *b,Item *c,Item *d,Item* e):
  93.     allowed_arg_cols(1)
  94.   {
  95.     arg_count= 5;
  96.     if ((args= (Item**) sql_alloc(sizeof(Item*)*5)))
  97.     {
  98.       args[0]= a; args[1]= b; args[2]= c; args[3]= d; args[4]= e;
  99.       with_sum_func= a->with_sum_func || b->with_sum_func ||
  100. c->with_sum_func || d->with_sum_func || e->with_sum_func ;
  101.     }
  102.   }
  103.   Item_func(List<Item> &list);
  104.   // Constructor used for Item_cond_and/or (see Item comment)
  105.   Item_func(THD *thd, Item_func *item);
  106.   bool fix_fields(THD *,struct st_table_list *, Item **ref);
  107.   table_map used_tables() const;
  108.   table_map not_null_tables() const;
  109.   void update_used_tables();
  110.   bool eq(const Item *item, bool binary_cmp) const;
  111.   virtual optimize_type select_optimize() const { return OPTIMIZE_NONE; }
  112.   virtual bool have_rev_func() const { return 0; }
  113.   virtual Item *key_item() const { return args[0]; }
  114.   virtual const char *func_name() const { return "?"; }
  115.   virtual bool const_item() const { return const_item_cache; }
  116.   inline Item **arguments() const { return args; }
  117.   void set_arguments(List<Item> &list);
  118.   inline uint argument_count() const { return arg_count; }
  119.   inline void remove_arguments() { arg_count=0; }
  120.   void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
  121.   void print(String *str);
  122.   void print_op(String *str);
  123.   void print_args(String *str, uint from);
  124.   void fix_num_length_and_dec();
  125.   inline bool get_arg0_date(TIME *ltime, uint fuzzy_date)
  126.   {
  127.     return (null_value=args[0]->get_date(ltime, fuzzy_date));
  128.   }
  129.   inline bool get_arg0_time(TIME *ltime)
  130.   {
  131.     return (null_value=args[0]->get_time(ltime));
  132.   }
  133.   bool is_null() { (void) val_int(); return null_value; }
  134.   friend class udf_handler;
  135.   Field *tmp_table_field() { return result_field; }
  136.   Field *tmp_table_field(TABLE *t_arg);
  137.   Item *get_tmp_table_item(THD *thd);
  138.   
  139.   bool agg_arg_collations(DTCollation &c, Item **items, uint nitems,
  140.                           uint flags= 0)
  141.   {
  142.     return agg_item_collations(c, func_name(), items, nitems, flags);
  143.   }
  144.   bool agg_arg_collations_for_comparison(DTCollation &c,
  145.                                          Item **items, uint nitems,
  146.                                          uint flags= 0)
  147.   {
  148.     return agg_item_collations_for_comparison(c, func_name(),
  149.                                               items, nitems, flags);
  150.   }
  151.   bool agg_arg_charsets(DTCollation &c, Item **items, uint nitems,
  152.                         uint flags= 0)
  153.   {
  154.     return agg_item_charsets(c, func_name(), items, nitems, flags);
  155.   }
  156.   bool walk(Item_processor processor, byte *arg);
  157. };
  158. class Item_real_func :public Item_func
  159. {
  160. public:
  161.   Item_real_func() :Item_func() {}
  162.   Item_real_func(Item *a) :Item_func(a) {}
  163.   Item_real_func(Item *a,Item *b) :Item_func(a,b) {}
  164.   Item_real_func(List<Item> &list) :Item_func(list) {}
  165.   String *val_str(String*str);
  166.   longlong val_int() { DBUG_ASSERT(fixed == 1); return (longlong) val(); }
  167.   enum Item_result result_type () const { return REAL_RESULT; }
  168.   void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
  169. };
  170. class Item_num_func :public Item_func
  171. {
  172.  protected:
  173.   Item_result hybrid_type;
  174. public:
  175.   Item_num_func(Item *a) :Item_func(a),hybrid_type(REAL_RESULT) {}
  176.   Item_num_func(Item *a,Item *b) :Item_func(a,b),hybrid_type(REAL_RESULT) {}
  177.   String *val_str(String*str);
  178.   longlong val_int() { DBUG_ASSERT(fixed == 1); return (longlong) val(); }
  179.   enum Item_result result_type () const { return hybrid_type; }
  180.   void fix_length_and_dec() { fix_num_length_and_dec(); }
  181.   bool is_null() { (void) val(); return null_value; }
  182. };
  183. class Item_num_op :public Item_func
  184. {
  185.  protected:
  186.   Item_result hybrid_type;
  187.  public:
  188.   Item_num_op(Item *a,Item *b) :Item_func(a,b),hybrid_type(REAL_RESULT) {}
  189.   String *val_str(String*str);
  190.   void print(String *str) { print_op(str); }
  191.   enum Item_result result_type () const { return hybrid_type; }
  192.   void fix_length_and_dec() { fix_num_length_and_dec(); find_num_type(); }
  193.   void find_num_type(void);
  194.   bool is_null() { (void) val(); return null_value; }
  195. };
  196. class Item_int_func :public Item_func
  197. {
  198. public:
  199.   Item_int_func() :Item_func() { max_length=21; }
  200.   Item_int_func(Item *a) :Item_func(a) { max_length=21; }
  201.   Item_int_func(Item *a,Item *b) :Item_func(a,b) { max_length=21; }
  202.   Item_int_func(Item *a,Item *b,Item *c) :Item_func(a,b,c) { max_length=21; }
  203.   Item_int_func(List<Item> &list) :Item_func(list) { max_length=21; }
  204.   Item_int_func(THD *thd, Item_int_func *item) :Item_func(thd, item) {}
  205.   double val() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
  206.   String *val_str(String*str);
  207.   enum Item_result result_type () const { return INT_RESULT; }
  208.   void fix_length_and_dec() {}
  209. };
  210. class Item_func_signed :public Item_int_func
  211. {
  212. public:
  213.   Item_func_signed(Item *a) :Item_int_func(a) {}
  214.   const char *func_name() const { return "cast_as_signed"; }
  215.   double val()
  216.   {
  217.     double tmp= args[0]->val();
  218.     null_value= args[0]->null_value;
  219.     return tmp;
  220.   }
  221.   longlong val_int();
  222.   longlong val_int_from_str(int *error);
  223.   void fix_length_and_dec()
  224.   { max_length=args[0]->max_length; unsigned_flag=0; }
  225.   void print(String *str);
  226. };
  227. class Item_func_unsigned :public Item_func_signed
  228. {
  229. public:
  230.   Item_func_unsigned(Item *a) :Item_func_signed(a) {}
  231.   const char *func_name() const { return "cast_as_unsigned"; }
  232.   void fix_length_and_dec()
  233.   { max_length=args[0]->max_length; unsigned_flag=1; }
  234.   longlong val_int();
  235.   void print(String *str);
  236. };
  237. class Item_func_plus :public Item_num_op
  238. {
  239. public:
  240.   Item_func_plus(Item *a,Item *b) :Item_num_op(a,b) {}
  241.   const char *func_name() const { return "+"; }
  242.   double val();
  243.   longlong val_int();
  244. };
  245. class Item_func_minus :public Item_num_op
  246. {
  247. public:
  248.   Item_func_minus(Item *a,Item *b) :Item_num_op(a,b) {}
  249.   const char *func_name() const { return "-"; }
  250.   double val();
  251.   longlong val_int();
  252.   void fix_length_and_dec();
  253. };
  254. class Item_func_mul :public Item_num_op
  255. {
  256. public:
  257.   Item_func_mul(Item *a,Item *b) :Item_num_op(a,b) {}
  258.   const char *func_name() const { return "*"; }
  259.   double val();
  260.   longlong val_int();
  261. };
  262. class Item_func_div :public Item_num_op
  263. {
  264. public:
  265.   Item_func_div(Item *a,Item *b) :Item_num_op(a,b) {}
  266.   double val();
  267.   longlong val_int();
  268.   const char *func_name() const { return "/"; }
  269.   void fix_length_and_dec();
  270. };
  271. class Item_func_int_div :public Item_num_op
  272. {
  273. public:
  274.   Item_func_int_div(Item *a,Item *b) :Item_num_op(a,b)
  275.   { hybrid_type=INT_RESULT; }
  276.   double val() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
  277.   longlong val_int();
  278.   const char *func_name() const { return "DIV"; }
  279.   void fix_length_and_dec();
  280. };
  281. class Item_func_mod :public Item_num_op
  282. {
  283. public:
  284.   Item_func_mod(Item *a,Item *b) :Item_num_op(a,b) {}
  285.   double val();
  286.   longlong val_int();
  287.   const char *func_name() const { return "%"; }
  288.   void fix_length_and_dec();
  289. };
  290. class Item_func_neg :public Item_num_func
  291. {
  292. public:
  293.   Item_func_neg(Item *a) :Item_num_func(a) {}
  294.   double val();
  295.   longlong val_int();
  296.   const char *func_name() const { return "-"; }
  297.   void fix_length_and_dec();
  298. };
  299. class Item_func_abs :public Item_num_func
  300. {
  301. public:
  302.   Item_func_abs(Item *a) :Item_num_func(a) {}
  303.   const char *func_name() const { return "abs"; }
  304.   double val();
  305.   longlong val_int();
  306.   enum Item_result result_type () const
  307.   { return args[0]->result_type() == INT_RESULT ? INT_RESULT : REAL_RESULT; }
  308.   void fix_length_and_dec();
  309. };
  310. // A class to handle logaritmic and trigometric functions
  311. class Item_dec_func :public Item_real_func
  312. {
  313.  public:
  314.   Item_dec_func(Item *a) :Item_real_func(a) {}
  315.   Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {}
  316.   void fix_length_and_dec()
  317.   {
  318.     decimals=NOT_FIXED_DEC; max_length=float_length(decimals);
  319.     maybe_null=1;
  320.   }
  321.   inline double fix_result(double value)
  322.   {
  323. #ifndef HAVE_FINITE
  324.     return value;
  325. #else
  326.     /* The following should be safe, even if we compare doubles */
  327.     if (finite(value) && value != POSTFIX_ERROR)
  328.       return value;
  329.     null_value=1;
  330.     return 0.0;
  331. #endif
  332.   }
  333. };
  334. class Item_func_exp :public Item_dec_func
  335. {
  336. public:
  337.   Item_func_exp(Item *a) :Item_dec_func(a) {}
  338.   double val();
  339.   const char *func_name() const { return "exp"; }
  340. };
  341. class Item_func_ln :public Item_dec_func
  342. {
  343. public:
  344.   Item_func_ln(Item *a) :Item_dec_func(a) {}
  345.   double val();
  346.   const char *func_name() const { return "ln"; }
  347. };
  348. class Item_func_log :public Item_dec_func
  349. {
  350. public:
  351.   Item_func_log(Item *a) :Item_dec_func(a) {}
  352.   Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {}
  353.   double val();
  354.   const char *func_name() const { return "log"; }
  355. };
  356. class Item_func_log2 :public Item_dec_func
  357. {
  358. public:
  359.   Item_func_log2(Item *a) :Item_dec_func(a) {}
  360.   double val();
  361.   const char *func_name() const { return "log2"; }
  362. };
  363. class Item_func_log10 :public Item_dec_func
  364. {
  365. public:
  366.   Item_func_log10(Item *a) :Item_dec_func(a) {}
  367.   double val();
  368.   const char *func_name() const { return "log10"; }
  369. };
  370. class Item_func_sqrt :public Item_dec_func
  371. {
  372. public:
  373.   Item_func_sqrt(Item *a) :Item_dec_func(a) {}
  374.   double val();
  375.   const char *func_name() const { return "sqrt"; }
  376. };
  377. class Item_func_pow :public Item_dec_func
  378. {
  379. public:
  380.   Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {}
  381.   double val();
  382.   const char *func_name() const { return "pow"; }
  383. };
  384. class Item_func_acos :public Item_dec_func
  385. {
  386.  public:
  387.   Item_func_acos(Item *a) :Item_dec_func(a) {}
  388.   double val();
  389.   const char *func_name() const { return "acos"; }
  390. };
  391. class Item_func_asin :public Item_dec_func
  392. {
  393.  public:
  394.   Item_func_asin(Item *a) :Item_dec_func(a) {}
  395.   double val();
  396.   const char *func_name() const { return "asin"; }
  397. };
  398. class Item_func_atan :public Item_dec_func
  399. {
  400.  public:
  401.   Item_func_atan(Item *a) :Item_dec_func(a) {}
  402.   Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {}
  403.   double val();
  404.   const char *func_name() const { return "atan"; }
  405. };
  406. class Item_func_cos :public Item_dec_func
  407. {
  408.  public:
  409.   Item_func_cos(Item *a) :Item_dec_func(a) {}
  410.   double val();
  411.   const char *func_name() const { return "cos"; }
  412. };
  413. class Item_func_sin :public Item_dec_func
  414. {
  415.  public:
  416.   Item_func_sin(Item *a) :Item_dec_func(a) {}
  417.   double val();
  418.   const char *func_name() const { return "sin"; }
  419. };
  420. class Item_func_tan :public Item_dec_func
  421. {
  422.  public:
  423.   Item_func_tan(Item *a) :Item_dec_func(a) {}
  424.   double val();
  425.   const char *func_name() const { return "tan"; }
  426. };
  427. class Item_func_integer :public Item_int_func
  428. {
  429. public:
  430.   inline Item_func_integer(Item *a) :Item_int_func(a) {}
  431.   void fix_length_and_dec();
  432. };
  433. class Item_func_ceiling :public Item_func_integer
  434. {
  435.   Item_func_ceiling(); /* Never called */
  436. public:
  437.   Item_func_ceiling(Item *a) :Item_func_integer(a) {}
  438.   const char *func_name() const { return "ceiling"; }
  439.   longlong val_int();
  440. };
  441. class Item_func_floor :public Item_func_integer
  442. {
  443. public:
  444.   Item_func_floor(Item *a) :Item_func_integer(a) {}
  445.   const char *func_name() const { return "floor"; }
  446.   longlong val_int();
  447. };
  448. /* This handles round and truncate */
  449. class Item_func_round :public Item_real_func
  450. {
  451.   bool truncate;
  452. public:
  453.   Item_func_round(Item *a,Item *b,bool trunc_arg)
  454.     :Item_real_func(a,b),truncate(trunc_arg) {}
  455.   const char *func_name() const { return truncate ? "truncate" : "round"; }
  456.   double val();
  457.   void fix_length_and_dec();
  458. };
  459. class Item_func_rand :public Item_real_func
  460. {
  461.   struct rand_struct *rand;
  462. public:
  463.   Item_func_rand(Item *a) :Item_real_func(a), rand(0) {}
  464.   Item_func_rand()   :Item_real_func() {}
  465.   double val();
  466.   const char *func_name() const { return "rand"; }
  467.   bool const_item() const { return 0; }
  468.   void update_used_tables();
  469.   bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref);
  470. };
  471. class Item_func_sign :public Item_int_func
  472. {
  473. public:
  474.   Item_func_sign(Item *a) :Item_int_func(a) {}
  475.   const char *func_name() const { return "sign"; }
  476.   longlong val_int();
  477. };
  478. class Item_func_units :public Item_real_func
  479. {
  480.   char *name;
  481.   double mul,add;
  482.  public:
  483.   Item_func_units(char *name_arg,Item *a,double mul_arg,double add_arg)
  484.     :Item_real_func(a),name(name_arg),mul(mul_arg),add(add_arg) {}
  485.   double val();
  486.   const char *func_name() const { return name; }
  487.   void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
  488. };
  489. class Item_func_min_max :public Item_func
  490. {
  491.   Item_result cmp_type;
  492.   String tmp_value;
  493.   int cmp_sign;
  494. public:
  495.   Item_func_min_max(List<Item> &list,int cmp_sign_arg) :Item_func(list),
  496.     cmp_type(INT_RESULT), cmp_sign(cmp_sign_arg) {}
  497.   double val();
  498.   longlong val_int();
  499.   String *val_str(String *);
  500.   void fix_length_and_dec();
  501.   enum Item_result result_type () const { return cmp_type; }
  502.   table_map not_null_tables() const { return 0; }
  503. };
  504. class Item_func_min :public Item_func_min_max
  505. {
  506. public:
  507.   Item_func_min(List<Item> &list) :Item_func_min_max(list,1) {}
  508.   const char *func_name() const { return "least"; }
  509. };
  510. class Item_func_max :public Item_func_min_max
  511. {
  512. public:
  513.   Item_func_max(List<Item> &list) :Item_func_min_max(list,-1) {}
  514.   const char *func_name() const { return "greatest"; }
  515. };
  516. class Item_func_length :public Item_int_func
  517. {
  518.   String value;
  519. public:
  520.   Item_func_length(Item *a) :Item_int_func(a) {}
  521.   longlong val_int();
  522.   const char *func_name() const { return "length"; }
  523.   void fix_length_and_dec() { max_length=10; }
  524. };
  525. class Item_func_bit_length :public Item_func_length
  526. {
  527. public:
  528.   Item_func_bit_length(Item *a) :Item_func_length(a) {}
  529.   longlong val_int()
  530.     { DBUG_ASSERT(fixed == 1); return Item_func_length::val_int()*8; }
  531.   const char *func_name() const { return "bit_length"; }
  532. };
  533. class Item_func_char_length :public Item_int_func
  534. {
  535.   String value;
  536. public:
  537.   Item_func_char_length(Item *a) :Item_int_func(a) {}
  538.   longlong val_int();
  539.   const char *func_name() const { return "char_length"; }
  540.   void fix_length_and_dec() { max_length=10; }
  541. };
  542. class Item_func_coercibility :public Item_int_func
  543. {
  544. public:
  545.   Item_func_coercibility(Item *a) :Item_int_func(a) {}
  546.   longlong val_int();
  547.   const char *func_name() const { return "coercibility"; }
  548.   void fix_length_and_dec() { max_length=10; maybe_null= 0; }
  549.   table_map not_null_tables() const { return 0; }
  550. };
  551. class Item_func_locate :public Item_int_func
  552. {
  553.   String value1,value2;
  554.   DTCollation cmp_collation;
  555. public:
  556.   Item_func_locate(Item *a,Item *b) :Item_int_func(a,b) {}
  557.   Item_func_locate(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
  558.   const char *func_name() const { return "locate"; }
  559.   longlong val_int();
  560.   void fix_length_and_dec();
  561.   void print(String *str);
  562. };
  563. class Item_func_field :public Item_int_func
  564. {
  565.   String value,tmp;
  566.   Item_result cmp_type;
  567.   DTCollation cmp_collation;
  568. public:
  569.   Item_func_field(List<Item> &list) :Item_int_func(list) {}
  570.   longlong val_int();
  571.   const char *func_name() const { return "field"; }
  572.   void fix_length_and_dec();
  573. };
  574. class Item_func_ascii :public Item_int_func
  575. {
  576.   String value;
  577. public:
  578.   Item_func_ascii(Item *a) :Item_int_func(a) {}
  579.   longlong val_int();
  580.   const char *func_name() const { return "ascii"; }
  581.   void fix_length_and_dec() { max_length=3; }
  582. };
  583. class Item_func_ord :public Item_int_func
  584. {
  585.   String value;
  586. public:
  587.   Item_func_ord(Item *a) :Item_int_func(a) {}
  588.   longlong val_int();
  589.   const char *func_name() const { return "ord"; }
  590. };
  591. class Item_func_find_in_set :public Item_int_func
  592. {
  593.   String value,value2;
  594.   uint enum_value;
  595.   ulonglong enum_bit;
  596.   DTCollation cmp_collation;
  597. public:
  598.   Item_func_find_in_set(Item *a,Item *b) :Item_int_func(a,b),enum_value(0) {}
  599.   longlong val_int();
  600.   const char *func_name() const { return "find_in_set"; }
  601.   void fix_length_and_dec();
  602. };
  603. /* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */
  604. class Item_func_bit: public Item_int_func
  605. {
  606. public:
  607.   Item_func_bit(Item *a, Item *b) :Item_int_func(a, b) {}
  608.   Item_func_bit(Item *a) :Item_int_func(a) {}
  609.   void fix_length_and_dec() { unsigned_flag= 1; }
  610.   void print(String *str) { print_op(str); }
  611. };
  612. class Item_func_bit_or :public Item_func_bit
  613. {
  614. public:
  615.   Item_func_bit_or(Item *a, Item *b) :Item_func_bit(a, b) {}
  616.   longlong val_int();
  617.   const char *func_name() const { return "|"; }
  618. };
  619. class Item_func_bit_and :public Item_func_bit
  620. {
  621. public:
  622.   Item_func_bit_and(Item *a, Item *b) :Item_func_bit(a, b) {}
  623.   longlong val_int();
  624.   const char *func_name() const { return "&"; }
  625. };
  626. class Item_func_bit_count :public Item_int_func
  627. {
  628. public:
  629.   Item_func_bit_count(Item *a) :Item_int_func(a) {}
  630.   longlong val_int();
  631.   const char *func_name() const { return "bit_count"; }
  632.   void fix_length_and_dec() { max_length=2; }
  633. };
  634. class Item_func_shift_left :public Item_func_bit
  635. {
  636. public:
  637.   Item_func_shift_left(Item *a, Item *b) :Item_func_bit(a, b) {}
  638.   longlong val_int();
  639.   const char *func_name() const { return "<<"; }
  640. };
  641. class Item_func_shift_right :public Item_func_bit
  642. {
  643. public:
  644.   Item_func_shift_right(Item *a, Item *b) :Item_func_bit(a, b) {}
  645.   longlong val_int();
  646.   const char *func_name() const { return ">>"; }
  647. };
  648. class Item_func_bit_neg :public Item_func_bit
  649. {
  650. public:
  651.   Item_func_bit_neg(Item *a) :Item_func_bit(a) {}
  652.   longlong val_int();
  653.   const char *func_name() const { return "~"; }
  654.   void print(String *str) { Item_func::print(str); }
  655. };
  656. class Item_func_last_insert_id :public Item_int_func
  657. {
  658. public:
  659.   Item_func_last_insert_id() :Item_int_func() {}
  660.   Item_func_last_insert_id(Item *a) :Item_int_func(a) {}
  661.   longlong val_int();
  662.   const char *func_name() const { return "last_insert_id"; }
  663.   void fix_length_and_dec() { if (arg_count) max_length= args[0]->max_length; }
  664. };
  665. class Item_func_benchmark :public Item_int_func
  666. {
  667.   ulong loop_count;
  668.  public:
  669.   Item_func_benchmark(ulong loop_count_arg,Item *expr)
  670.     :Item_int_func(expr), loop_count(loop_count_arg)
  671.   {}
  672.   longlong val_int();
  673.   const char *func_name() const { return "benchmark"; }
  674.   void fix_length_and_dec() { max_length=1; maybe_null=0; }
  675.   void print(String *str);
  676. };
  677. #ifdef HAVE_DLOPEN
  678. class Item_udf_func :public Item_func
  679. {
  680.  protected:
  681.   udf_handler udf;
  682. public:
  683.   Item_udf_func(udf_func *udf_arg) :Item_func(), udf(udf_arg) {}
  684.   Item_udf_func(udf_func *udf_arg, List<Item> &list)
  685.     :Item_func(list), udf(udf_arg) {}
  686.   const char *func_name() const { return udf.name(); }
  687.   bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref)
  688.   {
  689.     DBUG_ASSERT(fixed == 0);
  690.     bool res= udf.fix_fields(thd, tables, this, arg_count, args);
  691.     used_tables_cache= udf.used_tables_cache;
  692.     const_item_cache= udf.const_item_cache;
  693.     fixed= 1;
  694.     return res;
  695.   }
  696.   void cleanup();
  697.   Item_result result_type () const { return udf.result_type(); }
  698.   table_map not_null_tables() const { return 0; }
  699. };
  700. class Item_func_udf_float :public Item_udf_func
  701. {
  702.  public:
  703.   Item_func_udf_float(udf_func *udf_arg) :Item_udf_func(udf_arg) {}
  704.   Item_func_udf_float(udf_func *udf_arg, List<Item> &list)
  705.     :Item_udf_func(udf_arg,list) {}
  706.   longlong val_int()
  707.     { DBUG_ASSERT(fixed == 1); return (longlong) Item_func_udf_float::val(); }
  708.   double val();
  709.   String *val_str(String *str);
  710.   void fix_length_and_dec() { fix_num_length_and_dec(); }
  711. };
  712. class Item_func_udf_int :public Item_udf_func
  713. {
  714. public:
  715.   Item_func_udf_int(udf_func *udf_arg) :Item_udf_func(udf_arg) {}
  716.   Item_func_udf_int(udf_func *udf_arg, List<Item> &list)
  717.     :Item_udf_func(udf_arg,list) {}
  718.   longlong val_int();
  719.   double val() { return (double) Item_func_udf_int::val_int(); }
  720.   String *val_str(String *str);
  721.   enum Item_result result_type () const { return INT_RESULT; }
  722.   void fix_length_and_dec() { decimals=0; max_length=21; }
  723. };
  724. class Item_func_udf_str :public Item_udf_func
  725. {
  726. public:
  727.   Item_func_udf_str(udf_func *udf_arg) :Item_udf_func(udf_arg) {}
  728.   Item_func_udf_str(udf_func *udf_arg, List<Item> &list)
  729.     :Item_udf_func(udf_arg,list) {}
  730.   String *val_str(String *);
  731.   double val()
  732.   {
  733.     int err;
  734.     String *res;
  735.     char *end_not_used;
  736.     res=val_str(&str_value);
  737.     return res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
  738.                             &end_not_used, &err) : 0.0;
  739.   }
  740.   longlong val_int()
  741.   {
  742.     int err;
  743.     String *res;  res=val_str(&str_value);
  744.     return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,(char**) 0,&err) : (longlong) 0;
  745.   }
  746.   enum Item_result result_type () const { return STRING_RESULT; }
  747.   void fix_length_and_dec();
  748. };
  749. #else /* Dummy functions to get sql_yacc.cc compiled */
  750. class Item_func_udf_float :public Item_real_func
  751. {
  752.  public:
  753.   Item_func_udf_float(udf_func *udf_arg) :Item_real_func() {}
  754.   Item_func_udf_float(udf_func *udf_arg, List<Item> &list) :Item_real_func(list) {}
  755.   double val() { DBUG_ASSERT(fixed == 1); return 0.0; }
  756. };
  757. class Item_func_udf_int :public Item_int_func
  758. {
  759. public:
  760.   Item_func_udf_int(udf_func *udf_arg) :Item_int_func() {}
  761.   Item_func_udf_int(udf_func *udf_arg, List<Item> &list) :Item_int_func(list) {}
  762.   longlong val_int() { DBUG_ASSERT(fixed == 1); return 0; }
  763. };
  764. class Item_func_udf_str :public Item_func
  765. {
  766. public:
  767.   Item_func_udf_str(udf_func *udf_arg) :Item_func() {}
  768.   Item_func_udf_str(udf_func *udf_arg, List<Item> &list)  :Item_func(list) {}
  769.   String *val_str(String *)
  770.     { DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
  771.   double val() { DBUG_ASSERT(fixed == 1); null_value=1; return 0.0; }
  772.   longlong val_int() { DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
  773.   enum Item_result result_type () const { return STRING_RESULT; }
  774.   void fix_length_and_dec() { maybe_null=1; max_length=0; }
  775. };
  776. #endif /* HAVE_DLOPEN */
  777. /*
  778. ** User level locks
  779. */
  780. class User_level_lock;
  781. void item_user_lock_init(void);
  782. void item_user_lock_release(User_level_lock *ull);
  783. void item_user_lock_free(void);
  784. class Item_func_get_lock :public Item_int_func
  785. {
  786.   String value;
  787.  public:
  788.   Item_func_get_lock(Item *a,Item *b) :Item_int_func(a,b) {}
  789.   longlong val_int();
  790.   const char *func_name() const { return "get_lock"; }
  791.   void fix_length_and_dec() { max_length=1; maybe_null=1;}
  792. };
  793. class Item_func_release_lock :public Item_int_func
  794. {
  795.   String value;
  796.  public:
  797.   Item_func_release_lock(Item *a) :Item_int_func(a) {}
  798.   longlong val_int();
  799.   const char *func_name() const { return "release_lock"; }
  800.   void fix_length_and_dec() { max_length=1; maybe_null=1;}
  801. };
  802. /* replication functions */
  803. class Item_master_pos_wait :public Item_int_func
  804. {
  805.   String value;
  806.  public:
  807.   Item_master_pos_wait(Item *a,Item *b) :Item_int_func(a,b) {}
  808.   Item_master_pos_wait(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {}
  809.   longlong val_int();
  810.   const char *func_name() const { return "master_pos_wait"; }
  811.   void fix_length_and_dec() { max_length=21; maybe_null=1;}
  812. };
  813. /* Handling of user definiable variables */
  814. class user_var_entry;
  815. class Item_func_set_user_var :public Item_func
  816. {
  817.   enum Item_result cached_result_type;
  818.   user_var_entry *entry;
  819.   char buffer[MAX_FIELD_WIDTH];
  820.   String value;
  821.   union
  822.   {
  823.     longlong vint;
  824.     double vreal;
  825.     String *vstr;
  826.   } save_result;
  827.   String save_buff;
  828.   
  829. public:
  830.   LEX_STRING name; // keep it public
  831.   Item_func_set_user_var(LEX_STRING a,Item *b)
  832.     :Item_func(b), cached_result_type(INT_RESULT), name(a)
  833.   {}
  834.   double val();
  835.   longlong val_int();
  836.   String *val_str(String *str);
  837.   bool update_hash(void *ptr, uint length, enum Item_result type, 
  838.       CHARSET_INFO *cs, Derivation dv);
  839.   bool check();
  840.   bool update();
  841.   enum Item_result result_type () const { return cached_result_type; }
  842.   bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref);
  843.   void fix_length_and_dec();
  844.   void print(String *str);
  845.   const char *func_name() const { return "set_user_var"; }
  846. };
  847. class Item_func_get_user_var :public Item_func
  848. {
  849.   user_var_entry *var_entry;
  850. public:
  851.   LEX_STRING name; // keep it public
  852.   Item_func_get_user_var(LEX_STRING a):
  853.     Item_func(), name(a) {}
  854.   double val();
  855.   longlong val_int();
  856.   String *val_str(String* str);
  857.   void fix_length_and_dec();
  858.   void print(String *str);
  859.   enum Item_result result_type() const;
  860.   /*
  861.     We must always return variables as strings to guard against selects of type
  862.     select @t1:=1,@t1,@t:="hello",@t from foo where (@t1:= t2.b)
  863.   */
  864.   enum_field_types field_type() const  { return MYSQL_TYPE_STRING; }
  865.   enum Functype functype() const   { return VAR_VALUE_FUNC; }
  866.   const char *func_name() const { return "get_user_var"; }
  867.   bool const_item() const;
  868.   table_map used_tables() const
  869.   { return const_item() ? 0 : RAND_TABLE_BIT; }
  870.   bool eq(const Item *item, bool binary_cmp) const;
  871. };
  872. /* A system variable */
  873. class Item_func_get_system_var :public Item_func
  874. {
  875.   sys_var *var;
  876.   enum_var_type var_type;
  877.   LEX_STRING component;
  878. public:
  879.   Item_func_get_system_var(sys_var *var_arg, enum_var_type var_type_arg,
  880.                            LEX_STRING *component_arg, const char *name_arg,
  881.                            size_t name_len_arg);
  882.   bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref);
  883.   /*
  884.     Stubs for pure virtual methods. Should never be called: this
  885.     item is always substituted with a constant in fix_fields().
  886.   */
  887.   double val()              { DBUG_ASSERT(0); return 0.0; }
  888.   longlong val_int()        { DBUG_ASSERT(0); return 0; }
  889.   String* val_str(String*)  { DBUG_ASSERT(0); return 0; }
  890.   void fix_length_and_dec() { DBUG_ASSERT(0); }
  891. };
  892. class Item_func_inet_aton : public Item_int_func
  893. {
  894. public:
  895.    Item_func_inet_aton(Item *a) :Item_int_func(a) {}
  896.    longlong val_int();
  897.    const char *func_name() const { return "inet_aton"; }
  898.    void fix_length_and_dec() { decimals = 0; max_length = 21; maybe_null=1;}
  899. };
  900. /* for fulltext search */
  901. #include <ft_global.h>
  902. class Item_func_match :public Item_real_func
  903. {
  904. public:
  905.   uint key, flags;
  906.   bool join_key;
  907.   DTCollation cmp_collation;
  908.   FT_INFO *ft_handler;
  909.   TABLE *table;
  910.   Item_func_match *master;   // for master-slave optimization
  911.   Item *concat;              // Item_func_concat_ws
  912.   String value;              // value of concat
  913.   String search_value;       // key_item()'s value converted to cmp_collation
  914.   Item_func_match(List<Item> &a, uint b): Item_real_func(a), key(0), flags(b),
  915.        join_key(0), ft_handler(0), table(0), master(0), concat(0) { }
  916.   void cleanup()
  917.   {
  918.     DBUG_ENTER("Item_func_match");
  919.     Item_real_func::cleanup();
  920.     if (!master && ft_handler)
  921.     {
  922.       ft_handler->please->close_search(ft_handler);
  923.       ft_handler=0;
  924.       if (join_key)
  925. table->file->ft_handler=0;
  926.       table->fulltext_searched=0;
  927.     }
  928.     if (concat)
  929.     {
  930.       delete concat;
  931.       concat= 0;
  932.     }
  933.     DBUG_VOID_RETURN;
  934.   }
  935.   enum Functype functype() const { return FT_FUNC; }
  936.   const char *func_name() const { return "match"; }
  937.   void update_used_tables() {}
  938.   table_map not_null_tables() const { return 0; }
  939.   bool fix_fields(THD *thd, struct st_table_list *tlist, Item **ref);
  940.   bool eq(const Item *, bool binary_cmp) const;
  941.   /* The following should be safe, even if we compare doubles */
  942.   longlong val_int() { DBUG_ASSERT(fixed == 1); return val()!=0.0; }
  943.   double val();
  944.   void print(String *str);
  945.   bool fix_index();
  946.   void init_search(bool no_order);
  947. };
  948. class Item_func_bit_xor : public Item_func_bit
  949. {
  950. public:
  951.   Item_func_bit_xor(Item *a, Item *b) :Item_func_bit(a, b) {}
  952.   longlong val_int();
  953.   const char *func_name() const { return "^"; }
  954. };
  955. class Item_func_is_free_lock :public Item_int_func
  956. {
  957.   String value;
  958. public:
  959.   Item_func_is_free_lock(Item *a) :Item_int_func(a) {}
  960.   longlong val_int();
  961.   const char *func_name() const { return "is_free_lock"; }
  962.   void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
  963. };
  964. class Item_func_is_used_lock :public Item_int_func
  965. {
  966.   String value;
  967. public:
  968.   Item_func_is_used_lock(Item *a) :Item_int_func(a) {}
  969.   longlong val_int();
  970.   const char *func_name() const { return "is_used_lock"; }
  971.   void fix_length_and_dec() { decimals=0; max_length=10; maybe_null=1;}
  972. };
  973. /* For type casts */
  974. enum Cast_target
  975. {
  976.   ITEM_CAST_BINARY, ITEM_CAST_SIGNED_INT, ITEM_CAST_UNSIGNED_INT,
  977.   ITEM_CAST_DATE, ITEM_CAST_TIME, ITEM_CAST_DATETIME, ITEM_CAST_CHAR
  978. };
  979. class Item_func_found_rows :public Item_int_func
  980. {
  981. public:
  982.   Item_func_found_rows() :Item_int_func() {}
  983.   longlong val_int();
  984.   const char *func_name() const { return "found_rows"; }
  985.   void fix_length_and_dec() { decimals= 0; maybe_null=0; }
  986. };