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

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. /* This file defines all numerical functions */
  14. #ifdef __GNUC__
  15. #pragma implementation // gcc: Class implementation
  16. #endif
  17. #include "mysql_priv.h"
  18. #include <m_ctype.h>
  19. #include <hash.h>
  20. #include <time.h>
  21. #include <ft_global.h>
  22. #include "slave.h" // for wait_for_master_pos
  23. /* return TRUE if item is a constant */
  24. bool
  25. eval_const_cond(COND *cond)
  26. {
  27.   return ((Item_func*) cond)->val_int() ? TRUE : FALSE;
  28. }
  29. Item_func::Item_func(List<Item> &list)
  30. {
  31.   arg_count=list.elements;
  32.   if ((args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
  33.   {
  34.     uint i=0;
  35.     List_iterator<Item> li(list);
  36.     Item *item;
  37.     while ((item=li++))
  38.     {
  39.       args[i++]= item;
  40.       with_sum_func|=item->with_sum_func;
  41.     }
  42.   }
  43.   list.empty(); // Fields are used
  44. }
  45. bool
  46. Item_func::fix_fields(THD *thd,TABLE_LIST *tables)
  47. {
  48.   Item **arg,**arg_end;
  49.   char buff[sizeof(double)]; // Max argument in function
  50.   binary=0;
  51.   used_tables_cache=0;
  52.   const_item_cache=1;
  53.   if (thd && check_stack_overrun(thd,buff))
  54.     return 0; // Fatal error if flag is set!
  55.   if (arg_count)
  56.   { // Print purify happy
  57.     for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++)
  58.     {
  59.       if ((*arg)->fix_fields(thd,tables))
  60. return 1; /* purecov: inspected */
  61.       if ((*arg)->maybe_null)
  62. maybe_null=1;
  63.       if ((*arg)->binary)
  64. binary=1;
  65.       with_sum_func= with_sum_func || (*arg)->with_sum_func;
  66.       used_tables_cache|=(*arg)->used_tables();
  67.       const_item_cache&= (*arg)->const_item();
  68.     }
  69.   }
  70.   fix_length_and_dec();
  71.   return 0;
  72. }
  73. void Item_func::split_sum_func(List<Item> &fields)
  74. {
  75.   Item **arg,**arg_end;
  76.   for (arg=args, arg_end=args+arg_count; arg != arg_end ; arg++)
  77.   {
  78.     if ((*arg)->with_sum_func && (*arg)->type() != SUM_FUNC_ITEM)
  79.       (*arg)->split_sum_func(fields);
  80.     else if ((*arg)->used_tables() || (*arg)->type() == SUM_FUNC_ITEM)
  81.     {
  82.       fields.push_front(*arg);
  83.       *arg=new Item_ref((Item**) fields.head_ref(),0,(*arg)->name);
  84.     }
  85.   }
  86. }
  87. void Item_func::update_used_tables()
  88. {
  89.   used_tables_cache=0;
  90.   const_item_cache=1;
  91.   for (uint i=0 ; i < arg_count ; i++)
  92.   {
  93.     args[i]->update_used_tables();
  94.     used_tables_cache|=args[i]->used_tables();
  95.     const_item_cache&=args[i]->const_item();
  96.   }
  97. }
  98. table_map Item_func::used_tables() const
  99. {
  100.   return used_tables_cache;
  101. }
  102. void Item_func::print(String *str)
  103. {
  104.   str->append(func_name());
  105.   str->append('(');
  106.   for (uint i=0 ; i < arg_count ; i++)
  107.   {
  108.     if (i)
  109.       str->append(',');
  110.     args[i]->print(str);
  111.   }
  112.   str->append(')');
  113. }
  114. void Item_func::print_op(String *str)
  115. {
  116.   str->append('(');
  117.   for (uint i=0 ; i < arg_count-1 ; i++)
  118.   {
  119.     args[i]->print(str);
  120.     str->append(' ');
  121.     str->append(func_name());
  122.     str->append(' ');
  123.   }
  124.   args[arg_count-1]->print(str);
  125.   str->append(')');
  126. }
  127. bool Item_func::eq(const Item *item) const
  128. {
  129.   /* Assume we don't have rtti */
  130.   if (this == item)
  131.     return 1;
  132.   if (item->type() != FUNC_ITEM)
  133.     return 0;
  134.   Item_func *item_func=(Item_func*) item;
  135.   if (arg_count != item_func->arg_count ||
  136.       func_name() != item_func->func_name())
  137.     return 0;
  138.   for (uint i=0; i < arg_count ; i++)
  139.     if (!args[i]->eq(item_func->args[i]))
  140.       return 0;
  141.   return 1;
  142. }
  143. String *Item_real_func::val_str(String *str)
  144. {
  145.   double nr=val();
  146.   if (null_value)
  147.     return 0; /* purecov: inspected */
  148.   else
  149.     str->set(nr,decimals);
  150.   return str;
  151. }
  152. String *Item_num_func::val_str(String *str)
  153. {
  154.   if (hybrid_type == INT_RESULT)
  155.   {
  156.     longlong nr=val_int();
  157.     if (null_value)
  158.       return 0; /* purecov: inspected */
  159.     else
  160.       str->set(nr);
  161.   }
  162.   else
  163.   {
  164.     double nr=val();
  165.     if (null_value)
  166.       return 0; /* purecov: inspected */
  167.     else
  168.       str->set(nr,decimals);
  169.   }
  170.   return str;
  171. }
  172. void Item_func::fix_num_length_and_dec()
  173. {
  174.   decimals=0;
  175.   for (uint i=0 ; i < arg_count ; i++)
  176.     set_if_bigger(decimals,args[i]->decimals);
  177.   max_length=float_length(decimals);
  178. }
  179. String *Item_int_func::val_str(String *str)
  180. {
  181.   longlong nr=val_int();
  182.   if (null_value)
  183.     return 0;
  184.   else
  185.     str->set(nr);
  186.   return str;
  187. }
  188. /* Change from REAL_RESULT (default) to INT_RESULT if both arguments are integers */
  189. void Item_num_op::find_num_type(void)
  190. {
  191.   if (args[0]->result_type() == INT_RESULT &&
  192.       args[1]->result_type() == INT_RESULT)
  193.     hybrid_type=INT_RESULT;
  194. }
  195. String *Item_num_op::val_str(String *str)
  196. {
  197.   if (hybrid_type == INT_RESULT)
  198.   {
  199.     longlong nr=val_int();
  200.     if (null_value)
  201.       return 0; /* purecov: inspected */
  202.     else
  203.       str->set(nr);
  204.   }
  205.   else
  206.   {
  207.     double nr=val();
  208.     if (null_value)
  209.       return 0; /* purecov: inspected */
  210.     else
  211.       str->set(nr,decimals);
  212.   }
  213.   return str;
  214. }
  215. double Item_func_plus::val()
  216. {
  217.   double value=args[0]->val()+args[1]->val();
  218.   if ((null_value=args[0]->null_value || args[1]->null_value))
  219.     return 0.0;
  220.   return value;
  221. }
  222. longlong Item_func_plus::val_int()
  223. {
  224.   longlong value=args[0]->val_int()+args[1]->val_int();
  225.   if ((null_value=args[0]->null_value || args[1]->null_value))
  226.     return 0;
  227.   return value;
  228. }
  229. double Item_func_minus::val()
  230. {
  231.   double value=args[0]->val() - args[1]->val();
  232.   if ((null_value=args[0]->null_value || args[1]->null_value))
  233.     return 0.0;
  234.   return value;
  235. }
  236. longlong Item_func_minus::val_int()
  237. {
  238.   longlong value=args[0]->val_int() - args[1]->val_int();
  239.   if ((null_value=args[0]->null_value || args[1]->null_value))
  240.     return 0;
  241.   return value;
  242. }
  243. double Item_func_mul::val()
  244. {
  245.   double value=args[0]->val()*args[1]->val();
  246.   if ((null_value=args[0]->null_value || args[1]->null_value))
  247.     return 0.0; /* purecov: inspected */
  248.   return value;
  249. }
  250. longlong Item_func_mul::val_int()
  251. {
  252.   longlong value=args[0]->val_int()*args[1]->val_int();
  253.   if ((null_value=args[0]->null_value || args[1]->null_value))
  254.     return 0; /* purecov: inspected */
  255.   return value;
  256. }
  257. double Item_func_div::val()
  258. {
  259.   double value=args[0]->val();
  260.   double val2=args[1]->val();
  261.   if ((null_value= val2 == 0.0 || args[0]->null_value || args[1]->null_value))
  262.     return 0.0;
  263.   return value/val2;
  264. }
  265. longlong Item_func_div::val_int()
  266. {
  267.   longlong value=args[0]->val_int();
  268.   longlong val2=args[1]->val_int();
  269.   if ((null_value= val2 == 0 || args[0]->null_value || args[1]->null_value))
  270.     return 0;
  271.   return value/val2;
  272. }
  273. void Item_func_div::fix_length_and_dec()
  274. {
  275.   decimals=max(args[0]->decimals,args[1]->decimals)+2;
  276.   max_length=args[0]->max_length - args[0]->decimals + decimals;
  277.   uint tmp=float_length(decimals);
  278.   set_if_smaller(max_length,tmp);
  279.   maybe_null=1;
  280. }
  281. double Item_func_mod::val()
  282. {
  283.   double value= floor(args[0]->val()+0.5);
  284.   double val2=floor(args[1]->val()+0.5);
  285.   if ((null_value=val2 == 0.0 || args[0]->null_value || args[1]->null_value))
  286.     return 0.0; /* purecov: inspected */
  287.   return fmod(value,val2);
  288. }
  289. longlong Item_func_mod::val_int()
  290. {
  291.   longlong value=  args[0]->val_int();
  292.   longlong val2= args[1]->val_int();
  293.   if ((null_value=val2 == 0 || args[0]->null_value || args[1]->null_value))
  294.     return 0; /* purecov: inspected */
  295.   return value % val2;
  296. }
  297. void Item_func_mod::fix_length_and_dec()
  298. {
  299.   max_length=args[1]->max_length;
  300.   decimals=0;
  301.   maybe_null=1;
  302.   find_num_type();
  303. }
  304. double Item_func_neg::val()
  305. {
  306.   double value=args[0]->val();
  307.   null_value=args[0]->null_value;
  308.   return -value;
  309. }
  310. longlong Item_func_neg::val_int()
  311. {
  312.   longlong value=args[0]->val_int();
  313.   null_value=args[0]->null_value;
  314.   return -value;
  315. }
  316. void Item_func_neg::fix_length_and_dec()
  317. {
  318.   decimals=args[0]->decimals;
  319.   max_length=args[0]->max_length;
  320.   hybrid_type= args[0]->result_type() == INT_RESULT ? INT_RESULT : REAL_RESULT;
  321. }
  322. double Item_func_abs::val()
  323. {
  324.   double value=args[0]->val();
  325.   null_value=args[0]->null_value;
  326.   return fabs(value);
  327. }
  328. longlong Item_func_abs::val_int()
  329. {
  330.   longlong value=args[0]->val_int();
  331.   null_value=args[0]->null_value;
  332.   return value >= 0 ? value : -value;
  333. }
  334. void Item_func_abs::fix_length_and_dec()
  335. {
  336.   decimals=args[0]->decimals;
  337.   max_length=args[0]->max_length;
  338.   hybrid_type= args[0]->result_type() == INT_RESULT ? INT_RESULT : REAL_RESULT;
  339. }
  340. double Item_func_log::val()
  341. {
  342.   double value=args[0]->val();
  343.   if ((null_value=(args[0]->null_value || value <= 0.0)))
  344.     return 0.0; /* purecov: inspected */
  345.   return log(value);
  346. }
  347. double Item_func_log10::val()
  348. {
  349.   double value=args[0]->val();
  350.   if ((null_value=(args[0]->null_value || value <= 0.0)))
  351.     return 0.0; /* purecov: inspected */
  352.   return log10(value);
  353. }
  354. double Item_func_exp::val()
  355. {
  356.   double value=args[0]->val();
  357.   if ((null_value=args[0]->null_value))
  358.     return 0.0; /* purecov: inspected */
  359.   return exp(value);
  360. }
  361. double Item_func_sqrt::val()
  362. {
  363.   double value=args[0]->val();
  364.   if ((null_value=(args[0]->null_value || value < 0)))
  365.     return 0.0; /* purecov: inspected */
  366.   return sqrt(value);
  367. }
  368. double Item_func_pow::val()
  369. {
  370.   double value=args[0]->val();
  371.   double val2=args[1]->val();
  372.   if ((null_value=(args[0]->null_value || args[1]->null_value)))
  373.     return 0.0; /* purecov: inspected */
  374.   return pow(value,val2);
  375. }
  376. // Trigonometric functions
  377. double Item_func_acos::val()
  378. {
  379.   double value=args[0]->val();
  380.   if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
  381.     return 0.0;
  382.   return fix_result(acos(value));
  383. }
  384. double Item_func_asin::val()
  385. {
  386.   double value=args[0]->val();
  387.   if ((null_value=(args[0]->null_value || (value < -1.0 || value > 1.0))))
  388.     return 0.0;
  389.   return fix_result(asin(value));
  390. }
  391. double Item_func_atan::val()
  392. {
  393.   double value=args[0]->val();
  394.   if ((null_value=args[0]->null_value))
  395.     return 0.0;
  396.   if (arg_count == 2)
  397.   {
  398.     double val2= args[1]->val();
  399.     if ((null_value=args[1]->null_value))
  400.       return 0.0;
  401.     return fix_result(atan2(value,val2));
  402.   }
  403.   return fix_result(atan(value));
  404. }
  405. double Item_func_cos::val()
  406. {
  407.   double value=args[0]->val();
  408.   if ((null_value=args[0]->null_value))
  409.     return 0.0;
  410.   return fix_result(cos(value));
  411. }
  412. double Item_func_sin::val()
  413. {
  414.   double value=args[0]->val();
  415.   if ((null_value=args[0]->null_value))
  416.     return 0.0;
  417.   return fix_result(sin(value));
  418. }
  419. double Item_func_tan::val()
  420. {
  421.   double value=args[0]->val();
  422.   if ((null_value=args[0]->null_value))
  423.     return 0.0;
  424.   return fix_result(tan(value));
  425. }
  426. // Shift-functions, same as << and >> in C/C++
  427. longlong Item_func_shift_left::val_int()
  428. {
  429.   uint shift;
  430.   ulonglong res= ((ulonglong) args[0]->val_int() <<
  431.   (shift=(uint) args[1]->val_int()));
  432.   if (args[0]->null_value || args[1]->null_value)
  433.   {
  434.     null_value=1;
  435.     return 0;
  436.   }
  437.   null_value=0;
  438.   return (shift < sizeof(longlong)*8 ? (longlong) res : LL(0));
  439. }
  440. longlong Item_func_shift_right::val_int()
  441. {
  442.   uint shift;
  443.   ulonglong res= (ulonglong) args[0]->val_int() >>
  444.     (shift=(uint) args[1]->val_int());
  445.   if (args[0]->null_value || args[1]->null_value)
  446.   {
  447.     null_value=1;
  448.     return 0;
  449.   }
  450.   null_value=0;
  451.   return (shift < sizeof(longlong)*8 ? (longlong) res : LL(0));
  452. }
  453. longlong Item_func_bit_neg::val_int()
  454. {
  455.   ulonglong res= (ulonglong) args[0]->val_int();
  456.   if ((null_value=args[0]->null_value))
  457.     return 0;
  458.   return ~res;
  459. }
  460. // Conversion functions
  461. void Item_func_integer::fix_length_and_dec()
  462. {
  463.   max_length=args[0]->max_length - args[0]->decimals+1;
  464.   uint tmp=float_length(decimals);
  465.   set_if_smaller(max_length,tmp);
  466.   decimals=0;
  467. }
  468. longlong Item_func_ceiling::val_int()
  469. {
  470.   double value=args[0]->val();
  471.   null_value=args[0]->null_value;
  472.   return (longlong) ceil(value);
  473. }
  474. longlong Item_func_floor::val_int()
  475. {
  476.   double value=args[0]->val();
  477.   null_value=args[0]->null_value;
  478.   return (longlong) floor(value);
  479. }
  480. void Item_func_round::fix_length_and_dec()
  481. {
  482.   max_length=args[0]->max_length;
  483.   decimals=args[0]->decimals;
  484.   if (args[1]->const_item())
  485.   {
  486.     int tmp=(int) args[1]->val_int();
  487.     if (tmp < 0)
  488.       decimals=0;
  489.     else
  490.       decimals=tmp;
  491.   }
  492. }
  493. double Item_func_round::val()
  494. {
  495.   double value=args[0]->val();
  496.   int dec=(int) args[1]->val_int();
  497.   uint abs_dec=abs(dec);
  498.   if ((null_value=args[0]->null_value || args[1]->null_value))
  499.     return 0.0;
  500.   double tmp=(abs_dec < array_elements(log_10) ?
  501.       log_10[abs_dec] : pow(10.0,(double) abs_dec));
  502.   if (truncate)
  503.     return dec < 0 ? floor(value/tmp)*tmp : floor(value*tmp)/tmp;
  504.   return dec < 0 ? rint(value/tmp)*tmp : rint(value*tmp)/tmp;
  505. }
  506. double Item_func_rand::val()
  507. {
  508.   if (arg_count)
  509.   { // Only use argument once in query
  510.     ulong tmp=((ulong) args[0]->val_int())+55555555L;
  511.     randominit(&current_thd->rand,tmp,tmp/2);
  512. #ifdef DELETE_ITEMS
  513.     delete args[0];
  514. #endif
  515.     arg_count=0;
  516.   }
  517.   return rnd(&current_thd->rand);
  518. }
  519. longlong Item_func_sign::val_int()
  520. {
  521.   double value=args[0]->val();
  522.   null_value=args[0]->null_value;
  523.   return value < 0.0 ? -1 : (value > 0 ? 1 : 0);
  524. }
  525. double Item_func_units::val()
  526. {
  527.   double value=args[0]->val();
  528.   if ((null_value=args[0]->null_value))
  529.     return 0;
  530.   return value*mul+add;
  531. }
  532. void Item_func_min_max::fix_length_and_dec()
  533. {
  534.   decimals=0;
  535.   max_length=0;
  536.   maybe_null=1;
  537.   binary=0;
  538.   cmp_type=args[0]->result_type();
  539.   for (uint i=0 ; i < arg_count ; i++)
  540.   {
  541.     if (max_length < args[i]->max_length)
  542.       max_length=args[i]->max_length;
  543.     if (decimals < args[i]->decimals)
  544.       decimals=args[i]->decimals;
  545.     if (!args[i]->maybe_null)
  546.       maybe_null=0;
  547.     cmp_type=item_cmp_type(cmp_type,args[i]->result_type());
  548.     if (args[i]->binary)
  549.       binary=1;
  550.   }
  551. }
  552. String *Item_func_min_max::val_str(String *str)
  553. {
  554.   switch (cmp_type) {
  555.   case INT_RESULT:
  556.   {
  557.     longlong nr=val_int();
  558.     if (null_value)
  559.       return 0;
  560.     else
  561.       str->set(nr);
  562.     return str;
  563.   }
  564.   case REAL_RESULT:
  565.   {
  566.     double nr=val();
  567.     if (null_value)
  568.       return 0; /* purecov: inspected */
  569.     else
  570.       str->set(nr,decimals);
  571.     return str;
  572.   }
  573.   case STRING_RESULT:
  574.   {
  575.     String *res;
  576.     LINT_INIT(res);
  577.     null_value=1;
  578.     for (uint i=0; i < arg_count ; i++)
  579.     {
  580.       if (null_value)
  581.       {
  582. res=args[i]->val_str(str);
  583. null_value=args[i]->null_value;
  584.       }
  585.       else
  586.       {
  587. String *res2;
  588. res2= args[i]->val_str(res == str ? &tmp_value : str);
  589. if (res2)
  590. {
  591.   int cmp=binary ? stringcmp(res,res2) : sortcmp(res,res2);
  592.   if ((cmp_sign < 0 ? cmp : -cmp) < 0)
  593.     res=res2;
  594. }
  595.       }
  596.     }
  597.     return res;
  598.   }
  599.   }
  600.   return 0; // Keep compiler happy
  601. }
  602. double Item_func_min_max::val()
  603. {
  604.   double value=0.0;
  605.   null_value=1;
  606.   for (uint i=0; i < arg_count ; i++)
  607.   {
  608.     if (null_value)
  609.     {
  610.       value=args[i]->val();
  611.       null_value=args[i]->null_value;
  612.     }
  613.     else
  614.     {
  615.       double tmp=args[i]->val();
  616.       if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
  617. value=tmp;
  618.     }
  619.   }
  620.   return value;
  621. }
  622. longlong Item_func_min_max::val_int()
  623. {
  624.   longlong value=0;
  625.   null_value=1;
  626.   for (uint i=0; i < arg_count ; i++)
  627.   {
  628.     if (null_value)
  629.     {
  630.       value=args[i]->val_int();
  631.       null_value=args[i]->null_value;
  632.     }
  633.     else
  634.     {
  635.       longlong tmp=args[i]->val_int();
  636.       if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
  637. value=tmp;
  638.     }
  639.   }
  640.   return value;
  641. }
  642. longlong Item_func_length::val_int()
  643. {
  644.   String *res=args[0]->val_str(&value);
  645.   if (!res)
  646.   {
  647.     null_value=1;
  648.     return 0; /* purecov: inspected */
  649.   }
  650.   null_value=0;
  651.   return (longlong) res->length();
  652. }
  653. longlong Item_func_char_length::val_int()
  654. {
  655.   String *res=args[0]->val_str(&value);
  656.   if (!res)
  657.   {
  658.     null_value=1;
  659.     return 0; /* purecov: inspected */
  660.   }
  661.   null_value=0;
  662.   return (longlong) (!args[0]->binary) ? res->numchars() : res->length();
  663. }
  664. longlong Item_func_locate::val_int()
  665. {
  666.   String *a=args[0]->val_str(&value1);
  667.   String *b=args[1]->val_str(&value2);
  668. #ifdef USE_MB
  669.   bool binary_str = args[0]->binary || args[1]->binary;
  670. #endif
  671.   if (!a || !b)
  672.   {
  673.     null_value=1;
  674.     return 0; /* purecov: inspected */
  675.   }
  676.   null_value=0;
  677.   uint start=0;
  678. #ifdef USE_MB
  679.   uint start0=0;
  680. #endif
  681.   if (arg_count == 3)
  682.   {
  683.     start=(uint) args[2]->val_int()-1;
  684. #ifdef USE_MB
  685.     if (use_mb(default_charset_info))
  686.     {
  687.       start0=start;
  688.       if (!binary_str)
  689.         start=a->charpos(start);
  690.     }
  691. #endif
  692.     if (start > a->length() || start+b->length() > a->length())
  693.       return 0;
  694.   }
  695.   if (!b->length()) // Found empty string at start
  696.     return (longlong) (start+1);
  697. #ifdef USE_MB
  698.   if (use_mb(default_charset_info) && !binary_str)
  699.   {
  700.     const char *ptr=a->ptr()+start;
  701.     const char *search=b->ptr();
  702.     const char *strend = ptr+a->length();
  703.     const char *end=strend-b->length()+1;
  704.     const char *search_end=search+b->length();
  705.     register  uint32 l;
  706.     while (ptr < end)
  707.     {
  708.       if (*ptr == *search)
  709.       {
  710.         register char *i,*j;
  711.         i=(char*) ptr+1; j=(char*) search+1;
  712.         while (j != search_end)
  713.           if (*i++ != *j++) goto skipp;
  714.         return (longlong) start0+1;
  715.       }
  716.   skipp:
  717.       if ((l=my_ismbchar(default_charset_info,ptr,strend))) ptr+=l;
  718.       else ++ptr;
  719.       ++start0;
  720.     }
  721.     return 0;
  722.   }
  723. #endif /* USE_MB */
  724.   return (longlong) (a->strstr(*b,start)+1) ;
  725. }
  726. longlong Item_func_field::val_int()
  727. {
  728.   String *field;
  729.   if (!(field=item->val_str(&value)))
  730.     return 0; // -1 if null ?
  731.   for (uint i=0 ; i < arg_count ; i++)
  732.   {
  733.     String *tmp_value=args[i]->val_str(&tmp);
  734.     if (tmp_value && field->length() == tmp_value->length() &&
  735. !memcmp(field->ptr(),tmp_value->ptr(),tmp_value->length()))
  736.       return (longlong) (i+1);
  737.   }
  738.   return 0;
  739. }
  740. longlong Item_func_ascii::val_int()
  741. {
  742.   String *res=args[0]->val_str(&value);
  743.   if (!res)
  744.   {
  745.     null_value=1;
  746.     return 0;
  747.   }
  748.   null_value=0;
  749.   return (longlong) (res->length() ? (uchar) (*res)[0] : (uchar) 0);
  750. }
  751. longlong Item_func_ord::val_int()
  752. {
  753.   String *res=args[0]->val_str(&value);
  754.   if (!res)
  755.   {
  756.     null_value=1;
  757.     return 0;
  758.   }
  759.   null_value=0;
  760.   if (!res->length()) return 0;
  761. #ifdef USE_MB
  762.   if (use_mb(default_charset_info) && !args[0]->binary)
  763.   {
  764.     register const char *str=res->ptr();
  765.     register uint32 n=0, l=my_ismbchar(default_charset_info,
  766.                                        str,str+res->length());
  767.     if (!l) return (longlong)((uchar) *str);
  768.     while (l--)
  769.       n=(n<<8)|(uint32)((uchar) *str++);
  770.     return (longlong) n;
  771.   }
  772. #endif
  773.   return (longlong) ((uchar) (*res)[0]);
  774. }
  775. /* Search after a string in a string of strings separated by ',' */
  776. /* Returns number of found type >= 1 or 0 if not found */
  777. /* This optimizes searching in enums to bit testing! */
  778. void Item_func_find_in_set::fix_length_and_dec()
  779. {
  780.   decimals=0;
  781.   max_length=3; // 1-999
  782.   if (args[0]->const_item() && args[1]->type() == FIELD_ITEM)
  783.   {
  784.     Field *field= ((Item_field*) args[1])->field;
  785.     if (field->real_type() == FIELD_TYPE_SET)
  786.     {
  787.       String *find=args[0]->val_str(&value);
  788.       if (find)
  789.       {
  790. enum_value=find_enum(((Field_enum*) field)->typelib,find->ptr(),
  791.      find->length());
  792. enum_bit=0;
  793. if (enum_value)
  794.   enum_bit=LL(1) << (enum_value-1);
  795.       }
  796.     }
  797.   }
  798. }
  799. static const char separator=',';
  800. longlong Item_func_find_in_set::val_int()
  801. {
  802.   if (enum_value)
  803.   {
  804.     ulonglong tmp=(ulonglong) args[1]->val_int();
  805.     if (!(null_value=args[1]->null_value || args[0]->null_value))
  806.     {
  807.       if (tmp & enum_bit)
  808. return enum_value;
  809.     }
  810.     return 0L;
  811.   }
  812.   String *find=args[0]->val_str(&value);
  813.   String *buffer=args[1]->val_str(&value2);
  814.   if (!find || !buffer)
  815.   {
  816.     null_value=1;
  817.     return 0; /* purecov: inspected */
  818.   }
  819.   null_value=0;
  820.   int diff;
  821.   if ((diff=buffer->length() - find->length()) >= 0)
  822.   {
  823.     const char *f_pos=find->ptr();
  824.     const char *f_end=f_pos+find->length();
  825.     const char *str=buffer->ptr();
  826.     const char *end=str+diff+1;
  827.     const char *real_end=str+buffer->length();
  828.     uint position=1;
  829.     do
  830.     {
  831.       const char *pos= f_pos;
  832.       while (pos != f_end)
  833.       {
  834. if (toupper(*str) != toupper(*pos))
  835.   goto not_found;
  836. str++;
  837. pos++;
  838.       }
  839.       if (str == real_end || str[0] == separator)
  840. return (longlong) position;
  841.   not_found:
  842.       while (str < end && str[0] != separator)
  843. str++;
  844.       position++;
  845.     } while (++str <= end);
  846.   }
  847.   return 0;
  848. }
  849. static char nbits[256] = {
  850.   0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
  851.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  852.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  853.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  854.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  855.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  856.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  857.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  858.   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
  859.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  860.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  861.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  862.   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  863.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  864.   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
  865.   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
  866. };
  867. uint count_bits(ulonglong v)
  868. {
  869. #if SIZEOF_LONG_LONG > 4
  870.   /* The following code is a bit faster on 16 bit machines than if we would
  871.      only shift v */
  872.   ulong v2=(ulong) (v >> 32);
  873.   return (uint) (uchar) (nbits[(uchar)  v] +
  874.                          nbits[(uchar) (v >> 8)] +
  875.                          nbits[(uchar) (v >> 16)] +
  876.                          nbits[(uchar) (v >> 24)] +
  877.                          nbits[(uchar) (v2)] +
  878.                          nbits[(uchar) (v2 >> 8)] +
  879.                          nbits[(uchar) (v2 >> 16)] +
  880.                          nbits[(uchar) (v2 >> 24)]);
  881. #else
  882.   return (uint) (uchar) (nbits[(uchar)  v] +
  883.                          nbits[(uchar) (v >> 8)] +
  884.                          nbits[(uchar) (v >> 16)] +
  885.                          nbits[(uchar) (v >> 24)]);
  886. #endif
  887. }
  888. longlong Item_func_bit_count::val_int()
  889. {
  890.   ulonglong value= (ulonglong) args[0]->val_int();
  891.   if (args[0]->null_value)
  892.   {
  893.     null_value=1; /* purecov: inspected */
  894.     return 0; /* purecov: inspected */
  895.   }
  896.   return (longlong) count_bits(value);
  897. }
  898. /****************************************************************************
  899. ** Functions to handle dynamic loadable functions
  900. ** Original source by: Alexis Mikhailov <root@medinf.chuvashia.su>
  901. ** Rewritten by monty.
  902. ****************************************************************************/
  903. #ifdef HAVE_DLOPEN
  904. udf_handler::~udf_handler()
  905. {
  906.   if (initialized)
  907.   {
  908.     if (u_d->func_deinit != NULL)
  909.     {
  910.       void (*deinit)(UDF_INIT *) = (void (*)(UDF_INIT*))
  911. u_d->func_deinit;
  912.       (*deinit)(&initid);
  913.     }
  914.     free_udf(u_d);
  915.   }
  916.   delete [] buffers;
  917. }
  918. bool
  919. udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func,
  920. uint arg_count, Item **arguments)
  921. {
  922.   char buff[sizeof(double)]; // Max argument in function
  923.   DBUG_ENTER("Item_udf_func::fix_fields");
  924.   if (thd)
  925.   {
  926.     if (check_stack_overrun(thd,buff))
  927.       return 0; // Fatal error flag is set!
  928.   }
  929.   else
  930.     thd=current_thd; // In WHERE / const clause
  931.   udf_func *tmp_udf=find_udf(u_d->name,(uint) strlen(u_d->name),1);
  932.   if (!tmp_udf)
  933.   {
  934.     my_printf_error(ER_CANT_FIND_UDF,ER(ER_CANT_FIND_UDF),MYF(0),u_d->name,
  935.     errno);
  936.     DBUG_RETURN(1);
  937.   }
  938.   u_d=tmp_udf;
  939.   args=arguments;
  940.   /* Fix all arguments */
  941.   func->binary=func->maybe_null=0;
  942.   used_tables_cache=0;
  943.   const_item_cache=1;
  944.   if ((f_args.arg_count=arg_count))
  945.   {
  946.     if (!(f_args.arg_type= (Item_result*)
  947.   sql_alloc(f_args.arg_count*sizeof(Item_result))))
  948.     {
  949.       free_udf(u_d);
  950.       DBUG_RETURN(1);
  951.     }
  952.     uint i;
  953.     Item **arg,**arg_end;
  954.     for (i=0, arg=arguments, arg_end=arguments+arg_count;
  955.  arg != arg_end ;
  956.  arg++,i++)
  957.     {
  958.       if ((*arg)->fix_fields(thd,tables))
  959. return 1;
  960.       if ((*arg)->binary)
  961. func->binary=1;
  962.       if ((*arg)->maybe_null)
  963. func->maybe_null=1;
  964.       func->with_sum_func= func->with_sum_func || (*arg)->with_sum_func;
  965.       used_tables_cache|=(*arg)->used_tables();
  966.       const_item_cache&=(*arg)->const_item();
  967.       f_args.arg_type[i]=(*arg)->result_type();
  968.     }
  969.     if (!(buffers=new String[arg_count]) ||
  970. !(f_args.args= (char**) sql_alloc(arg_count * sizeof(char *))) ||
  971. !(f_args.lengths=(ulong*) sql_alloc(arg_count * sizeof(long))) ||
  972. !(f_args.maybe_null=(char*) sql_alloc(arg_count * sizeof(char))) ||
  973. !(num_buffer= (char*) sql_alloc(ALIGN_SIZE(sizeof(double))*arg_count)))
  974.     {
  975.       free_udf(u_d);
  976.       DBUG_RETURN(1);
  977.     }
  978.   }
  979.   func->fix_length_and_dec();
  980.   initid.max_length=func->max_length;
  981.   initid.maybe_null=func->maybe_null;
  982.   initid.const_item=const_item_cache;
  983.   initid.decimals=func->decimals;
  984.   initid.ptr=0;
  985.   if (u_d->func_init)
  986.   {
  987.     char *to=num_buffer;
  988.     for (uint i=0; i < arg_count; i++)
  989.     {
  990.       f_args.args[i]=0;
  991.       f_args.lengths[i]=arguments[i]->max_length;
  992.       f_args.maybe_null[i]=(char) arguments[i]->maybe_null;
  993.       switch(arguments[i]->type()) {
  994.       case Item::STRING_ITEM: // Constant string !
  995.       {
  996. String *res=arguments[i]->val_str((String *) 0);
  997. if (arguments[i]->null_value)
  998.   continue;
  999. f_args.args[i]=    (char*) res->ptr();
  1000. break;
  1001.       }
  1002.       case Item::INT_ITEM:
  1003. *((longlong*) to) = arguments[i]->val_int();
  1004. if (!arguments[i]->null_value)
  1005. {
  1006.   f_args.args[i]=to;
  1007.   to+= ALIGN_SIZE(sizeof(longlong));
  1008. }
  1009. break;
  1010.       case Item::REAL_ITEM:
  1011. *((double*) to) = arguments[i]->val();
  1012. if (!arguments[i]->null_value)
  1013. {
  1014.   f_args.args[i]=to;
  1015.   to+= ALIGN_SIZE(sizeof(double));
  1016. }
  1017. break;
  1018.       default: // Skip these
  1019. break;
  1020.       }
  1021.     }
  1022.     thd->net.last_error[0]=0;
  1023.     my_bool (*init)(UDF_INIT *, UDF_ARGS *, char *)=
  1024.       (my_bool (*)(UDF_INIT *, UDF_ARGS *,  char *))
  1025.       u_d->func_init;
  1026.     if ((error=(uchar) init(&initid, &f_args, thd->net.last_error)))
  1027.     {
  1028.       my_printf_error(ER_CANT_INITIALIZE_UDF,ER(ER_CANT_INITIALIZE_UDF),MYF(0),
  1029.       u_d->name,thd->net.last_error);
  1030.       free_udf(u_d);
  1031.       DBUG_RETURN(1);
  1032.     }
  1033.     func->max_length=min(initid.max_length,MAX_BLOB_WIDTH);
  1034.     func->maybe_null=initid.maybe_null;
  1035.     const_item_cache=initid.const_item;
  1036.     func->decimals=min(initid.decimals,31);
  1037.   }
  1038.   initialized=1;
  1039.   if (error)
  1040.   {
  1041.     my_printf_error(ER_CANT_INITIALIZE_UDF,ER(ER_CANT_INITIALIZE_UDF),MYF(0),
  1042.     u_d->name, ER(ER_UNKNOWN_ERROR));
  1043.     DBUG_RETURN(1);
  1044.   }
  1045.   DBUG_RETURN(0);
  1046. }
  1047. bool udf_handler::get_arguments()
  1048. {
  1049.   if (error)
  1050.     return 1; // Got an error earlier
  1051.   char *to= num_buffer;
  1052.   uint str_count=0;
  1053.   for (uint i=0; i < f_args.arg_count; i++)
  1054.   {
  1055.     f_args.args[i]=0;
  1056.     switch (f_args.arg_type[i]) {
  1057.     case STRING_RESULT:
  1058.       {
  1059. String *res=args[i]->val_str(&buffers[str_count++]);
  1060. if (!(args[i]->null_value))
  1061. {
  1062.   f_args.args[i]=    (char*) res->ptr();
  1063.   f_args.lengths[i]= res->length();
  1064.   break;
  1065. }
  1066.       }
  1067.     case INT_RESULT:
  1068.       *((longlong*) to) = args[i]->val_int();
  1069.       if (!args[i]->null_value)
  1070.       {
  1071. f_args.args[i]=to;
  1072. to+= ALIGN_SIZE(sizeof(longlong));
  1073.       }
  1074.       break;
  1075.     case REAL_RESULT:
  1076.       *((double*) to) = args[i]->val();
  1077.       if (!args[i]->null_value)
  1078.       {
  1079. f_args.args[i]=to;
  1080. to+= ALIGN_SIZE(sizeof(double));
  1081.       }
  1082.       break;
  1083.     }
  1084.   }
  1085.   return 0;
  1086. }
  1087. /* This returns (String*) 0 in case of NULL values */
  1088. String *udf_handler::val_str(String *str,String *save_str)
  1089. {
  1090.   uchar is_null=0;
  1091.   ulong res_length;
  1092.   if (get_arguments())
  1093.     return 0;
  1094.   char * (*func)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *)=
  1095.     (char* (*)(UDF_INIT *, UDF_ARGS *, char *, ulong *, uchar *, uchar *))
  1096.     u_d->func;
  1097.   if ((res_length=str->alloced_length()) < MAX_FIELD_WIDTH)
  1098.   { // This happens VERY seldom
  1099.     if (str->alloc(MAX_FIELD_WIDTH))
  1100.     {
  1101.       error=1;
  1102.       return 0;
  1103.     }
  1104.   }
  1105.   char *res=func(&initid, &f_args, (char*) str->ptr(), &res_length, &is_null,
  1106. &error);
  1107.   if (is_null || !res || error) // The !res is for safety
  1108.   {
  1109.     return 0;
  1110.   }
  1111.   if (res == str->ptr())
  1112.   {
  1113.     str->length(res_length);
  1114.     return str;
  1115.   }
  1116.   save_str->set(res, res_length);
  1117.   return save_str;
  1118. }
  1119. double Item_func_udf_float::val()
  1120. {
  1121.   DBUG_ENTER("Item_func_udf_float::val");
  1122.   DBUG_PRINT("info",("result_type: %d  arg_count: %d",
  1123.      args[0]->result_type(), arg_count));
  1124.   DBUG_RETURN(udf.val(&null_value));
  1125. }
  1126. String *Item_func_udf_float::val_str(String *str)
  1127. {
  1128.   double nr=val();
  1129.   if (null_value)
  1130.     return 0; /* purecov: inspected */
  1131.   else
  1132.     str->set(nr,decimals);
  1133.   return str;
  1134. }
  1135. longlong Item_func_udf_int::val_int()
  1136. {
  1137.   DBUG_ENTER("Item_func_udf_int::val_int");
  1138.   DBUG_PRINT("info",("result_type: %d  arg_count: %d",
  1139.      args[0]->result_type(), arg_count));
  1140.   DBUG_RETURN(udf.val_int(&null_value));
  1141. }
  1142. String *Item_func_udf_int::val_str(String *str)
  1143. {
  1144.   longlong nr=val_int();
  1145.   if (null_value)
  1146.     return 0;
  1147.   else
  1148.     str->set(nr);
  1149.   return str;
  1150. }
  1151. /* Default max_length is max argument length */
  1152. void Item_func_udf_str::fix_length_and_dec()
  1153. {
  1154.   DBUG_ENTER("Item_func_udf_str::fix_length_and_dec");
  1155.   max_length=0;
  1156.   for (uint i = 0; i < arg_count; i++)
  1157.     set_if_bigger(max_length,args[i]->max_length);
  1158.   DBUG_VOID_RETURN;
  1159. }
  1160. String *Item_func_udf_str::val_str(String *str)
  1161. {
  1162.   String *res=udf.val_str(str,&str_value);
  1163.   null_value = !res;
  1164.   return res;
  1165. }
  1166. #else
  1167. bool udf_handler::get_arguments() { return 0; }
  1168. #endif /* HAVE_DLOPEN */
  1169. /*
  1170. ** User level locks
  1171. */
  1172. pthread_mutex_t LOCK_user_locks;
  1173. static HASH hash_user_locks;
  1174. class ULL
  1175. {
  1176.   char *key;
  1177.   uint key_length;
  1178. public:
  1179.   int count;
  1180.   bool locked;
  1181.   pthread_cond_t cond;
  1182.   pthread_t thread;
  1183.   ULL(const char *key_arg,uint length) :key_length(length),count(1),locked(1)
  1184.   {
  1185.     key=(char*) my_memdup((byte*) key_arg,length,MYF(0));
  1186.     pthread_cond_init(&cond,NULL);
  1187.     if (key)
  1188.     {
  1189.       if (hash_insert(&hash_user_locks,(byte*) this))
  1190.       {
  1191. my_free((gptr) key,MYF(0));
  1192. key=0;
  1193.       }
  1194.     }
  1195.   }
  1196.   ~ULL()
  1197.   {
  1198.     if (key)
  1199.     {
  1200.       hash_delete(&hash_user_locks,(byte*) this);
  1201.       my_free((gptr) key,MYF(0));
  1202.     }
  1203.     pthread_cond_destroy(&cond);
  1204.   }
  1205.   inline bool initialized() { return key != 0; }
  1206.   friend void item_user_lock_release(ULL *ull);
  1207.   friend char *ull_get_key(const ULL *ull,uint *length,my_bool not_used);
  1208. };
  1209. char *ull_get_key(const ULL *ull,uint *length,
  1210.   my_bool not_used __attribute__((unused)))
  1211. {
  1212.   *length=(uint) ull->key_length;
  1213.   return (char*) ull->key;
  1214. }
  1215. void item_user_lock_init(void)
  1216. {
  1217.   pthread_mutex_init(&LOCK_user_locks,NULL);
  1218.   hash_init(&hash_user_locks,16,0,0,(hash_get_key) ull_get_key,NULL,0);
  1219. }
  1220. void item_user_lock_free(void)
  1221. {
  1222.   hash_free(&hash_user_locks);
  1223. }
  1224. void item_user_lock_release(ULL *ull)
  1225. {
  1226.   ull->locked=0;
  1227.   if (--ull->count)
  1228.     pthread_cond_signal(&ull->cond);
  1229.   else
  1230.     delete ull;
  1231. }
  1232. /*
  1233.    Wait until we are at or past the given position in the master binlog
  1234.    on the slave
  1235.  */
  1236. longlong Item_master_pos_wait::val_int()
  1237. {
  1238.   THD* thd = current_thd;
  1239.   String *log_name = args[0]->val_str(&value);
  1240.   int event_count;
  1241.   
  1242.   null_value=0;
  1243.   if (thd->slave_thread || !log_name || !log_name->length())
  1244.   {
  1245.     null_value = 1;
  1246.     return 0;
  1247.   }
  1248.   ulong pos = (ulong)args[1]->val_int();
  1249.   if ((event_count = glob_mi.wait_for_pos(thd, log_name, pos)) == -1)
  1250.   {
  1251.     null_value = 1;
  1252.     event_count=0;
  1253.   }
  1254.   return event_count;
  1255. }
  1256. /*
  1257.   Get a user level lock. If the thread has an old lock this is first released.
  1258.   Returns 1:  Got lock
  1259.   Returns 0:  Timeout
  1260.   Returns NULL: Error
  1261. */
  1262. longlong Item_func_get_lock::val_int()
  1263. {
  1264.   String *res=args[0]->val_str(&value);
  1265.   longlong timeout=args[1]->val_int();
  1266.   struct timespec abstime;
  1267.   THD *thd=current_thd;
  1268.   ULL *ull;
  1269.   int error;
  1270.   pthread_mutex_lock(&LOCK_user_locks);
  1271.   if (!res || !res->length())
  1272.   {
  1273.     pthread_mutex_unlock(&LOCK_user_locks);
  1274.     null_value=1;
  1275.     return 0;
  1276.   }
  1277.   null_value=0;
  1278.   if (thd->ull)
  1279.   {
  1280.     item_user_lock_release(thd->ull);
  1281.     thd->ull=0;
  1282.   }
  1283.   if (!(ull= ((ULL*) hash_search(&hash_user_locks,(byte*) res->ptr(),
  1284.  res->length()))))
  1285.   {
  1286.     ull=new ULL(res->ptr(),res->length());
  1287.     if (!ull || !ull->initialized())
  1288.     {
  1289.       delete ull;
  1290.       pthread_mutex_unlock(&LOCK_user_locks);
  1291.       null_value=1; // Probably out of memory
  1292.       return 0;
  1293.     }
  1294.     ull->thread=thd->real_id;
  1295.     thd->ull=ull;
  1296.     pthread_mutex_unlock(&LOCK_user_locks);
  1297.     return 1; // Got new lock
  1298.   }
  1299.   ull->count++;
  1300.   /* structure is now initialized.  Try to get the lock */
  1301.   /* Set up control struct to allow others to abort locks */
  1302.   pthread_mutex_lock(&thd->mysys_var->mutex);
  1303.   thd->proc_info="User lock";
  1304.   thd->mysys_var->current_mutex= &LOCK_user_locks;
  1305.   thd->mysys_var->current_cond=  &ull->cond;
  1306.   pthread_mutex_unlock(&thd->mysys_var->mutex);
  1307.   abstime.tv_sec=time((time_t*) 0)+(time_t) timeout;
  1308.   abstime.tv_nsec=0;
  1309.   while ((error=pthread_cond_timedwait(&ull->cond,&LOCK_user_locks,&abstime))
  1310.  != ETIME && error != ETIMEDOUT && ull->locked)
  1311.   {
  1312.     if (thd->killed || abort_loop)
  1313.     {
  1314.       error=EINTR; // Return NULL
  1315.       break;
  1316.     }
  1317.   }
  1318.   if (ull->locked)
  1319.   {
  1320.     if (!--ull->count)
  1321.       delete ull; // Should never happen
  1322.     if (error != ETIME && error != ETIMEDOUT)
  1323.     {
  1324.       error=1;
  1325.       null_value=1; // Return NULL
  1326.     }
  1327.   }
  1328.   else
  1329.   {
  1330.     ull->locked=1;
  1331.     ull->thread=thd->real_id;
  1332.     thd->ull=ull;
  1333.     error=0;
  1334.   }
  1335.   pthread_mutex_unlock(&LOCK_user_locks);
  1336.   pthread_mutex_lock(&thd->mysys_var->mutex);
  1337.   thd->proc_info=0;
  1338.   thd->mysys_var->current_mutex= 0;
  1339.   thd->mysys_var->current_cond=  0;
  1340.   pthread_mutex_unlock(&thd->mysys_var->mutex);
  1341.   return !error ? 1 : 0;
  1342. }
  1343. /*
  1344. ** Release a user level lock.
  1345. ** Returns 1 if lock released
  1346. ** 0 if lock wasn't held
  1347. ** NULL if no such lock
  1348. */
  1349. longlong Item_func_release_lock::val_int()
  1350. {
  1351.   String *res=args[0]->val_str(&value);
  1352.   ULL *ull;
  1353.   longlong result;
  1354.   if (!res || !res->length())
  1355.   {
  1356.     null_value=1;
  1357.     return 0;
  1358.   }
  1359.   null_value=0;
  1360.   result=0;
  1361.   pthread_mutex_lock(&LOCK_user_locks);
  1362.   if (!(ull= ((ULL*) hash_search(&hash_user_locks,(const byte*) res->ptr(),
  1363.  res->length()))))
  1364.   {
  1365.     null_value=1;
  1366.   }
  1367.   else
  1368.   {
  1369.     if (ull->locked && pthread_equal(pthread_self(),ull->thread))
  1370.     {
  1371.       result=1; // Release is ok
  1372.       item_user_lock_release(ull);
  1373.       current_thd->ull=0;
  1374.     }
  1375.   }
  1376.   pthread_mutex_unlock(&LOCK_user_locks);
  1377.   return result;
  1378. }
  1379. longlong Item_func_set_last_insert_id::val_int()
  1380. {
  1381.   longlong value=args[0]->val_int();
  1382.   current_thd->insert_id(value);
  1383.   null_value=args[0]->null_value;
  1384.   return value;
  1385. }
  1386. /* This function is just used to test speed of different functions */
  1387. longlong Item_func_benchmark::val_int()
  1388. {
  1389.   char buff[MAX_FIELD_WIDTH];
  1390.   String tmp(buff,sizeof(buff));
  1391.   THD *thd=current_thd;
  1392.   for (ulong loop=0 ; loop < loop_count && !thd->killed; loop++)
  1393.   {
  1394.     switch (args[0]->result_type()) {
  1395.     case REAL_RESULT:
  1396.       (void) args[0]->val();
  1397.       break;
  1398.     case INT_RESULT:
  1399.       (void) args[0]->val_int();
  1400.       break;
  1401.     case STRING_RESULT:
  1402.       (void) args[0]->val_str(&tmp);
  1403.       break;
  1404.     }
  1405.   }
  1406.   return 0;
  1407. }
  1408. #define extra_size sizeof(double)
  1409. static user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
  1410.     bool create_if_not_exists)
  1411. {
  1412.   user_var_entry *entry;
  1413.   if (!(entry = (user_var_entry*) hash_search(hash, (byte*) name.str,
  1414.       name.length)) &&
  1415.       create_if_not_exists)
  1416.   {
  1417.     uint size=ALIGN_SIZE(sizeof(user_var_entry))+name.length+1+extra_size;
  1418.     if (!hash_inited(hash))
  1419.       return 0;
  1420.     if (!(entry = (user_var_entry*) my_malloc(size,MYF(MY_WME))))
  1421.       return 0;
  1422.     entry->name.str=(char*) entry+ ALIGN_SIZE(sizeof(user_var_entry))+
  1423.       extra_size;
  1424.     entry->name.length=name.length;
  1425.     entry->value=0;
  1426.     entry->length=0;
  1427.     entry->update_query_id=0;
  1428.     entry->type=STRING_RESULT;
  1429.     memcpy(entry->name.str, name.str, name.length+1);
  1430.     if (hash_insert(hash,(byte*) entry))
  1431.     {
  1432.       my_free((char*) entry,MYF(0));
  1433.       return 0;
  1434.     }
  1435.   }
  1436.   return entry;
  1437. }
  1438. bool Item_func_set_user_var::fix_fields(THD *thd,TABLE_LIST *tables)
  1439. {
  1440.   if (!thd)
  1441.     thd=current_thd;
  1442.   if (Item_func::fix_fields(thd,tables) ||
  1443.       !(entry= get_variable(&thd->user_vars, name, 1)))
  1444.     return 1;
  1445.   entry->update_query_id=thd->query_id;
  1446.   return 0;
  1447. }
  1448. void
  1449. Item_func_set_user_var::fix_length_and_dec()
  1450. {
  1451.   maybe_null=args[0]->maybe_null;
  1452.   max_length=args[0]->max_length;
  1453.   decimals=args[0]->decimals;
  1454.   cached_result_type=args[0]->result_type();
  1455. }
  1456. void Item_func_set_user_var::update_hash(void *ptr, uint length,
  1457.  Item_result type)
  1458. {
  1459.   if ((null_value=args[0]->null_value))
  1460.   {
  1461.     char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
  1462.     if (entry->value && entry->value != pos)
  1463.       my_free(entry->value,MYF(0));
  1464.     entry->value=0;
  1465.     entry->length=0;
  1466.   }
  1467.   else
  1468.   {
  1469.     if (length <= extra_size)
  1470.     {
  1471.       /* Save value in value struct */
  1472.       char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
  1473.       if (entry->value != pos)
  1474.       {
  1475. if (entry->value)
  1476.   my_free(entry->value,MYF(0));
  1477. entry->value=pos;
  1478.       }
  1479.     }
  1480.     else
  1481.     {
  1482.       /* Allocate variable */
  1483.       if (entry->length != length)
  1484.       {
  1485. char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
  1486. if (entry->value == pos)
  1487.   entry->value=0;
  1488. if (!(entry->value=(char*) my_realloc(entry->value, length,
  1489.       MYF(MY_ALLOW_ZERO_PTR))))
  1490.   goto err;
  1491.       }
  1492.     }
  1493.     memcpy(entry->value,ptr,length);
  1494.     entry->length= length;
  1495.     entry->type=type;
  1496.   }
  1497.   return;
  1498.  err:
  1499.   current_thd->fatal_error=1; // Probably end of memory
  1500.   null_value=1;
  1501.   return;
  1502. }
  1503. bool
  1504. Item_func_set_user_var::update()
  1505. {
  1506.   switch (cached_result_type) {
  1507.   case REAL_RESULT:
  1508.     (void) val();
  1509.     break;
  1510.   case INT_RESULT:
  1511.     (void) val_int();
  1512.     break;
  1513.   case STRING_RESULT:
  1514.     char buffer[MAX_FIELD_WIDTH];
  1515.     String tmp(buffer,sizeof(buffer));
  1516.     (void) val_str(&tmp);
  1517.     break;
  1518.   }
  1519.   return current_thd->fatal_error;
  1520. }
  1521. double
  1522. Item_func_set_user_var::val()
  1523. {
  1524.   double value=args[0]->val();
  1525.   update_hash((void*) &value,sizeof(value), REAL_RESULT);
  1526.   return value;
  1527. }
  1528. longlong
  1529. Item_func_set_user_var::val_int()
  1530. {
  1531.   longlong value=args[0]->val_int();
  1532.   update_hash((void*) &value,sizeof(longlong),INT_RESULT);
  1533.   return value;
  1534. }
  1535. String *
  1536. Item_func_set_user_var::val_str(String *str)
  1537. {
  1538.   String *res=args[0]->val_str(str);
  1539.   if (!res) // Null value
  1540.     update_hash((void*) 0,0,STRING_RESULT);
  1541.   else
  1542.     update_hash(res->c_ptr(),res->length()+1,STRING_RESULT);
  1543.   return res;
  1544. }
  1545. user_var_entry *Item_func_get_user_var::get_entry()
  1546. {
  1547.   if (!entry  || ! entry->value)
  1548.   {
  1549.     null_value=1;
  1550.     return 0;
  1551.   }
  1552.   null_value=0;
  1553.   return entry;
  1554. }
  1555. String *
  1556. Item_func_get_user_var::val_str(String *str)
  1557. {
  1558.   user_var_entry *entry=get_entry();
  1559.   if (!entry)
  1560.     return NULL;
  1561.   switch (entry->type) {
  1562.   case REAL_RESULT:
  1563.     str->set(*(double*) entry->value);
  1564.     break;
  1565.   case INT_RESULT:
  1566.     str->set(*(longlong*) entry->value);
  1567.     break;
  1568.   case STRING_RESULT:
  1569.     if (str->copy(entry->value, entry->length-1))
  1570.     {
  1571.       null_value=1;
  1572.       return NULL;
  1573.     }
  1574.     break;
  1575.   }
  1576.   return str;
  1577. }
  1578. double Item_func_get_user_var::val()
  1579. {
  1580.   user_var_entry *entry=get_entry();
  1581.   if (!entry)
  1582.     return 0.0;
  1583.   switch (entry->type) {
  1584.   case REAL_RESULT:
  1585.     return *(double*) entry->value;
  1586.   case INT_RESULT:
  1587.     return (double) *(longlong*) entry->value;
  1588.   case STRING_RESULT:
  1589.     return atof(entry->value); // This is null terminated
  1590.   }
  1591.   return 0.0; // Impossible
  1592. }
  1593. longlong Item_func_get_user_var::val_int()
  1594. {
  1595.   user_var_entry *entry=get_entry();
  1596.   if (!entry)
  1597.     return LL(0);
  1598.   switch (entry->type) {
  1599.   case REAL_RESULT:
  1600.     return (longlong) *(double*) entry->value;
  1601.   case INT_RESULT:
  1602.     return *(longlong*) entry->value;
  1603.   case STRING_RESULT:
  1604.     return strtoull(entry->value,NULL,10); // String is null terminated
  1605.   }
  1606.   return LL(0); // Impossible
  1607. }
  1608. void Item_func_get_user_var::fix_length_and_dec()
  1609. {
  1610.   THD *thd=current_thd;
  1611.   maybe_null=1;
  1612.   decimals=NOT_FIXED_DEC;
  1613.   max_length=MAX_BLOB_WIDTH;
  1614.   if ((entry= get_variable(&thd->user_vars, name, 0)))
  1615.     const_var_flag= thd->query_id != entry->update_query_id;
  1616. }
  1617. enum Item_result Item_func_get_user_var::result_type() const
  1618. {
  1619.   user_var_entry *entry;
  1620.   if (!(entry = (user_var_entry*) hash_search(&current_thd->user_vars,
  1621.       (byte*) name.str,
  1622.       name.length)))
  1623.     return STRING_RESULT;
  1624.   return entry->type;
  1625. }
  1626. longlong Item_func_inet_aton::val_int()
  1627. {
  1628.   uint byte_result = 0;
  1629.   ulonglong result = 0; // We are ready for 64 bit addresses
  1630.   const char *p,* end;
  1631.   char c = '.'; // we mark c to indicate invalid IP in case length is 0
  1632.   char buff[36];
  1633.   String *s,tmp(buff,sizeof(buff));
  1634.   if (!(s = args[0]->val_str(&tmp))) // If null value
  1635.     goto err;
  1636.   null_value=0;
  1637.   end= (p = s->ptr()) + s->length();
  1638.   while (p < end)
  1639.   {
  1640.     c = *p++;
  1641.     int digit = (int) (c - '0'); // Assume ascii
  1642.     if (digit >= 0 && digit <= 9)
  1643.     {
  1644.       if ((byte_result = byte_result * 10 + digit) > 255)
  1645. goto err; // Wrong address
  1646.     }
  1647.     else if (c == '.')
  1648.     {
  1649.       result= (result << 8) + (ulonglong) byte_result;
  1650.       byte_result = 0;
  1651.     }
  1652.     else
  1653.       goto err; // Invalid character
  1654.   }
  1655.   if (c != '.') // IP number can't end on '.'
  1656.     return (result << 8) + (ulonglong) byte_result;
  1657. err:
  1658.   null_value=1;
  1659.   return 0;
  1660. }
  1661. double Item_func_match::val()
  1662. {
  1663.   if (ft_handler==NULL)
  1664.     init_search(1);
  1665.   if ((null_value= (ft_handler==NULL)))
  1666.     return 0.0;
  1667.   if (join_key)
  1668.   {
  1669.     if (table->file->ft_handler)
  1670.       return ft_get_relevance(ft_handler);
  1671.     join_key=0; // Magic here ! See ha_myisam::ft_read()
  1672.   }
  1673.   /* we'll have to find ft_relevance manually in ft_handler array */
  1674.   int a,b,c;
  1675.   FT_DOC  *docs=ft_handler->doc;
  1676.   my_off_t docid=table->file->row_position();
  1677.   if ((null_value=(docid==HA_OFFSET_ERROR)))
  1678.     return 0.0;
  1679.   // Assuming docs[] is sorted by dpos...
  1680.   for (a=0, b=ft_handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2)
  1681.   {
  1682.     if (docs[c].dpos > docid)
  1683.       b=c;
  1684.     else
  1685.       a=c;
  1686.   }
  1687.   if (docs[a].dpos == docid)
  1688.     return docs[a].weight;
  1689.   else
  1690.     return 0.0;
  1691. }
  1692. void Item_func_match::init_search(bool no_order)
  1693. {
  1694.   if (ft_handler)
  1695.     return;
  1696.   if (master)
  1697.   {
  1698.     join_key=master->join_key=join_key|master->join_key;
  1699.     master->init_search(no_order);
  1700.     ft_handler=master->ft_handler;
  1701.     join_key=master->join_key;
  1702.     return;
  1703.   }
  1704.   String *ft_tmp=0;
  1705.   char tmp1[FT_QUERY_MAXLEN];
  1706.   String tmp2(tmp1,sizeof(tmp1));
  1707.   // MATCH ... AGAINST (NULL) is meaningless, but possible 
  1708.   if (!(ft_tmp=key_item()->val_str(&tmp2)))
  1709.   {
  1710.     ft_tmp=&tmp2;
  1711.     tmp2.set("",0);
  1712.   }
  1713.   ft_handler=(FT_DOCLIST *)
  1714.      table->file->ft_init_ext(key, (byte*) ft_tmp->ptr(), ft_tmp->length(),
  1715.                               join_key && !no_order);
  1716.   if (join_key)
  1717.   {
  1718.     table->file->ft_handler=ft_handler;
  1719.     return;
  1720.   }
  1721. }
  1722. bool Item_func_match::fix_fields(THD *thd,struct st_table_list *tlist)
  1723. {
  1724.   List_iterator<Item> li(fields);
  1725.   Item *item;
  1726.   /* Why testing for const_item ? Monty */
  1727.   /* I'll remove it later, but this should include modifications to
  1728.      find_best and auto_close as complement to auto_init code above. SerG */
  1729.   /* I'd rather say now that const_item is assumed in quite a bit of
  1730.      places, so it would be difficult to remove. SerG */
  1731.   if (Item_func::fix_fields(thd,tlist) || !const_item())
  1732.     return 1;
  1733.   while ((item=li++))
  1734.   {
  1735.     if (item->type() != Item::FIELD_ITEM || item->fix_fields(thd,tlist) ||
  1736. !item->used_tables())
  1737.       return 1;
  1738.     used_tables_cache|=item->used_tables();
  1739.   }
  1740.   /* check that all columns comes from the same table */
  1741.   if (count_bits(used_tables_cache) != 1)
  1742.     return 1;
  1743.   const_item_cache=0;
  1744.   table=((Item_field *)fields.head())->field->table;
  1745.   return 0;
  1746. }
  1747. bool Item_func_match::fix_index()
  1748. {
  1749.   List_iterator<Item> li(fields);
  1750.   Item_field *item;
  1751.   uint ft_to_key[MAX_KEY], ft_cnt[MAX_KEY], fts=0, key;
  1752.   for (key=0 ; key<table->keys ; key++)
  1753.   {
  1754.     if ((table->key_info[key].flags & HA_FULLTEXT) &&
  1755.         (table->keys_in_use_for_query & (((key_map)1) << key)))
  1756.     {
  1757.       ft_to_key[fts]=key;
  1758.       ft_cnt[fts]=0;
  1759.       fts++;
  1760.     }
  1761.   }
  1762.   if (!fts)
  1763.   {
  1764.     my_printf_error(ER_FT_MATCHING_KEY_NOT_FOUND,
  1765.                  ER(ER_FT_MATCHING_KEY_NOT_FOUND),MYF(0));
  1766.     return 1;
  1767.   }
  1768.   while ((item=(Item_field*)(li++)))
  1769.   {
  1770.     for (key=0 ; key<fts ; key++)
  1771.     {
  1772.       KEY *ft_key=&table->key_info[ft_to_key[key]];
  1773.       uint key_parts=ft_key->key_parts;
  1774.       for (uint part=0 ; part < key_parts ; part++)
  1775.       {
  1776. if (item->field->eq(ft_key->key_part[part].field))
  1777.   ft_cnt[key]++;
  1778.       }
  1779.     }
  1780.   }
  1781.   uint max_cnt=0, mkeys=0;
  1782.   for (key=0 ; key<fts ; key++)
  1783.   {
  1784.     if (ft_cnt[key] > max_cnt)
  1785.     {
  1786.       mkeys=0;
  1787.       max_cnt=ft_cnt[mkeys]=ft_cnt[key];
  1788.       ft_to_key[mkeys]=ft_to_key[key];
  1789.       continue;
  1790.     }
  1791.     if (max_cnt && ft_cnt[key] == max_cnt)
  1792.     {
  1793.       mkeys++;
  1794.       ft_cnt[mkeys]=ft_cnt[key];
  1795.       ft_to_key[mkeys]=ft_to_key[key];
  1796.       continue;
  1797.     }
  1798.   }
  1799.   for (key=0 ; key<=mkeys ; key++)
  1800.   {
  1801.     // for now, partial keys won't work. SerG
  1802.     if (max_cnt < fields.elements ||
  1803.         max_cnt < table->key_info[ft_to_key[key]].key_parts)
  1804.       continue;
  1805.     this->key=ft_to_key[key];
  1806.     maybe_null=1;
  1807.     join_key=0;
  1808.     return 0;
  1809.   }
  1810.   my_printf_error(ER_FT_MATCHING_KEY_NOT_FOUND,
  1811.                ER(ER_FT_MATCHING_KEY_NOT_FOUND),MYF(0));
  1812.   return 1;
  1813. }
  1814. bool Item_func_match::eq(const Item *item) const
  1815. {
  1816.   if (item->type() != FUNC_ITEM)
  1817.     return 0;
  1818.   if (func_name() != ((Item_func*)item)->func_name())
  1819.     return 0;
  1820.   Item_func_match *ifm=(Item_func_match*) item;
  1821.   if (key == ifm->key && table == ifm->table &&
  1822.       key_item()->eq(ifm->key_item()))
  1823.     return 1;
  1824.   return 0;
  1825. }
  1826. /***************************************************************************
  1827.   System variables
  1828.   This has to be recoded after we get more than 3 system variables
  1829. ****************************************************************************/
  1830. Item *get_system_var(LEX_STRING name)
  1831. {
  1832.   if (!strcmp(name.str,"IDENTITY"))
  1833.     return new Item_int((char*) "@@IDENTITY",
  1834. current_thd->insert_id(),21);
  1835.   my_error(ER_UNKNOWN_SYSTEM_VARIABLE,MYF(0),name);
  1836.   return 0;
  1837. }