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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /* This file defines all compare functions */
  17. #ifdef __GNUC__
  18. #pragma implementation // gcc: Class implementation
  19. #endif
  20. #include "mysql_priv.h"
  21. #include <m_ctype.h>
  22. /*
  23. ** Test functions
  24. ** These returns 0LL if false and 1LL if true and null if some arg is null
  25. ** 'AND' and 'OR' never return null
  26. */
  27. longlong Item_func_not::val_int()
  28. {
  29.   double value=args[0]->val();
  30.   null_value=args[0]->null_value;
  31.   return !null_value && value == 0 ? 1 : 0;
  32. }
  33. static bool convert_constant_item(Field *field, Item **item)
  34. {
  35.   if ((*item)->const_item())
  36.   {
  37.     (*item)->save_in_field(field);
  38.     if (!((*item)->null_value))
  39.     {
  40.       Item *tmp=new Item_int(field->val_int());
  41.       if ((tmp))
  42. *item=tmp;
  43.       return 1;
  44.     }
  45.   }
  46.   return 0;
  47. }
  48. void Item_bool_func2::fix_length_and_dec()
  49. {
  50.   max_length=1;
  51.   /* As some compare functions are generated after sql_yacc,
  52.      we have to check for out of memory conditons here */
  53.   if (!args[0] || !args[1])
  54.     return;
  55.   // Make a special case of compare with fields to get nicer DATE comparisons
  56.   if (args[0]->type() == FIELD_ITEM)
  57.   {
  58.     Field *field=((Item_field*) args[0])->field;
  59.     if (field->store_for_compare())
  60.     {
  61.       if (convert_constant_item(field,&args[1]))
  62.       {
  63. cmp_func= &Item_bool_func2::compare_int;  // Works for all types.
  64. return;
  65.       }
  66.     }
  67.   }
  68.   if (args[1]->type() == FIELD_ITEM)
  69.   {
  70.     Field *field=((Item_field*) args[1])->field;
  71.     if (field->store_for_compare())
  72.     {
  73.       if (convert_constant_item(field,&args[0]))
  74.       {
  75. cmp_func= &Item_bool_func2::compare_int;  // Works for all types.
  76. return;
  77.       }
  78.     }
  79.   }
  80.   set_cmp_func(item_cmp_type(args[0]->result_type(),args[1]->result_type()));
  81. }
  82. void Item_bool_func2::set_cmp_func(Item_result type)
  83. {
  84.   switch (type) {
  85.   case STRING_RESULT:
  86.     cmp_func=&Item_bool_func2::compare_string;
  87.     break;
  88.   case REAL_RESULT:
  89.     cmp_func=&Item_bool_func2::compare_real;
  90.     break;
  91.   case INT_RESULT:
  92.     cmp_func=&Item_bool_func2::compare_int;
  93.     break;
  94.   }
  95. }
  96. int Item_bool_func2::compare_string()
  97. {
  98.   String *res1,*res2;
  99.   if ((res1=args[0]->val_str(&tmp_value1)))
  100.   {
  101.     if ((res2=args[1]->val_str(&tmp_value2)))
  102.     {
  103.       null_value=0;
  104.       return binary ? stringcmp(res1,res2) : sortcmp(res1,res2);
  105.     }
  106.   }
  107.   null_value=1;
  108.   return -1;
  109. }
  110. int Item_bool_func2::compare_real()
  111. {
  112.   double val1=args[0]->val();
  113.   if (!args[0]->null_value)
  114.   {
  115.     double val2=args[1]->val();
  116.     if (!args[1]->null_value)
  117.     {
  118.       null_value=0;
  119.       if (val1 < val2) return -1;
  120.       if (val1 == val2) return 0;
  121.       return 1;
  122.     }
  123.   }
  124.   null_value=1;
  125.   return -1;
  126. }
  127. int Item_bool_func2::compare_int()
  128. {
  129.   longlong val1=args[0]->val_int();
  130.   if (!args[0]->null_value)
  131.   {
  132.     longlong val2=args[1]->val_int();
  133.     if (!args[1]->null_value)
  134.     {
  135.       null_value=0;
  136.       if (val1 < val2) return -1;
  137.       if (val1 == val2)   return 0;
  138.       return 1;
  139.     }
  140.   }
  141.   null_value=1;
  142.   return -1;
  143. }
  144. longlong Item_func_eq::val_int()
  145. {
  146.   int value=(this->*cmp_func)();
  147.   return value == 0 ? 1 : 0;
  148. }
  149. /* Same as Item_func_eq, but NULL = NULL */
  150. void Item_func_equal::fix_length_and_dec()
  151. {
  152.   Item_bool_func2::fix_length_and_dec();
  153.   cmp_result_type=item_cmp_type(args[0]->result_type(),args[1]->result_type());
  154.   maybe_null=null_value=0;
  155. }
  156. longlong Item_func_equal::val_int()
  157. {
  158.   switch (cmp_result_type) {
  159.   case STRING_RESULT:
  160.   {
  161.     String *res1,*res2;
  162.     res1=args[0]->val_str(&tmp_value1);
  163.     res2=args[1]->val_str(&tmp_value2);
  164.     if (!res1 || !res2)
  165.       return test(res1 == res2);
  166.     return (binary ? test(stringcmp(res1,res2) == 0) :
  167.     test(sortcmp(res1,res2) == 0));
  168.   }
  169.   case REAL_RESULT:
  170.   {
  171.     double val1=args[0]->val();
  172.     double val2=args[1]->val();
  173.     if (args[0]->null_value || args[1]->null_value)
  174.       return test(args[0]->null_value && args[1]->null_value);
  175.     return test(val1 == val2);
  176.   }
  177.   case INT_RESULT:
  178.   {
  179.     longlong val1=args[0]->val_int();
  180.     longlong val2=args[1]->val_int();
  181.     if (args[0]->null_value || args[1]->null_value)
  182.       return test(args[0]->null_value && args[1]->null_value);
  183.     return test(val1 == val2);
  184.   }
  185.   }
  186.   return 0; // Impossible
  187. }
  188. longlong Item_func_ne::val_int()
  189. {
  190.   int value=(this->*cmp_func)();
  191.   return value != 0 && !null_value ? 1 : 0;
  192. }
  193. longlong Item_func_ge::val_int()
  194. {
  195.   int value=(this->*cmp_func)();
  196.   return value >= 0 ? 1 : 0;
  197. }
  198. longlong Item_func_gt::val_int()
  199. {
  200.   int value=(this->*cmp_func)();
  201.   return value > 0 ? 1 : 0;
  202. }
  203. longlong Item_func_le::val_int()
  204. {
  205.   int value=(this->*cmp_func)();
  206.   return value <= 0 && !null_value ? 1 : 0;
  207. }
  208. longlong Item_func_lt::val_int()
  209. {
  210.   int value=(this->*cmp_func)();
  211.   return value < 0 && !null_value ? 1 : 0;
  212. }
  213. longlong Item_func_strcmp::val_int()
  214. {
  215.   String *a=args[0]->val_str(&tmp_value1);
  216.   String *b=args[1]->val_str(&tmp_value2);
  217.   if (!a || !b)
  218.   {
  219.     null_value=1;
  220.     return 0;
  221.   }
  222.   int value=stringcmp(a,b);
  223.   null_value=0;
  224.   return !value ? 0 : (value < 0 ? (longlong) -1 : (longlong) 1);
  225. }
  226. void Item_func_interval::fix_length_and_dec()
  227. {
  228.   bool nums=1;
  229.   uint i;
  230.   for (i=0 ; i < arg_count ; i++)
  231.   {
  232.     if (!args[i])
  233.       return; // End of memory
  234.     if (args[i]->type() != Item::INT_ITEM &&
  235. args[i]->type() != Item::REAL_ITEM)
  236.     {
  237.       nums=0;
  238.       break;
  239.     }
  240.   }
  241.   if (nums && arg_count >= 8)
  242.   {
  243.     if ((intervals=(double*) sql_alloc(sizeof(double)*arg_count)))
  244.     {
  245.       for (i=0 ; i < arg_count ; i++)
  246. intervals[i]=args[i]->val();
  247.     }
  248.   }
  249.   maybe_null=0; max_length=2;
  250.   used_tables_cache|=item->used_tables();
  251. }
  252. /*
  253.   return -1 if null value,
  254.   0 if lower than lowest
  255.   1 - arg_count if between args[n] and args[n+1]
  256.   arg_count+1 if higher than biggest argument
  257. */
  258. longlong Item_func_interval::val_int()
  259. {
  260.   double value=item->val();
  261.   if (item->null_value)
  262.     return -1; // -1 if null /* purecov: inspected */
  263.   if (intervals)
  264.   { // Use binary search to find interval
  265.     uint start,end;
  266.     start=0; end=arg_count-1;
  267.     while (start != end)
  268.     {
  269.       uint mid=(start+end+1)/2;
  270.       if (intervals[mid] <= value)
  271. start=mid;
  272.       else
  273. end=mid-1;
  274.     }
  275.     return (value < intervals[start]) ? 0 : start+1;
  276.   }
  277.   if (args[0]->val() > value)
  278.     return 0;
  279.   for (uint i=1 ; i < arg_count ; i++)
  280.   {
  281.     if (args[i]->val() > value)
  282.       return i;
  283.   }
  284.   return (longlong) arg_count;
  285. }
  286. void Item_func_interval::update_used_tables()
  287. {
  288.   Item_func::update_used_tables();
  289.   item->update_used_tables();
  290.   used_tables_cache|=item->used_tables();
  291.   const_item_cache&=item->const_item();
  292. }
  293. void Item_func_between::fix_length_and_dec()
  294. {
  295.    max_length=1;
  296.   /* As some compare functions are generated after sql_yacc,
  297.      we have to check for out of memory conditons here */
  298.   if (!args[0] || !args[1] || !args[2])
  299.     return;
  300.   cmp_type=args[0]->result_type();
  301.   if (args[0]->binary)
  302.     string_compare=stringcmp;
  303.   else
  304.     string_compare=sortcmp;
  305.   // Make a special case of compare with fields to get nicer DATE comparisons
  306.   if (args[0]->type() == FIELD_ITEM)
  307.   {
  308.     Field *field=((Item_field*) args[0])->field;
  309.     if (field->store_for_compare())
  310.     {
  311.       if (convert_constant_item(field,&args[1]))
  312. cmp_type=INT_RESULT; // Works for all types.
  313.       if (convert_constant_item(field,&args[2]))
  314. cmp_type=INT_RESULT; // Works for all types.
  315.     }
  316.   }
  317. }
  318. longlong Item_func_between::val_int()
  319. { // ANSI BETWEEN
  320.   if (cmp_type == STRING_RESULT)
  321.   {
  322.     String *value,*a,*b;
  323.     value=args[0]->val_str(&value0);
  324.     if ((null_value=args[0]->null_value))
  325.       return 0;
  326.     a=args[1]->val_str(&value1);
  327.     b=args[2]->val_str(&value2);
  328.     if (!args[1]->null_value && !args[2]->null_value)
  329.       return (string_compare(value,a) >= 0 && string_compare(value,b) <= 0) ?
  330. 1 : 0;
  331.     if (args[1]->null_value && args[2]->null_value)
  332.       null_value=1;
  333.     else if (args[1]->null_value)
  334.     {
  335.       null_value= string_compare(value,b) <= 0; // not null if false range.
  336.     }
  337.     else
  338.     {
  339.       null_value= string_compare(value,a) >= 0; // not null if false range.
  340.     }
  341.   }
  342.   else if (cmp_type == INT_RESULT)
  343.   {
  344.     longlong value=args[0]->val_int(),a,b;
  345.     if ((null_value=args[0]->null_value))
  346.       return 0; /* purecov: inspected */
  347.     a=args[1]->val_int();
  348.     b=args[2]->val_int();
  349.     if (!args[1]->null_value && !args[2]->null_value)
  350.       return (value >= a && value <= b) ? 1 : 0;
  351.     if (args[1]->null_value && args[2]->null_value)
  352.       null_value=1;
  353.     else if (args[1]->null_value)
  354.     {
  355.       null_value= value <= b; // not null if false range.
  356.     }
  357.     else
  358.     {
  359.       null_value= value >= a;
  360.     }
  361.   }
  362.   else
  363.   {
  364.     double value=args[0]->val(),a,b;
  365.     if ((null_value=args[0]->null_value))
  366.       return 0; /* purecov: inspected */
  367.     a=args[1]->val();
  368.     b=args[2]->val();
  369.     if (!args[1]->null_value && !args[2]->null_value)
  370.       return (value >= a && value <= b) ? 1 : 0;
  371.     if (args[1]->null_value && args[2]->null_value)
  372.       null_value=1;
  373.     else if (args[1]->null_value)
  374.     {
  375.       null_value= value <= b; // not null if false range.
  376.     }
  377.     else
  378.     {
  379.       null_value= value >= a;
  380.     }
  381.   }
  382.   return 0;
  383. }
  384. void
  385. Item_func_ifnull::fix_length_and_dec()
  386. {
  387.   maybe_null=args[1]->maybe_null;
  388.   max_length=max(args[0]->max_length,args[1]->max_length);
  389.   decimals=max(args[0]->decimals,args[1]->decimals);
  390.   cached_result_type=args[0]->result_type();
  391. }
  392. double
  393. Item_func_ifnull::val()
  394. {
  395.   double value=args[0]->val();
  396.   if (!args[0]->null_value)
  397.   {
  398.     null_value=0;
  399.     return value;
  400.   }
  401.   value=args[1]->val();
  402.   if ((null_value=args[1]->null_value))
  403.     return 0.0;
  404.   return value;
  405. }
  406. longlong
  407. Item_func_ifnull::val_int()
  408. {
  409.   longlong value=args[0]->val_int();
  410.   if (!args[0]->null_value)
  411.   {
  412.     null_value=0;
  413.     return value;
  414.   }
  415.   value=args[1]->val_int();
  416.   if ((null_value=args[1]->null_value))
  417.     return 0;
  418.   return value;
  419. }
  420. String *
  421. Item_func_ifnull::val_str(String *str)
  422. {
  423.   String *res  =args[0]->val_str(str);
  424.   if (!args[0]->null_value)
  425.   {
  426.     null_value=0;
  427.     return res;
  428.   }
  429.   res=args[1]->val_str(str);
  430.   if ((null_value=args[1]->null_value))
  431.     return 0;
  432.   return res;
  433. }
  434. void
  435. Item_func_if::fix_length_and_dec()
  436. {
  437.   maybe_null=args[1]->maybe_null || args[2]->maybe_null;
  438.   max_length=max(args[1]->max_length,args[2]->max_length);
  439.   decimals=max(args[0]->decimals,args[1]->decimals);
  440.   enum Item_result arg1_type=args[1]->result_type();
  441.   enum Item_result arg2_type=args[2]->result_type();
  442.   if (arg1_type == STRING_RESULT || arg2_type == STRING_RESULT)
  443.     cached_result_type = STRING_RESULT;
  444.   else if (arg1_type == REAL_RESULT || arg2_type == REAL_RESULT)
  445.     cached_result_type = REAL_RESULT;
  446.   else
  447.     cached_result_type=arg1_type; // Should be INT_RESULT
  448. }
  449. double
  450. Item_func_if::val()
  451. {
  452.   Item *arg= args[0]->val_int() ? args[1] : args[2];
  453.   double value=arg->val();
  454.   null_value=arg->null_value;
  455.   return value;
  456. }
  457. longlong
  458. Item_func_if::val_int()
  459. {
  460.   Item *arg= args[0]->val_int() ? args[1] : args[2];
  461.   longlong value=arg->val_int();
  462.   null_value=arg->null_value;
  463.   return value;
  464. }
  465. String *
  466. Item_func_if::val_str(String *str)
  467. {
  468.   Item *arg= args[0]->val_int() ? args[1] : args[2];
  469.   String *res=arg->val_str(str);
  470.   null_value=arg->null_value;
  471.   return res;
  472. }
  473. void
  474. Item_func_nullif::fix_length_and_dec()
  475. {
  476.   Item_bool_func2::fix_length_and_dec();
  477.   maybe_null=1;
  478.   if (args[0]) // Only false if EOM
  479.   {
  480.     max_length=args[0]->max_length;
  481.     decimals=args[0]->decimals;
  482.     cached_result_type=args[0]->result_type();
  483.   }
  484. }
  485. /*
  486.   nullif() returns NULL if arguments are different, else it returns the
  487.   first argument.
  488.   Note that we have to evaluate the first argument twice as the compare
  489.   may have been done with a different type than return value
  490. */
  491. double
  492. Item_func_nullif::val()
  493. {
  494.   double value;
  495.   if (!(this->*cmp_func)() || null_value)
  496.   {
  497.     null_value=1;
  498.     return 0.0;
  499.   }
  500.   value=args[0]->val();
  501.   null_value=args[0]->null_value;
  502.   return value;
  503. }
  504. longlong
  505. Item_func_nullif::val_int()
  506. {
  507.   longlong value;
  508.   if (!(this->*cmp_func)() || null_value)
  509.   {
  510.     null_value=1;
  511.     return 0;
  512.   }
  513.   value=args[0]->val_int();
  514.   null_value=args[0]->null_value;
  515.   return value;
  516. }
  517. String *
  518. Item_func_nullif::val_str(String *str)
  519. {
  520.   String *res;
  521.   if (!(this->*cmp_func)() || null_value)
  522.   {
  523.     null_value=1;
  524.     return 0;
  525.   }
  526.   res=args[0]->val_str(str);
  527.   null_value=args[0]->null_value;
  528.   return res;
  529. }
  530. /*
  531. ** CASE expression 
  532. */
  533. /* Return the matching ITEM or NULL if all compares (including else) failed */
  534. Item *Item_func_case::find_item(String *str)
  535. {
  536.   String *first_expr_str,*tmp;
  537.   longlong first_expr_int;
  538.   double   first_expr_real;
  539.   bool int_used, real_used,str_used;
  540.   int_used=real_used=str_used=0;
  541.   /* These will be initialized later */
  542.   LINT_INIT(first_expr_str);
  543.   LINT_INIT(first_expr_int);
  544.   LINT_INIT(first_expr_real);
  545.   // Compare every WHEN argument with it and return the first match
  546.   for (uint i=0 ; i < arg_count ; i+=2)
  547.   {
  548.     if (!first_expr)
  549.     {
  550.       // No expression between CASE and first WHEN
  551.       if (args[i]->val_int())
  552. return args[i+1];
  553.       continue;
  554.     }
  555.     switch (args[i]->result_type()) {
  556.     case STRING_RESULT:
  557.       if (!str_used)
  558.       {
  559. str_used=1;
  560. // We can't use 'str' here as this may be overwritten
  561. if (!(first_expr_str= first_expr->val_str(&str_value)))
  562.   return else_expr; // Impossible
  563.       }
  564.       if ((tmp=args[i]->val_str(str))) // If not null
  565.       {
  566. if (first_expr->binary || args[i]->binary)
  567. {
  568.   if (stringcmp(tmp,first_expr_str)==0)
  569.     return args[i+1];
  570. }
  571. else if (sortcmp(tmp,first_expr_str)==0)
  572.   return args[i+1];
  573.       }
  574.       break;
  575.     case INT_RESULT:
  576.       if (!int_used)
  577.       {
  578. int_used=1;
  579. first_expr_int= first_expr->val_int();
  580. if (first_expr->null_value)
  581.   return else_expr;
  582.       }
  583.       if (args[i]->val_int()==first_expr_int && !args[i]->null_value) 
  584.         return args[i+1];
  585.       break;
  586.     case REAL_RESULT: 
  587.       if (!real_used)
  588.       {
  589. real_used=1;
  590. first_expr_real= first_expr->val();
  591. if (first_expr->null_value)
  592.   return else_expr;
  593.       }
  594.       if (args[i]->val()==first_expr_real && !args[i]->null_value) 
  595.         return args[i+1];
  596.     }
  597.   }
  598.   // No, WHEN clauses all missed, return ELSE expression
  599.   return else_expr;
  600. }
  601. String *Item_func_case::val_str(String *str)
  602. {
  603.   String *res;
  604.   Item *item=find_item(str);
  605.   if (!item)
  606.   {
  607.     null_value=1;
  608.     return 0;
  609.   }
  610.   if (!(res=item->val_str(str)))
  611.     null_value=1;
  612.   return res;
  613. }
  614. longlong Item_func_case::val_int()
  615. {
  616.   char buff[MAX_FIELD_WIDTH];
  617.   String dummy_str(buff,sizeof(buff));
  618.   Item *item=find_item(&dummy_str);
  619.   longlong res;
  620.   if (!item)
  621.   {
  622.     null_value=1;
  623.     return 0;
  624.   }
  625.   res=item->val_int();
  626.   null_value=item->null_value;
  627.   return res;
  628. }
  629. double Item_func_case::val()
  630. {
  631.   char buff[MAX_FIELD_WIDTH];
  632.   String dummy_str(buff,sizeof(buff));
  633.   Item *item=find_item(&dummy_str);
  634.   double res;
  635.   if (!item)
  636.   {
  637.     null_value=1;
  638.     return 0;
  639.   }
  640.   res=item->val();
  641.   null_value=item->null_value;
  642.   return res;
  643. }
  644. bool
  645. Item_func_case::fix_fields(THD *thd,TABLE_LIST *tables)
  646. {
  647.   if (first_expr && first_expr->fix_fields(thd,tables) ||
  648.       else_expr && else_expr->fix_fields(thd,tables))
  649.     return 1;
  650.   if (Item_func::fix_fields(thd,tables))
  651.     return 1;
  652.   if (first_expr)
  653.   {
  654.     used_tables_cache|=(first_expr)->used_tables();
  655.     const_item_cache&= (first_expr)->const_item();
  656.   }
  657.   if (else_expr)
  658.   {
  659.     used_tables_cache|=(else_expr)->used_tables();
  660.     const_item_cache&= (else_expr)->const_item();
  661.   }
  662.   if (!else_expr || else_expr->maybe_null)
  663.     maybe_null=1; // The result may be NULL
  664.   return 0;
  665. }
  666. void Item_func_case::update_used_tables()
  667. {
  668.   Item_func::update_used_tables();
  669.   if (first_expr)
  670.   {
  671.     used_tables_cache|=(first_expr)->used_tables();
  672.     const_item_cache&= (first_expr)->const_item();
  673.   }
  674.   if (else_expr)
  675.   {
  676.     used_tables_cache|=(else_expr)->used_tables();
  677.     const_item_cache&= (else_expr)->const_item();
  678.   }
  679. }
  680. void Item_func_case::fix_length_and_dec()
  681. {
  682.   max_length=0;
  683.   decimals=0;
  684.   cached_result_type = args[1]->result_type();
  685.   for (uint i=0 ; i < arg_count ; i+=2)
  686.   {
  687.     set_if_bigger(max_length,args[i+1]->max_length);
  688.     set_if_bigger(decimals,args[i+1]->decimals);
  689.   }
  690.   if (else_expr != NULL) 
  691.   {
  692.     set_if_bigger(max_length,else_expr->max_length);
  693.     set_if_bigger(decimals,else_expr->decimals);
  694.   }
  695. }
  696. /* TODO:  Fix this so that it prints the whole CASE expression */
  697. void Item_func_case::print(String *str)
  698. {
  699.   str->append("case "); // Not yet complete
  700. }
  701. /*
  702. ** Coalesce - return first not NULL argument.
  703. */
  704. String *Item_func_coalesce::val_str(String *str)
  705. {
  706.   null_value=0;
  707.   for (uint i=0 ; i < arg_count ; i++)
  708.   {
  709.     if (args[i]->val_str(str) != NULL)
  710.       return args[i]->val_str(str);
  711.   }
  712.   null_value=1;
  713.   return 0;
  714. }
  715. longlong Item_func_coalesce::val_int()
  716. {
  717.   null_value=0;
  718.   for (uint i=0 ; i < arg_count ; i++)
  719.   {
  720.     longlong res=args[i]->val_int();
  721.     if (!args[i]->null_value)
  722.       return res;
  723.   }
  724.   null_value=1;
  725.   return 0;
  726. }
  727. double Item_func_coalesce::val()
  728. {
  729.   null_value=0;
  730.   for (uint i=0 ; i < arg_count ; i++)
  731.   {
  732.     double res=args[i]->val();
  733.     if (!args[i]->null_value)
  734.       return res;
  735.   }
  736.   null_value=1;
  737.   return 0;
  738. }
  739. void Item_func_coalesce::fix_length_and_dec()
  740. {
  741.   max_length=0;
  742.   decimals=0;
  743.   cached_result_type = args[0]->result_type();
  744.   for (uint i=0 ; i < arg_count ; i++)
  745.   {
  746.     set_if_bigger(max_length,args[i]->max_length);
  747.     set_if_bigger(decimals,args[i]->decimals);
  748.   }
  749. }
  750. /****************************************************************************
  751. ** classes and function for the IN operator
  752. ****************************************************************************/
  753. static int cmp_longlong(longlong *a,longlong *b)
  754. {
  755.   return *a < *b ? -1 : *a == *b ? 0 : 1;
  756. }
  757. static int cmp_double(double *a,double *b)
  758. {
  759.   return *a < *b ? -1 : *a == *b ? 0 : 1;
  760. }
  761. int in_vector::find(Item *item)
  762. {
  763.   byte *result=get_value(item);
  764.   if (!result || !used_count)
  765.     return 0; // Null value
  766.   uint start,end;
  767.   start=0; end=used_count-1;
  768.   while (start != end)
  769.   {
  770.     uint mid=(start+end+1)/2;
  771.     int res;
  772.     if ((res=(*compare)(base+mid*size,result)) == 0)
  773.       return 1;
  774.     if (res < 0)
  775.       start=mid;
  776.     else
  777.       end=mid-1;
  778.   }
  779.   return (int) ((*compare)(base+start*size,result) == 0);
  780. }
  781. in_string::in_string(uint elements,qsort_cmp cmp_func)
  782.   :in_vector(elements,sizeof(String),cmp_func),tmp(buff,sizeof(buff))
  783. {}
  784. in_string::~in_string()
  785. {
  786.   for (uint i=0 ; i < count ; i++)
  787.     ((String*) base)[i].free();
  788. }
  789. void in_string::set(uint pos,Item *item)
  790. {
  791.   String *str=((String*) base)+pos;
  792.   String *res=item->val_str(str);
  793.   if (res && res != str)
  794.     *str= *res;
  795. }
  796. byte *in_string::get_value(Item *item)
  797. {
  798.   return (byte*) item->val_str(&tmp);
  799. }
  800. in_longlong::in_longlong(uint elements)
  801.   :in_vector(elements,sizeof(longlong),(qsort_cmp) cmp_longlong)
  802. {}
  803. void in_longlong::set(uint pos,Item *item)
  804. {
  805.   ((longlong*) base)[pos]=item->val_int();
  806. }
  807. byte *in_longlong::get_value(Item *item)
  808. {
  809.   tmp=item->val_int();
  810.   if (item->null_value)
  811.     return 0; /* purecov: inspected */
  812.   return (byte*) &tmp;
  813. }
  814. in_double::in_double(uint elements)
  815.   :in_vector(elements,sizeof(double),(qsort_cmp) cmp_double)
  816. {}
  817. void in_double::set(uint pos,Item *item)
  818. {
  819.   ((double*) base)[pos]=item->val();
  820. }
  821. byte *in_double::get_value(Item *item)
  822. {
  823.   tmp=item->val();
  824.   if (item->null_value)
  825.     return 0; /* purecov: inspected */
  826.   return (byte*) &tmp;
  827. }
  828. void Item_func_in::fix_length_and_dec()
  829. {
  830.   if (const_item())
  831.   {
  832.     switch (item->result_type()) {
  833.     case STRING_RESULT:
  834.       if (item->binary)
  835. array=new in_string(arg_count,(qsort_cmp) stringcmp); /* purecov: inspected */
  836.       else
  837. array=new in_string(arg_count,(qsort_cmp) sortcmp);
  838.       break;
  839.     case INT_RESULT:
  840.       array= new in_longlong(arg_count);
  841.       break;
  842.     case REAL_RESULT:
  843.       array= new in_double(arg_count);
  844.       break;
  845.     }
  846.     uint j=0;
  847.     for (uint i=0 ; i < arg_count ; i++)
  848.     {
  849.       array->set(j,args[i]);
  850.       if (!args[i]->null_value) // Skipp NULL values
  851. j++;
  852.     }
  853.     if ((array->used_count=j))
  854.       array->sort();
  855.   }
  856.   else
  857.   {
  858.     switch (item->result_type()) {
  859.     case STRING_RESULT:
  860.       if (item->binary)
  861. in_item= new cmp_item_binary_string;
  862.       else
  863. in_item= new cmp_item_sort_string;
  864.       break;
  865.     case INT_RESULT:
  866.       in_item=   new cmp_item_int;
  867.       break;
  868.     case REAL_RESULT:
  869.       in_item=   new cmp_item_real;
  870.       break;
  871.     }
  872.   }
  873.   maybe_null= item->maybe_null;
  874.   max_length=2;
  875.   used_tables_cache|=item->used_tables();
  876.   const_item_cache&=item->const_item();
  877. }
  878. void Item_func_in::print(String *str)
  879. {
  880.   str->append('(');
  881.   item->print(str);
  882.   Item_func::print(str);
  883.   str->append(')');
  884. }
  885. longlong Item_func_in::val_int()
  886. {
  887.   if (array)
  888.   {
  889.     int tmp=array->find(item);
  890.     null_value=item->null_value;
  891.     return tmp;
  892.   }
  893.   in_item->store_value(item);
  894.   if ((null_value=item->null_value))
  895.     return 0;
  896.   for (uint i=0 ; i < arg_count ; i++)
  897.   {
  898.     if (!in_item->cmp(args[i]) && !args[i]->null_value)
  899.       return 1; // Would maybe be nice with i ?
  900.   }
  901.   return 0;
  902. }
  903. void Item_func_in::update_used_tables()
  904. {
  905.   Item_func::update_used_tables();
  906.   item->update_used_tables();
  907.   used_tables_cache|=item->used_tables();
  908.   const_item_cache&=item->const_item();
  909. }
  910. longlong Item_func_bit_or::val_int()
  911. {
  912.   ulonglong arg1= (ulonglong) args[0]->val_int();
  913.   if (args[0]->null_value)
  914.   {
  915.     null_value=1; /* purecov: inspected */
  916.     return 0; /* purecov: inspected */
  917.   }
  918.   ulonglong arg2= (ulonglong) args[1]->val_int();
  919.   if (args[1]->null_value)
  920.   {
  921.     null_value=1;
  922.     return 0;
  923.   }
  924.   null_value=0;
  925.   return (longlong) (arg1 | arg2);
  926. }
  927. longlong Item_func_bit_and::val_int()
  928. {
  929.   ulonglong arg1= (ulonglong) args[0]->val_int();
  930.   if (args[0]->null_value)
  931.   {
  932.     null_value=1; /* purecov: inspected */
  933.     return 0; /* purecov: inspected */
  934.   }
  935.   ulonglong arg2= (ulonglong) args[1]->val_int();
  936.   if (args[1]->null_value)
  937.   {
  938.     null_value=1; /* purecov: inspected */
  939.     return 0; /* purecov: inspected */
  940.   }
  941.   null_value=0;
  942.   return (longlong) (arg1 & arg2);
  943. }
  944. bool
  945. Item_cond::fix_fields(THD *thd,TABLE_LIST *tables)
  946. {
  947.   List_iterator<Item> li(list);
  948.   Item *item;
  949.   char buff[sizeof(char*)]; // Max local vars in function
  950.   used_tables_cache=0;
  951.   const_item_cache=0;
  952.   if (thd && check_stack_overrun(thd,buff))
  953.     return 0; // Fatal error flag is set!
  954.   while ((item=li++))
  955.   {
  956.     while (item->type() == Item::COND_ITEM &&
  957.    ((Item_cond*) item)->functype() == functype())
  958.     { // Identical function
  959.       li.replace(((Item_cond*) item)->list);
  960.       ((Item_cond*) item)->list.empty();
  961. #ifdef DELETE_ITEMS
  962.       delete (Item_cond*) item;
  963. #endif
  964.       item= *li.ref(); // new current item
  965.     }
  966.     if (item->fix_fields(thd,tables))
  967.       return 1; /* purecov: inspected */
  968.     used_tables_cache|=item->used_tables();
  969.     with_sum_func= with_sum_func || item->with_sum_func;
  970.     const_item_cache&=item->const_item();
  971.   }
  972.   if (thd)
  973.     thd->cond_count+=list.elements;
  974.   fix_length_and_dec();
  975.   return 0;
  976. }
  977. void Item_cond::split_sum_func(List<Item> &fields)
  978. {
  979.   List_iterator<Item> li(list);
  980.   Item *item;
  981.   used_tables_cache=0;
  982.   const_item_cache=0;
  983.   while ((item=li++))
  984.   {
  985.     if (item->with_sum_func && item->type() != SUM_FUNC_ITEM)
  986.       item->split_sum_func(fields);
  987.     else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
  988.     {
  989.       fields.push_front(item);
  990.       li.replace(new Item_ref((Item**) fields.head_ref(),0,item->name));
  991.     }
  992.     item->update_used_tables();
  993.     used_tables_cache|=item->used_tables();
  994.     const_item_cache&=item->const_item();
  995.   }
  996. }
  997. table_map
  998. Item_cond::used_tables() const
  999. { // This caches used_tables
  1000.   return used_tables_cache;
  1001. }
  1002. void Item_cond::update_used_tables()
  1003. {
  1004.   used_tables_cache=0;
  1005.   const_item_cache=1;
  1006.   List_iterator<Item> li(list);
  1007.   Item *item;
  1008.   while ((item=li++))
  1009.   {
  1010.     item->update_used_tables();
  1011.     used_tables_cache|=item->used_tables();
  1012.     const_item_cache&= item->const_item();
  1013.   }
  1014. }
  1015. void Item_cond::print(String *str)
  1016. {
  1017.   str->append('(');
  1018.   List_iterator<Item> li(list);
  1019.   Item *item;
  1020.   if ((item=li++))
  1021.     item->print(str);
  1022.   while ((item=li++))
  1023.   {
  1024.     str->append(' ');
  1025.     str->append(func_name());
  1026.     str->append(' ');
  1027.     item->print(str);
  1028.   }
  1029.   str->append(')');
  1030. }
  1031. longlong Item_cond_and::val_int()
  1032. {
  1033.   List_iterator<Item> li(list);
  1034.   Item *item;
  1035.   while ((item=li++))
  1036.   {
  1037.     if (item->val_int() == 0)
  1038.     {
  1039.       /* TODO: In case of NULL, ANSI would require us to continue evaluation
  1040.  until we get a FALSE value or run out of values; This would
  1041.  require a lot of unnecessary evaluation, which we skip for now */
  1042.       null_value=item->null_value;
  1043.       return 0;
  1044.     }
  1045.   }
  1046.   null_value=0;
  1047.   return 1;
  1048. }
  1049. longlong Item_cond_or::val_int()
  1050. {
  1051.   List_iterator<Item> li(list);
  1052.   Item *item;
  1053.   null_value=0;
  1054.   while ((item=li++))
  1055.   {
  1056.     if (item->val_int() != 0)
  1057.     {
  1058.       null_value=0;
  1059.       return 1;
  1060.     }
  1061.     if (item->null_value)
  1062.       null_value=1;
  1063.   }
  1064.   return 0;
  1065. }
  1066. longlong Item_func_isnull::val_int()
  1067. {
  1068.   (void) args[0]->val();
  1069.   return (args[0]->null_value) ? 1 : 0;
  1070. }
  1071. longlong Item_func_isnotnull::val_int()
  1072. {
  1073.   (void) args[0]->val();
  1074.   return !(args[0]->null_value) ? 1 : 0;
  1075. }
  1076. void Item_func_like::fix_length_and_dec()
  1077. {
  1078.   decimals=0; max_length=1;
  1079.   //  cmp_type=STRING_RESULT; // For quick select
  1080. }
  1081. longlong Item_func_like::val_int()
  1082. {
  1083.   String *res,*res2;
  1084.   res=args[0]->val_str(&tmp_value1);
  1085.   if (args[0]->null_value)
  1086.   {
  1087.     null_value=1;
  1088.     return 0;
  1089.   }
  1090.   res2=args[1]->val_str(&tmp_value2);
  1091.   if (args[1]->null_value)
  1092.   {
  1093.     null_value=1;
  1094.     return 0;
  1095.   }
  1096.   null_value=0;
  1097.   if (binary)
  1098.     return wild_compare(*res,*res2,escape) ? 0 : 1;
  1099.   else
  1100.     return wild_case_compare(*res,*res2,escape) ? 0 : 1;
  1101. }
  1102. /* We can optimize a where if first character isn't a wildcard */
  1103. Item_func::optimize_type Item_func_like::select_optimize() const
  1104. {
  1105.   if (args[1]->type() == STRING_ITEM)
  1106.   {
  1107.     if (((Item_string *) args[1])->str_value[0] != wild_many)
  1108.     {
  1109.       if ((args[0]->result_type() != STRING_RESULT) ||
  1110.   ((Item_string *) args[1])->str_value[0] != wild_one)
  1111. return OPTIMIZE_OP;
  1112.     }
  1113.   }
  1114.   return OPTIMIZE_NONE;
  1115. }
  1116. #ifdef USE_REGEX
  1117. bool
  1118. Item_func_regex::fix_fields(THD *thd,TABLE_LIST *tables)
  1119. {
  1120.   if (args[0]->fix_fields(thd,tables) || args[1]->fix_fields(thd,tables))
  1121.     return 1; /* purecov: inspected */
  1122.   with_sum_func=args[0]->with_sum_func || args[1]->with_sum_func;
  1123.   max_length=1; decimals=0;
  1124.   binary=args[0]->binary || args[1]->binary;
  1125.   used_tables_cache=args[0]->used_tables() | args[1]->used_tables();
  1126.   const_item_cache=args[0]->const_item() && args[1]->const_item();
  1127.   if (!regex_compiled && args[1]->const_item())
  1128.   {
  1129.     char buff[MAX_FIELD_WIDTH];
  1130.     String tmp(buff,sizeof(buff));
  1131.     String *res=args[1]->val_str(&tmp);
  1132.     if (args[1]->null_value)
  1133.     { // Will always return NULL
  1134.       maybe_null=1;
  1135.       return 0;
  1136.     }
  1137.     int error;
  1138.     if ((error=regcomp(&preg,res->c_ptr(),
  1139.        binary ? REG_EXTENDED | REG_NOSUB :
  1140.        REG_EXTENDED | REG_NOSUB | REG_ICASE)))
  1141.     {
  1142.       (void) regerror(error,&preg,buff,sizeof(buff));
  1143.       my_printf_error(ER_REGEXP_ERROR,ER(ER_REGEXP_ERROR),MYF(0),buff);
  1144.       return 1;
  1145.     }
  1146.     regex_compiled=regex_is_const=1;
  1147.     maybe_null=args[0]->maybe_null;
  1148.   }
  1149.   else
  1150.     maybe_null=1;
  1151.   return 0;
  1152. }
  1153. longlong Item_func_regex::val_int()
  1154. {
  1155.   char buff[MAX_FIELD_WIDTH];
  1156.   String *res, tmp(buff,sizeof(buff));
  1157.   res=args[0]->val_str(&tmp);
  1158.   if (args[0]->null_value)
  1159.   {
  1160.     null_value=1;
  1161.     return 0;
  1162.   }
  1163.   if (!regex_is_const)
  1164.   {
  1165.     char buff2[MAX_FIELD_WIDTH];
  1166.     String *res2, tmp2(buff2,sizeof(buff2));
  1167.     res2= args[1]->val_str(&tmp2);
  1168.     if (args[1]->null_value)
  1169.     {
  1170.       null_value=1;
  1171.       return 0;
  1172.     }
  1173.     if (!regex_compiled || stringcmp(res2,&prev_regexp))
  1174.     {
  1175.       prev_regexp.copy(*res2);
  1176.       if (regex_compiled)
  1177.       {
  1178. regfree(&preg);
  1179. regex_compiled=0;
  1180.       }
  1181.       if (regcomp(&preg,res2->c_ptr(),
  1182.   binary ? REG_EXTENDED | REG_NOSUB :
  1183.   REG_EXTENDED | REG_NOSUB | REG_ICASE))
  1184.       {
  1185. null_value=1;
  1186. return 0;
  1187.       }
  1188.       regex_compiled=1;
  1189.     }
  1190.   }
  1191.   null_value=0;
  1192.   return regexec(&preg,res->c_ptr(),0,(regmatch_t*) 0,0) ? 0 : 1;
  1193. }
  1194. Item_func_regex::~Item_func_regex()
  1195. {
  1196.   if (regex_compiled)
  1197.   {
  1198.     regfree(&preg);
  1199.     regex_compiled=0;
  1200.   }
  1201. }
  1202. #endif /* USE_REGEX */