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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000-2003 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 compare functions */
  14. #ifdef USE_PRAGMA_IMPLEMENTATION
  15. #pragma implementation // gcc: Class implementation
  16. #endif
  17. #include "mysql_priv.h"
  18. #include <m_ctype.h>
  19. #include "sql_select.h"
  20. static Item_result item_store_type(Item_result a,Item_result b)
  21. {
  22.   if (a == STRING_RESULT || b == STRING_RESULT)
  23.     return STRING_RESULT;
  24.   else if (a == REAL_RESULT || b == REAL_RESULT)
  25.     return REAL_RESULT;
  26.   else
  27.     return INT_RESULT;
  28. }
  29. static void agg_result_type(Item_result *type, Item **items, uint nitems)
  30. {
  31.   uint i;
  32.   type[0]= items[0]->result_type();
  33.   for (i=1 ; i < nitems ; i++)
  34.     type[0]= item_store_type(type[0], items[i]->result_type());
  35. }
  36. static void agg_cmp_type(Item_result *type, Item **items, uint nitems)
  37. {
  38.   uint i;
  39.   type[0]= items[0]->result_type();
  40.   for (i=1 ; i < nitems ; i++)
  41.     type[0]= item_cmp_type(type[0], items[i]->result_type());
  42. }
  43. static void my_coll_agg_error(DTCollation &c1, DTCollation &c2,
  44.                               const char *fname)
  45. {
  46.   my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
  47.       c1.collation->name,c1.derivation_name(),
  48.    c2.collation->name,c2.derivation_name(),
  49.    fname);
  50. }
  51. Item_bool_func2* Eq_creator::create(Item *a, Item *b) const
  52. {
  53.   return new Item_func_eq(a, b);
  54. }
  55. Item_bool_func2* Ne_creator::create(Item *a, Item *b) const
  56. {
  57.   return new Item_func_ne(a, b);
  58. }
  59. Item_bool_func2* Gt_creator::create(Item *a, Item *b) const
  60. {
  61.   return new Item_func_gt(a, b);
  62. }
  63. Item_bool_func2* Lt_creator::create(Item *a, Item *b) const
  64. {
  65.   return new Item_func_lt(a, b);
  66. }
  67. Item_bool_func2* Ge_creator::create(Item *a, Item *b) const
  68. {
  69.   return new Item_func_ge(a, b);
  70. }
  71. Item_bool_func2* Le_creator::create(Item *a, Item *b) const
  72. {
  73.   return new Item_func_le(a, b);
  74. }
  75. /*
  76.   Test functions
  77.   Most of these  returns 0LL if false and 1LL if true and
  78.   NULL if some arg is NULL.
  79. */
  80. longlong Item_func_not::val_int()
  81. {
  82.   DBUG_ASSERT(fixed == 1);
  83.   double value=args[0]->val();
  84.   null_value=args[0]->null_value;
  85.   return ((!null_value && value == 0) ? 1 : 0);
  86. }
  87. /*
  88.   special NOT for ALL subquery
  89. */
  90. longlong Item_func_not_all::val_int()
  91. {
  92.   DBUG_ASSERT(fixed == 1);
  93.   double value= args[0]->val();
  94.   /*
  95.     return TRUE if there was records in underlaying select in max/min
  96.     optimisation (ALL subquery)
  97.   */
  98.   if (empty_underlying_subquery())
  99.     return 1;
  100.   null_value= args[0]->null_value;
  101.   return ((!null_value && value == 0) ? 1 : 0);
  102. }
  103. bool Item_func_not_all::empty_underlying_subquery()
  104. {
  105.   return ((test_sum_item && !test_sum_item->any_value()) ||
  106.           (test_sub_item && !test_sub_item->any_value()));
  107. }
  108. void Item_func_not_all::print(String *str)
  109. {
  110.   if (show)
  111.     Item_func::print(str);
  112.   else
  113.     args[0]->print(str);
  114. }
  115. /*
  116.   Special NOP (No OPeration) for ALL subquery it is like  Item_func_not_all
  117.   (return TRUE if underlaying sudquery do not return rows) but if subquery
  118.   returns some rows it return same value as argument (TRUE/FALSE).
  119. */
  120. longlong Item_func_nop_all::val_int()
  121. {
  122.   DBUG_ASSERT(fixed == 1);
  123.   double value= args[0]->val();
  124.   /*
  125.     return FALSE if there was records in underlaying select in max/min
  126.     optimisation (SAME/ANY subquery)
  127.   */
  128.   if (empty_underlying_subquery())
  129.     return 0;
  130.   null_value= args[0]->null_value;
  131.   return (null_value || value == 0) ? 0 : 1;
  132. }
  133. /*
  134.   Convert a constant expression or string to an integer.
  135.   This is done when comparing DATE's of different formats and
  136.   also when comparing bigint to strings (in which case the string
  137.   is converted once to a bigint).
  138.   RESULT VALUES
  139.   0 Can't convert item
  140.   1 Item was replaced with an integer version of the item
  141. */
  142. static bool convert_constant_item(THD *thd, Field *field, Item **item)
  143. {
  144.   if ((*item)->const_item())
  145.   {
  146.     if (!(*item)->save_in_field(field, 1) && !((*item)->null_value))
  147.     {
  148.       Item *tmp=new Item_int_with_ref(field->val_int(), *item);
  149.       if (tmp)
  150.         thd->change_item_tree(item, tmp);
  151.       return 1; // Item was replaced
  152.     }
  153.   }
  154.   return 0;
  155. }
  156. void Item_bool_func2::fix_length_and_dec()
  157. {
  158.   max_length= 1;      // Function returns 0 or 1
  159.   THD *thd= current_thd;
  160.   /*
  161.     As some compare functions are generated after sql_yacc,
  162.     we have to check for out of memory conditions here
  163.   */
  164.   if (!args[0] || !args[1])
  165.     return;
  166.   DTCollation coll;
  167.   if (args[0]->result_type() == STRING_RESULT &&
  168.       args[1]->result_type() == STRING_RESULT &&
  169.       agg_arg_charsets(coll, args, 2, MY_COLL_CMP_CONV))
  170.     return;
  171.   
  172.   // Make a special case of compare with fields to get nicer DATE comparisons
  173.   if (functype() == LIKE_FUNC)  // Disable conversion in case of LIKE function.
  174.   {
  175.     set_cmp_func();
  176.     return;
  177.   }
  178.     
  179.   if (args[0]->type() == FIELD_ITEM)
  180.   {
  181.     Field *field=((Item_field*) args[0])->field;
  182.     if (field->can_be_compared_as_longlong())
  183.     {
  184.       if (convert_constant_item(thd, field,&args[1]))
  185.       {
  186. cmp.set_cmp_func(this, tmp_arg, tmp_arg+1,
  187.  INT_RESULT); // Works for all types.
  188. return;
  189.       }
  190.     }
  191.   }
  192.   if (args[1]->type() == FIELD_ITEM)
  193.   {
  194.     Field *field=((Item_field*) args[1])->field;
  195.     if (field->can_be_compared_as_longlong())
  196.     {
  197.       if (convert_constant_item(thd, field,&args[0]))
  198.       {
  199. cmp.set_cmp_func(this, tmp_arg, tmp_arg+1,
  200.  INT_RESULT); // Works for all types.
  201. return;
  202.       }
  203.     }
  204.   }
  205.   set_cmp_func();
  206. }
  207. int Arg_comparator::set_compare_func(Item_bool_func2 *item, Item_result type)
  208. {
  209.   owner= item;
  210.   func= comparator_matrix[type]
  211.                          [test(owner->functype() == Item_func::EQUAL_FUNC)];
  212.   if (type == ROW_RESULT)
  213.   {
  214.     uint n= (*a)->cols();
  215.     if (n != (*b)->cols())
  216.     {
  217.       my_error(ER_OPERAND_COLUMNS, MYF(0), n);
  218.       comparators= 0;
  219.       return 1;
  220.     }
  221.     if (!(comparators= new Arg_comparator[n]))
  222.       return 1;
  223.     for (uint i=0; i < n; i++)
  224.     {
  225.       if ((*a)->el(i)->cols() != (*b)->el(i)->cols())
  226.       {
  227. my_error(ER_OPERAND_COLUMNS, MYF(0), (*a)->el(i)->cols());
  228. return 1;
  229.       }
  230.       comparators[i].set_cmp_func(owner, (*a)->addr(i), (*b)->addr(i));
  231.     }
  232.   }
  233.   else if (type == STRING_RESULT)
  234.   {
  235.     /*
  236.       We must set cmp_charset here as we may be called from for an automatic
  237.       generated item, like in natural join
  238.     */
  239.     if (cmp_collation.set((*a)->collation, (*b)->collation) || 
  240. cmp_collation.derivation == DERIVATION_NONE)
  241.     {
  242.       my_coll_agg_error((*a)->collation, (*b)->collation, owner->func_name());
  243.       return 1;
  244.     }
  245.     if (cmp_collation.collation == &my_charset_bin)
  246.     {
  247.       /*
  248. We are using BLOB/BINARY/VARBINARY, change to compare byte by byte,
  249. without removing end space
  250.       */
  251.       if (func == &Arg_comparator::compare_string)
  252. func= &Arg_comparator::compare_binary_string;
  253.       else if (func == &Arg_comparator::compare_e_string)
  254. func= &Arg_comparator::compare_e_binary_string;
  255.     }
  256.   }
  257.   else if (type == INT_RESULT)
  258.   {
  259.     if (func == &Arg_comparator::compare_int_signed)
  260.     {
  261.       if ((*a)->unsigned_flag)
  262.         func= ((*b)->unsigned_flag)? &Arg_comparator::compare_int_unsigned : 
  263.                                      &Arg_comparator::compare_int_unsigned_signed;
  264.       else if ((*b)->unsigned_flag)
  265.         func= &Arg_comparator::compare_int_signed_unsigned;
  266.     }
  267.     else if (func== &Arg_comparator::compare_e_int)
  268.     {
  269.       if ((*a)->unsigned_flag ^ (*b)->unsigned_flag)
  270.         func= &Arg_comparator::compare_e_int_diff_signedness;
  271.     }
  272.   }
  273.   return 0;
  274. }
  275. int Arg_comparator::compare_string()
  276. {
  277.   String *res1,*res2;
  278.   if ((res1= (*a)->val_str(&owner->tmp_value1)))
  279.   {
  280.     if ((res2= (*b)->val_str(&owner->tmp_value2)))
  281.     {
  282.       owner->null_value= 0;
  283.       return sortcmp(res1,res2,cmp_collation.collation);
  284.     }
  285.   }
  286.   owner->null_value= 1;
  287.   return -1;
  288. }
  289. /*
  290.   Compare strings byte by byte. End spaces are also compared.
  291.   RETURN
  292.    < 0 *a < *b
  293.    0 *b == *b
  294.    > 0 *a > *b
  295. */
  296. int Arg_comparator::compare_binary_string()
  297. {
  298.   String *res1,*res2;
  299.   if ((res1= (*a)->val_str(&owner->tmp_value1)))
  300.   {
  301.     if ((res2= (*b)->val_str(&owner->tmp_value2)))
  302.     {
  303.       owner->null_value= 0;
  304.       uint res1_length= res1->length();
  305.       uint res2_length= res2->length();
  306.       int cmp= memcmp(res1->ptr(), res2->ptr(), min(res1_length,res2_length));
  307.       return cmp ? cmp : (int) (res1_length - res2_length);
  308.     }
  309.   }
  310.   owner->null_value= 1;
  311.   return -1;
  312. }
  313. /*
  314.   Compare strings, but take into account that NULL == NULL
  315. */
  316. int Arg_comparator::compare_e_string()
  317. {
  318.   String *res1,*res2;
  319.   res1= (*a)->val_str(&owner->tmp_value1);
  320.   res2= (*b)->val_str(&owner->tmp_value2);
  321.   if (!res1 || !res2)
  322.     return test(res1 == res2);
  323.   return test(sortcmp(res1, res2, cmp_collation.collation) == 0);
  324. }
  325. int Arg_comparator::compare_e_binary_string()
  326. {
  327.   String *res1,*res2;
  328.   res1= (*a)->val_str(&owner->tmp_value1);
  329.   res2= (*b)->val_str(&owner->tmp_value2);
  330.   if (!res1 || !res2)
  331.     return test(res1 == res2);
  332.   return test(stringcmp(res1, res2) == 0);
  333. }
  334. int Arg_comparator::compare_real()
  335. {
  336.   /*
  337.     Fix yet another manifestation of Bug#2338. 'Volatile' will instruct
  338.     gcc to flush double values out of 80-bit Intel FPU registers before
  339.     performing the comparison.
  340.   */
  341.   volatile double val1, val2;
  342.   val1= (*a)->val();
  343.   if (!(*a)->null_value)
  344.   {
  345.     val2= (*b)->val();
  346.     if (!(*b)->null_value)
  347.     {
  348.       owner->null_value= 0;
  349.       if (val1 < val2) return -1;
  350.       if (val1 == val2) return 0;
  351.       return 1;
  352.     }
  353.   }
  354.   owner->null_value= 1;
  355.   return -1;
  356. }
  357. int Arg_comparator::compare_e_real()
  358. {
  359.   double val1= (*a)->val();
  360.   double val2= (*b)->val();
  361.   if ((*a)->null_value || (*b)->null_value)
  362.     return test((*a)->null_value && (*b)->null_value);
  363.   return test(val1 == val2);
  364. }
  365. int Arg_comparator::compare_int_signed()
  366. {
  367.   longlong val1= (*a)->val_int();
  368.   if (!(*a)->null_value)
  369.   {
  370.     longlong val2= (*b)->val_int();
  371.     if (!(*b)->null_value)
  372.     {
  373.       owner->null_value= 0;
  374.       if (val1 < val2) return -1;
  375.       if (val1 == val2)   return 0;
  376.       return 1;
  377.     }
  378.   }
  379.   owner->null_value= 1;
  380.   return -1;
  381. }
  382. /*
  383.   Compare values as BIGINT UNSIGNED.
  384. */
  385. int Arg_comparator::compare_int_unsigned()
  386. {
  387.   ulonglong val1= (*a)->val_int();
  388.   if (!(*a)->null_value)
  389.   {
  390.     ulonglong val2= (*b)->val_int();
  391.     if (!(*b)->null_value)
  392.     {
  393.       owner->null_value= 0;
  394.       if (val1 < val2) return -1;
  395.       if (val1 == val2)   return 0;
  396.       return 1;
  397.     }
  398.   }
  399.   owner->null_value= 1;
  400.   return -1;
  401. }
  402. /*
  403.   Compare signed (*a) with unsigned (*B)
  404. */
  405. int Arg_comparator::compare_int_signed_unsigned()
  406. {
  407.   longlong sval1= (*a)->val_int();
  408.   if (!(*a)->null_value)
  409.   {
  410.     ulonglong uval2= (ulonglong)(*b)->val_int();
  411.     if (!(*b)->null_value)
  412.     {
  413.       owner->null_value= 0;
  414.       if (sval1 < 0 || (ulonglong)sval1 < uval2)
  415.         return -1;
  416.       if ((ulonglong)sval1 == uval2)
  417.         return 0;
  418.       return 1;
  419.     }
  420.   }
  421.   owner->null_value= 1;
  422.   return -1;
  423. }
  424. /*
  425.   Compare unsigned (*a) with signed (*B)
  426. */
  427. int Arg_comparator::compare_int_unsigned_signed()
  428. {
  429.   ulonglong uval1= (ulonglong)(*a)->val_int();
  430.   if (!(*a)->null_value)
  431.   {
  432.     longlong sval2= (*b)->val_int();
  433.     if (!(*b)->null_value)
  434.     {
  435.       owner->null_value= 0;
  436.       if (sval2 < 0)
  437.         return 1;
  438.       if (uval1 < (ulonglong)sval2)
  439.         return -1;
  440.       if (uval1 == (ulonglong)sval2)
  441.         return 0;
  442.       return 1;
  443.     }
  444.   }
  445.   owner->null_value= 1;
  446.   return -1;
  447. }
  448. int Arg_comparator::compare_e_int()
  449. {
  450.   longlong val1= (*a)->val_int();
  451.   longlong val2= (*b)->val_int();
  452.   if ((*a)->null_value || (*b)->null_value)
  453.     return test((*a)->null_value && (*b)->null_value);
  454.   return test(val1 == val2);
  455. }
  456. /*
  457.   Compare unsigned *a with signed *b or signed *a with unsigned *b.
  458. */
  459. int Arg_comparator::compare_e_int_diff_signedness()
  460. {
  461.   longlong val1= (*a)->val_int();
  462.   longlong val2= (*b)->val_int();
  463.   if ((*a)->null_value || (*b)->null_value)
  464.     return test((*a)->null_value && (*b)->null_value);
  465.   return (val1 >= 0) && test(val1 == val2);
  466. }
  467. int Arg_comparator::compare_row()
  468. {
  469.   int res= 0;
  470.   (*a)->bring_value();
  471.   (*b)->bring_value();
  472.   uint n= (*a)->cols();
  473.   for (uint i= 0; i<n; i++)
  474.   {
  475.     if ((res= comparators[i].compare()))
  476.       return res;
  477.     if (owner->null_value)
  478.       return -1;
  479.   }
  480.   return res;
  481. }
  482. int Arg_comparator::compare_e_row()
  483. {
  484.   (*a)->bring_value();
  485.   (*b)->bring_value();
  486.   uint n= (*a)->cols();
  487.   for (uint i= 0; i<n; i++)
  488.   {
  489.     if (!comparators[i].compare())
  490.       return 0;
  491.   }
  492.   return 1;
  493. }
  494. bool Item_in_optimizer::fix_left(THD *thd,
  495.  struct st_table_list *tables,
  496.  Item **ref)
  497. {
  498.   if (!args[0]->fixed && args[0]->fix_fields(thd, tables, args) ||
  499.       !cache && !(cache= Item_cache::get_cache(args[0]->result_type())))
  500.     return 1;
  501.   cache->setup(args[0]);
  502.   /*
  503.     If it is preparation PS only then we do not know values of parameters =>
  504.     cant't get there values and do not need that values.
  505.   */
  506.   if (! thd->current_arena->is_stmt_prepare())
  507.     cache->store(args[0]);
  508.   if (cache->cols() == 1)
  509.   {
  510.     if ((used_tables_cache= args[0]->used_tables()))
  511.       cache->set_used_tables(OUTER_REF_TABLE_BIT);
  512.     else
  513.       cache->set_used_tables(0);
  514.   }
  515.   else
  516.   {
  517.     uint n= cache->cols();
  518.     for (uint i= 0; i < n; i++)
  519.     {
  520.       if (args[0]->el(i)->used_tables())
  521. ((Item_cache *)cache->el(i))->set_used_tables(OUTER_REF_TABLE_BIT);
  522.       else
  523. ((Item_cache *)cache->el(i))->set_used_tables(0);
  524.     }
  525.     used_tables_cache= args[0]->used_tables();
  526.   }
  527.   not_null_tables_cache= args[0]->not_null_tables();
  528.   with_sum_func= args[0]->with_sum_func;
  529.   const_item_cache= args[0]->const_item();
  530.   return 0;
  531. }
  532. bool Item_in_optimizer::fix_fields(THD *thd, struct st_table_list *tables,
  533.    Item ** ref)
  534. {
  535.   DBUG_ASSERT(fixed == 0);
  536.   if (fix_left(thd, tables, ref))
  537.     return 1;
  538.   if (args[0]->maybe_null)
  539.     maybe_null=1;
  540.   if (!args[1]->fixed && args[1]->fix_fields(thd, tables, args+1))
  541.     return 1;
  542.   Item_in_subselect * sub= (Item_in_subselect *)args[1];
  543.   if (args[0]->cols() != sub->engine->cols())
  544.   {
  545.     my_error(ER_OPERAND_COLUMNS, MYF(0), args[0]->cols());
  546.     return 1;
  547.   }
  548.   if (args[1]->maybe_null)
  549.     maybe_null=1;
  550.   with_sum_func= with_sum_func || args[1]->with_sum_func;
  551.   used_tables_cache|= args[1]->used_tables();
  552.   not_null_tables_cache|= args[1]->not_null_tables();
  553.   const_item_cache&= args[1]->const_item();
  554.   fixed= 1;
  555.   return 0;
  556. }
  557. longlong Item_in_optimizer::val_int()
  558. {
  559.   DBUG_ASSERT(fixed == 1);
  560.   cache->store(args[0]);
  561.   if (cache->null_value)
  562.   {
  563.     null_value= 1;
  564.     return 0;
  565.   }
  566.   longlong tmp= args[1]->val_int_result();
  567.   null_value= args[1]->null_value;
  568.   return tmp;
  569. }
  570. void Item_in_optimizer::keep_top_level_cache()
  571. {
  572.   cache->keep_array();
  573.   save_cache= 1;
  574. }
  575. void Item_in_optimizer::cleanup()
  576. {
  577.   DBUG_ENTER("Item_in_optimizer::cleanup");
  578.   Item_bool_func::cleanup();
  579.   if (!save_cache)
  580.     cache= 0;
  581.   DBUG_VOID_RETURN;
  582. }
  583. bool Item_in_optimizer::is_null()
  584. {
  585.   cache->store(args[0]);
  586.   return (null_value= (cache->null_value || args[1]->is_null()));
  587. }
  588. longlong Item_func_eq::val_int()
  589. {
  590.   DBUG_ASSERT(fixed == 1);
  591.   int value= cmp.compare();
  592.   return value == 0 ? 1 : 0;
  593. }
  594. /* Same as Item_func_eq, but NULL = NULL */
  595. void Item_func_equal::fix_length_and_dec()
  596. {
  597.   Item_bool_func2::fix_length_and_dec();
  598.   maybe_null=null_value=0;
  599. }
  600. longlong Item_func_equal::val_int()
  601. {
  602.   DBUG_ASSERT(fixed == 1);
  603.   return cmp.compare();
  604. }
  605. longlong Item_func_ne::val_int()
  606. {
  607.   DBUG_ASSERT(fixed == 1);
  608.   int value= cmp.compare();
  609.   return value != 0 && !null_value ? 1 : 0;
  610. }
  611. longlong Item_func_ge::val_int()
  612. {
  613.   DBUG_ASSERT(fixed == 1);
  614.   int value= cmp.compare();
  615.   return value >= 0 ? 1 : 0;
  616. }
  617. longlong Item_func_gt::val_int()
  618. {
  619.   DBUG_ASSERT(fixed == 1);
  620.   int value= cmp.compare();
  621.   return value > 0 ? 1 : 0;
  622. }
  623. longlong Item_func_le::val_int()
  624. {
  625.   DBUG_ASSERT(fixed == 1);
  626.   int value= cmp.compare();
  627.   return value <= 0 && !null_value ? 1 : 0;
  628. }
  629. longlong Item_func_lt::val_int()
  630. {
  631.   DBUG_ASSERT(fixed == 1);
  632.   int value= cmp.compare();
  633.   return value < 0 && !null_value ? 1 : 0;
  634. }
  635. longlong Item_func_strcmp::val_int()
  636. {
  637.   DBUG_ASSERT(fixed == 1);
  638.   String *a=args[0]->val_str(&tmp_value1);
  639.   String *b=args[1]->val_str(&tmp_value2);
  640.   if (!a || !b)
  641.   {
  642.     null_value=1;
  643.     return 0;
  644.   }
  645.   int value= sortcmp(a,b,cmp.cmp_collation.collation);
  646.   null_value=0;
  647.   return !value ? 0 : (value < 0 ? (longlong) -1 : (longlong) 1);
  648. }
  649. void Item_func_interval::fix_length_and_dec()
  650. {
  651.   if (row->cols() > 8)
  652.   {
  653.     bool consts=1;
  654.     for (uint i=1 ; consts && i < row->cols() ; i++)
  655.     {
  656.       consts&= row->el(i)->const_item();
  657.     }
  658.     if (consts &&
  659.         (intervals=(double*) sql_alloc(sizeof(double)*(row->cols()-1))))
  660.     {
  661.       for (uint i=1 ; i < row->cols(); i++)
  662.         intervals[i-1]=row->el(i)->val();
  663.     }
  664.   }
  665.   maybe_null= 0;
  666.   max_length= 2;
  667.   used_tables_cache|= row->used_tables();
  668.   not_null_tables_cache= row->not_null_tables();
  669.   with_sum_func= with_sum_func || row->with_sum_func;
  670.   const_item_cache&= row->const_item();
  671. }
  672. /*
  673.   return -1 if null value,
  674.   0 if lower than lowest
  675.   1 - arg_count-1 if between args[n] and args[n+1]
  676.   arg_count if higher than biggest argument
  677. */
  678. longlong Item_func_interval::val_int()
  679. {
  680.   DBUG_ASSERT(fixed == 1);
  681.   double value= row->el(0)->val();
  682.   uint i;
  683.   if (row->el(0)->null_value)
  684.     return -1; // -1 if null
  685.   if (intervals)
  686.   { // Use binary search to find interval
  687.     uint start,end;
  688.     start= 0;
  689.     end=   row->cols()-2;
  690.     while (start != end)
  691.     {
  692.       uint mid= (start + end + 1) / 2;
  693.       if (intervals[mid] <= value)
  694. start= mid;
  695.       else
  696. end= mid - 1;
  697.     }
  698.     return (value < intervals[start]) ? 0 : start + 1;
  699.   }
  700.   for (i=1 ; i < row->cols() ; i++)
  701.   {
  702.     if (row->el(i)->val() > value)
  703.       return i-1;
  704.   }
  705.   return i-1;
  706. }
  707. /*
  708.   Perform context analysis of a BETWEEN item tree
  709.   SYNOPSIS:
  710.     fix_fields()
  711.     thd     reference to the global context of the query thread
  712.     tables  list of all open tables involved in the query
  713.     ref     pointer to Item* variable where pointer to resulting "fixed"
  714.             item is to be assigned
  715.   DESCRIPTION
  716.     This function performs context analysis (name resolution) and calculates
  717.     various attributes of the item tree with Item_func_between as its root.
  718.     The function saves in ref the pointer to the item or to a newly created
  719.     item that is considered as a replacement for the original one.
  720.   NOTES
  721.     Let T0(e)/T1(e) be the value of not_null_tables(e) when e is used on
  722.     a predicate/function level. Then it's easy to show that:
  723.       T0(e BETWEEN e1 AND e2)     = union(T1(e),T1(e1),T1(e2))
  724.       T1(e BETWEEN e1 AND e2)     = union(T1(e),intersection(T1(e1),T1(e2)))
  725.       T0(e NOT BETWEEN e1 AND e2) = union(T1(e),intersection(T1(e1),T1(e2)))
  726.       T1(e NOT BETWEEN e1 AND e2) = union(T1(e),intersection(T1(e1),T1(e2)))
  727.   RETURN
  728.     0   ok
  729.     1   got error
  730. */
  731. bool Item_func_between::fix_fields(THD *thd, struct st_table_list *tables,
  732.                                    Item **ref)
  733. {
  734.   if (Item_func_opt_neg::fix_fields(thd, tables, ref))
  735.     return 1;
  736.   /* not_null_tables_cache == union(T1(e),T1(e1),T1(e2)) */
  737.   if (pred_level && !negated)
  738.     return 0;
  739.   /* not_null_tables_cache == union(T1(e), intersection(T1(e1),T1(e2))) */
  740.   not_null_tables_cache= (args[0]->not_null_tables() |
  741.                           (args[1]->not_null_tables() &
  742.                            args[2]->not_null_tables()));
  743.   return 0;
  744. }
  745. void Item_func_between::fix_length_and_dec()
  746. {
  747.    max_length= 1;
  748.    THD *thd= current_thd;
  749.   /*
  750.     As some compare functions are generated after sql_yacc,
  751.     we have to check for out of memory conditons here
  752.   */
  753.   if (!args[0] || !args[1] || !args[2])
  754.     return;
  755.   agg_cmp_type(&cmp_type, args, 3);
  756.   if (cmp_type == STRING_RESULT &&
  757.       agg_arg_charsets(cmp_collation, args, 3, MY_COLL_CMP_CONV))
  758.     return;
  759.   /*
  760.     Make a special case of compare with date/time and longlong fields.
  761.     They are compared as integers, so for const item this time-consuming
  762.     conversion can be done only once, not for every single comparison
  763.   */
  764.   if (args[0]->type() == FIELD_ITEM)
  765.   {
  766.     Field *field=((Item_field*) args[0])->field;
  767.     if (field->can_be_compared_as_longlong())
  768.     {
  769.       /*
  770.         The following can't be recoded with || as convert_constant_item
  771.         changes the argument
  772.       */
  773.       if (convert_constant_item(thd, field,&args[1]))
  774. cmp_type=INT_RESULT; // Works for all types.
  775.       if (convert_constant_item(thd, field,&args[2]))
  776. cmp_type=INT_RESULT; // Works for all types.
  777.     }
  778.   }
  779. }
  780. longlong Item_func_between::val_int()
  781. { // ANSI BETWEEN
  782.   DBUG_ASSERT(fixed == 1);
  783.   if (cmp_type == STRING_RESULT)
  784.   {
  785.     String *value,*a,*b;
  786.     value=args[0]->val_str(&value0);
  787.     if ((null_value=args[0]->null_value))
  788.       return 0;
  789.     a=args[1]->val_str(&value1);
  790.     b=args[2]->val_str(&value2);
  791.     if (!args[1]->null_value && !args[2]->null_value)
  792.       return (longlong) ((sortcmp(value,a,cmp_collation.collation) >= 0 &&
  793.                           sortcmp(value,b,cmp_collation.collation) <= 0) !=
  794.                          negated);
  795.     if (args[1]->null_value && args[2]->null_value)
  796.       null_value=1;
  797.     else if (args[1]->null_value)
  798.     {
  799.       // Set to not null if false range.
  800.       null_value= sortcmp(value,b,cmp_collation.collation) <= 0;
  801.     }
  802.     else
  803.     {
  804.       // Set to not null if false range.
  805.       null_value= sortcmp(value,a,cmp_collation.collation) >= 0;
  806.     }
  807.   }
  808.   else if (cmp_type == INT_RESULT)
  809.   {
  810.     longlong value=args[0]->val_int(),a,b;
  811.     if ((null_value=args[0]->null_value))
  812.       return 0; /* purecov: inspected */
  813.     a=args[1]->val_int();
  814.     b=args[2]->val_int();
  815.     if (!args[1]->null_value && !args[2]->null_value)
  816.       return (longlong) ((value >= a && value <= b) != negated);
  817.     if (args[1]->null_value && args[2]->null_value)
  818.       null_value=1;
  819.     else if (args[1]->null_value)
  820.     {
  821.       null_value= value <= b; // not null if false range.
  822.     }
  823.     else
  824.     {
  825.       null_value= value >= a;
  826.     }
  827.   }
  828.   else
  829.   {
  830.     double value=args[0]->val(),a,b;
  831.     if ((null_value=args[0]->null_value))
  832.       return 0; /* purecov: inspected */
  833.     a=args[1]->val();
  834.     b=args[2]->val();
  835.     if (!args[1]->null_value && !args[2]->null_value)
  836.       return (longlong) ((value >= a && value <= b) != negated);
  837.     if (args[1]->null_value && args[2]->null_value)
  838.       null_value=1;
  839.     else if (args[1]->null_value)
  840.     {
  841.       null_value= value <= b; // not null if false range.
  842.     }
  843.     else
  844.     {
  845.       null_value= value >= a;
  846.     }
  847.   }
  848.   return (longlong) (!null_value && negated);
  849. }
  850. void Item_func_between::print(String *str)
  851. {
  852.   str->append('(');
  853.   args[0]->print(str);
  854.   if (negated)
  855.     str->append(" not", 4);
  856.   str->append(" between ", 9);
  857.   args[1]->print(str);
  858.   str->append(" and ", 5);
  859.   args[2]->print(str);
  860.   str->append(')');
  861. }
  862. void
  863. Item_func_ifnull::fix_length_and_dec()
  864. {
  865.   maybe_null=args[1]->maybe_null;
  866.   max_length=max(args[0]->max_length,args[1]->max_length);
  867.   decimals=max(args[0]->decimals,args[1]->decimals);
  868.   agg_result_type(&cached_result_type, args, 2);
  869.   if (cached_result_type == STRING_RESULT)
  870.     agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV);
  871.   else if (cached_result_type != REAL_RESULT)
  872.     decimals= 0;
  873.   
  874.   cached_field_type= args[0]->field_type();
  875.   if (cached_field_type != args[1]->field_type())
  876.     cached_field_type= Item_func::field_type();
  877. }
  878. enum_field_types Item_func_ifnull::field_type() const 
  879. {
  880.   return cached_field_type;
  881. }
  882. Field *Item_func_ifnull::tmp_table_field(TABLE *table)
  883. {
  884.   return tmp_table_field_from_field_type(table);
  885. }
  886. double
  887. Item_func_ifnull::val()
  888. {
  889.   DBUG_ASSERT(fixed == 1);
  890.   double value=args[0]->val();
  891.   if (!args[0]->null_value)
  892.   {
  893.     null_value=0;
  894.     return value;
  895.   }
  896.   value=args[1]->val();
  897.   if ((null_value=args[1]->null_value))
  898.     return 0.0;
  899.   return value;
  900. }
  901. longlong
  902. Item_func_ifnull::val_int()
  903. {
  904.   DBUG_ASSERT(fixed == 1);
  905.   longlong value=args[0]->val_int();
  906.   if (!args[0]->null_value)
  907.   {
  908.     null_value=0;
  909.     return value;
  910.   }
  911.   value=args[1]->val_int();
  912.   if ((null_value=args[1]->null_value))
  913.     return 0;
  914.   return value;
  915. }
  916. String *
  917. Item_func_ifnull::val_str(String *str)
  918. {
  919.   DBUG_ASSERT(fixed == 1);
  920.   String *res  =args[0]->val_str(str);
  921.   if (!args[0]->null_value)
  922.   {
  923.     null_value=0;
  924.     res->set_charset(collation.collation);
  925.     return res;
  926.   }
  927.   res=args[1]->val_str(str);
  928.   if ((null_value=args[1]->null_value))
  929.     return 0;
  930.   res->set_charset(collation.collation);
  931.   return res;
  932. }
  933. /*
  934.   Perform context analysis of an IF item tree
  935.   SYNOPSIS:
  936.     fix_fields()
  937.     thd     reference to the global context of the query thread
  938.     tables  list of all open tables involved in the query
  939.     ref     pointer to Item* variable where pointer to resulting "fixed"
  940.             item is to be assigned
  941.   DESCRIPTION
  942.     This function performs context analysis (name resolution) and calculates
  943.     various attributes of the item tree with Item_func_if as its root.
  944.     The function saves in ref the pointer to the item or to a newly created
  945.     item that is considered as a replacement for the original one.
  946.   NOTES
  947.     Let T0(e)/T1(e) be the value of not_null_tables(e) when e is used on
  948.     a predicate/function level. Then it's easy to show that:
  949.       T0(IF(e,e1,e2)  = T1(IF(e,e1,e2))
  950.       T1(IF(e,e1,e2)) = intersection(T1(e1),T1(e2))
  951.   RETURN
  952.     0   ok
  953.     1   got error
  954. */
  955. bool
  956. Item_func_if::fix_fields(THD *thd, struct st_table_list *tlist, Item **ref)
  957. {
  958.   DBUG_ASSERT(fixed == 0);
  959.   args[0]->top_level_item();
  960.   if (Item_func::fix_fields(thd, tlist, ref))
  961.     return 1;
  962.   not_null_tables_cache= (args[1]->not_null_tables() &
  963.                           args[2]->not_null_tables());
  964.   return 0;
  965. }
  966. void
  967. Item_func_if::fix_length_and_dec()
  968. {
  969.   maybe_null=args[1]->maybe_null || args[2]->maybe_null;
  970.   max_length=max(args[1]->max_length,args[2]->max_length);
  971.   decimals=max(args[1]->decimals,args[2]->decimals);
  972.   enum Item_result arg1_type=args[1]->result_type();
  973.   enum Item_result arg2_type=args[2]->result_type();
  974.   bool null1=args[1]->const_item() && args[1]->null_value;
  975.   bool null2=args[2]->const_item() && args[2]->null_value;
  976.   if (null1)
  977.   {
  978.     cached_result_type= arg2_type;
  979.     collation.set(args[2]->collation.collation);
  980.   }
  981.   else if (null2)
  982.   {
  983.     cached_result_type= arg1_type;
  984.     collation.set(args[1]->collation.collation);
  985.   }
  986.   else
  987.   {
  988.     agg_result_type(&cached_result_type, args+1, 2);
  989.     if (cached_result_type == STRING_RESULT)
  990.     {
  991.       if (agg_arg_charsets(collation, args+1, 2, MY_COLL_ALLOW_CONV))
  992.       return;
  993.     }
  994.     else
  995.     {
  996.       collation.set(&my_charset_bin); // Number
  997.     }
  998.   }
  999. }
  1000. double
  1001. Item_func_if::val()
  1002. {
  1003.   DBUG_ASSERT(fixed == 1);
  1004.   Item *arg= args[0]->val_int() ? args[1] : args[2];
  1005.   double value=arg->val();
  1006.   null_value=arg->null_value;
  1007.   return value;
  1008. }
  1009. longlong
  1010. Item_func_if::val_int()
  1011. {
  1012.   DBUG_ASSERT(fixed == 1);
  1013.   Item *arg= args[0]->val_int() ? args[1] : args[2];
  1014.   longlong value=arg->val_int();
  1015.   null_value=arg->null_value;
  1016.   return value;
  1017. }
  1018. String *
  1019. Item_func_if::val_str(String *str)
  1020. {
  1021.   DBUG_ASSERT(fixed == 1);
  1022.   Item *arg= args[0]->val_int() ? args[1] : args[2];
  1023.   String *res=arg->val_str(str);
  1024.   if (res)
  1025.     res->set_charset(collation.collation);
  1026.   null_value=arg->null_value;
  1027.   return res;
  1028. }
  1029. void
  1030. Item_func_nullif::fix_length_and_dec()
  1031. {
  1032.   Item_bool_func2::fix_length_and_dec();
  1033.   maybe_null=1;
  1034.   if (args[0]) // Only false if EOM
  1035.   {
  1036.     max_length=args[0]->max_length;
  1037.     decimals=args[0]->decimals;
  1038.     agg_result_type(&cached_result_type, args, 2);
  1039.     if (cached_result_type == STRING_RESULT &&
  1040.         agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV))
  1041.       return;
  1042.   }
  1043. }
  1044. /*
  1045.   nullif () returns NULL if arguments are equal, else it returns the
  1046.   first argument.
  1047.   Note that we have to evaluate the first argument twice as the compare
  1048.   may have been done with a different type than return value
  1049. */
  1050. double
  1051. Item_func_nullif::val()
  1052. {
  1053.   DBUG_ASSERT(fixed == 1);
  1054.   double value;
  1055.   if (!cmp.compare())
  1056.   {
  1057.     null_value=1;
  1058.     return 0.0;
  1059.   }
  1060.   value=args[0]->val();
  1061.   null_value=args[0]->null_value;
  1062.   return value;
  1063. }
  1064. longlong
  1065. Item_func_nullif::val_int()
  1066. {
  1067.   DBUG_ASSERT(fixed == 1);
  1068.   longlong value;
  1069.   if (!cmp.compare())
  1070.   {
  1071.     null_value=1;
  1072.     return 0;
  1073.   }
  1074.   value=args[0]->val_int();
  1075.   null_value=args[0]->null_value;
  1076.   return value;
  1077. }
  1078. String *
  1079. Item_func_nullif::val_str(String *str)
  1080. {
  1081.   DBUG_ASSERT(fixed == 1);
  1082.   String *res;
  1083.   if (!cmp.compare())
  1084.   {
  1085.     null_value=1;
  1086.     return 0;
  1087.   }
  1088.   res=args[0]->val_str(str);
  1089.   null_value=args[0]->null_value;
  1090.   return res;
  1091. }
  1092. bool
  1093. Item_func_nullif::is_null()
  1094. {
  1095.   return (null_value= (!cmp.compare() ? 1 : args[0]->null_value)); 
  1096. }
  1097. /*
  1098.   CASE expression 
  1099.   Return the matching ITEM or NULL if all compares (including else) failed
  1100. */
  1101. Item *Item_func_case::find_item(String *str)
  1102. {
  1103.   String *first_expr_str,*tmp;
  1104.   longlong first_expr_int;
  1105.   double   first_expr_real;
  1106.   char buff[MAX_FIELD_WIDTH];
  1107.   String buff_str(buff,sizeof(buff),default_charset());
  1108.   
  1109.   /* These will be initialized later */
  1110.   LINT_INIT(first_expr_str);
  1111.   LINT_INIT(first_expr_int);
  1112.   LINT_INIT(first_expr_real);
  1113.   if (first_expr_num != -1)
  1114.   {
  1115.     switch (cmp_type)
  1116.     {
  1117.       case STRING_RESULT:
  1118.        // We can't use 'str' here as this may be overwritten
  1119. if (!(first_expr_str= args[first_expr_num]->val_str(&buff_str)))
  1120.   return else_expr_num != -1 ? args[else_expr_num] : 0; // Impossible
  1121.         break;
  1122.       case INT_RESULT:
  1123. first_expr_int= args[first_expr_num]->val_int();
  1124. if (args[first_expr_num]->null_value)
  1125.   return else_expr_num != -1 ? args[else_expr_num] : 0;
  1126. break;
  1127.       case REAL_RESULT:
  1128. first_expr_real= args[first_expr_num]->val();
  1129. if (args[first_expr_num]->null_value)
  1130.   return else_expr_num != -1 ? args[else_expr_num] : 0;
  1131. break;
  1132.       case ROW_RESULT:
  1133.       default:
  1134. // This case should never be choosen
  1135. DBUG_ASSERT(0);
  1136. break;
  1137.     }
  1138.   }
  1139.   // Compare every WHEN argument with it and return the first match
  1140.   for (uint i=0 ; i < ncases ; i+=2)
  1141.   {
  1142.     if (first_expr_num == -1)
  1143.     {
  1144.       // No expression between CASE and the first WHEN
  1145.       if (args[i]->val_int())
  1146. return args[i+1];
  1147.       continue;
  1148.     }
  1149.     switch (cmp_type) {
  1150.     case STRING_RESULT:
  1151.       if ((tmp=args[i]->val_str(str))) // If not null
  1152. if (sortcmp(tmp,first_expr_str,cmp_collation.collation)==0)
  1153.   return args[i+1];
  1154.       break;
  1155.     case INT_RESULT:
  1156.       if (args[i]->val_int()==first_expr_int && !args[i]->null_value) 
  1157.         return args[i+1];
  1158.       break;
  1159.     case REAL_RESULT: 
  1160.       if (args[i]->val()==first_expr_real && !args[i]->null_value) 
  1161.         return args[i+1];
  1162.       break;
  1163.     case ROW_RESULT:
  1164.     default:
  1165.       // This case should never be choosen
  1166.       DBUG_ASSERT(0);
  1167.       break;
  1168.     }
  1169.   }
  1170.   // No, WHEN clauses all missed, return ELSE expression
  1171.   return else_expr_num != -1 ? args[else_expr_num] : 0;
  1172. }
  1173. String *Item_func_case::val_str(String *str)
  1174. {
  1175.   DBUG_ASSERT(fixed == 1);
  1176.   String *res;
  1177.   Item *item=find_item(str);
  1178.   if (!item)
  1179.   {
  1180.     null_value=1;
  1181.     return 0;
  1182.   }
  1183.   null_value= 0;
  1184.   if (!(res=item->val_str(str)))
  1185.     null_value= 1;
  1186.   return res;
  1187. }
  1188. longlong Item_func_case::val_int()
  1189. {
  1190.   DBUG_ASSERT(fixed == 1);
  1191.   char buff[MAX_FIELD_WIDTH];
  1192.   String dummy_str(buff,sizeof(buff),default_charset());
  1193.   Item *item=find_item(&dummy_str);
  1194.   longlong res;
  1195.   if (!item)
  1196.   {
  1197.     null_value=1;
  1198.     return 0;
  1199.   }
  1200.   res=item->val_int();
  1201.   null_value=item->null_value;
  1202.   return res;
  1203. }
  1204. double Item_func_case::val()
  1205. {
  1206.   DBUG_ASSERT(fixed == 1);
  1207.   char buff[MAX_FIELD_WIDTH];
  1208.   String dummy_str(buff,sizeof(buff),default_charset());
  1209.   Item *item=find_item(&dummy_str);
  1210.   double res;
  1211.   if (!item)
  1212.   {
  1213.     null_value=1;
  1214.     return 0;
  1215.   }
  1216.   res=item->val();
  1217.   null_value=item->null_value;
  1218.   return res;
  1219. }
  1220. void Item_func_case::fix_length_and_dec()
  1221. {
  1222.   Item **agg;
  1223.   uint nagg;
  1224.   
  1225.   if (!(agg= (Item**) sql_alloc(sizeof(Item*)*(ncases+1))))
  1226.     return;
  1227.   
  1228.   // Aggregate all THEN and ELSE expression types
  1229.   // and collations when string result
  1230.   
  1231.   for (nagg= 0 ; nagg < ncases/2 ; nagg++)
  1232.     agg[nagg]= args[nagg*2+1];
  1233.   
  1234.   if (else_expr_num != -1)
  1235.     agg[nagg++]= args[else_expr_num];
  1236.   
  1237.   agg_result_type(&cached_result_type, agg, nagg);
  1238.   if ((cached_result_type == STRING_RESULT) &&
  1239.       agg_arg_charsets(collation, agg, nagg, MY_COLL_ALLOW_CONV))
  1240.     return;
  1241.   
  1242.   
  1243.   /*
  1244.     Aggregate first expression and all THEN expression types
  1245.     and collations when string comparison
  1246.   */
  1247.   if (first_expr_num != -1)
  1248.   {
  1249.     agg[0]= args[first_expr_num];
  1250.     for (nagg= 0; nagg < ncases/2 ; nagg++)
  1251.       agg[nagg+1]= args[nagg*2];
  1252.     nagg++;
  1253.     agg_cmp_type(&cmp_type, agg, nagg);
  1254.     if ((cmp_type == STRING_RESULT) &&
  1255.         agg_arg_charsets(cmp_collation, agg, nagg, MY_COLL_CMP_CONV))
  1256.     return;
  1257.   }
  1258.   
  1259.   if (else_expr_num == -1 || args[else_expr_num]->maybe_null)
  1260.     maybe_null=1;
  1261.   
  1262.   max_length=0;
  1263.   decimals=0;
  1264.   for (uint i=0 ; i < ncases ; i+=2)
  1265.   {
  1266.     set_if_bigger(max_length,args[i+1]->max_length);
  1267.     set_if_bigger(decimals,args[i+1]->decimals);
  1268.   }
  1269.   if (else_expr_num != -1) 
  1270.   {
  1271.     set_if_bigger(max_length,args[else_expr_num]->max_length);
  1272.     set_if_bigger(decimals,args[else_expr_num]->decimals);
  1273.   }
  1274. }
  1275. /* TODO:  Fix this so that it prints the whole CASE expression */
  1276. void Item_func_case::print(String *str)
  1277. {
  1278.   str->append("(case ", 6);
  1279.   if (first_expr_num != -1)
  1280.   {
  1281.     args[first_expr_num]->print(str);
  1282.     str->append(' ');
  1283.   }
  1284.   for (uint i=0 ; i < ncases ; i+=2)
  1285.   {
  1286.     str->append("when ", 5);
  1287.     args[i]->print(str);
  1288.     str->append(" then ", 6);
  1289.     args[i+1]->print(str);
  1290.     str->append(' ');
  1291.   }
  1292.   if (else_expr_num != -1)
  1293.   {
  1294.     str->append("else ", 5);
  1295.     args[else_expr_num]->print(str);
  1296.     str->append(' ');
  1297.   }
  1298.   str->append("end)", 4);
  1299. }
  1300. /*
  1301.   Coalesce - return first not NULL argument.
  1302. */
  1303. String *Item_func_coalesce::val_str(String *str)
  1304. {
  1305.   DBUG_ASSERT(fixed == 1);
  1306.   null_value=0;
  1307.   for (uint i=0 ; i < arg_count ; i++)
  1308.   {
  1309.     String *res;
  1310.     if ((res=args[i]->val_str(str)))
  1311.       return res;
  1312.   }
  1313.   null_value=1;
  1314.   return 0;
  1315. }
  1316. longlong Item_func_coalesce::val_int()
  1317. {
  1318.   DBUG_ASSERT(fixed == 1);
  1319.   null_value=0;
  1320.   for (uint i=0 ; i < arg_count ; i++)
  1321.   {
  1322.     longlong res=args[i]->val_int();
  1323.     if (!args[i]->null_value)
  1324.       return res;
  1325.   }
  1326.   null_value=1;
  1327.   return 0;
  1328. }
  1329. double Item_func_coalesce::val()
  1330. {
  1331.   DBUG_ASSERT(fixed == 1);
  1332.   null_value=0;
  1333.   for (uint i=0 ; i < arg_count ; i++)
  1334.   {
  1335.     double res=args[i]->val();
  1336.     if (!args[i]->null_value)
  1337.       return res;
  1338.   }
  1339.   null_value=1;
  1340.   return 0;
  1341. }
  1342. void Item_func_coalesce::fix_length_and_dec()
  1343. {
  1344.   max_length= 0;
  1345.   decimals= 0;
  1346.   agg_result_type(&cached_result_type, args, arg_count);
  1347.   for (uint i=0 ; i < arg_count ; i++)
  1348.   {
  1349.     set_if_bigger(max_length,args[i]->max_length);
  1350.     set_if_bigger(decimals,args[i]->decimals);
  1351.   }
  1352.   if (cached_result_type == STRING_RESULT)
  1353.     agg_arg_charsets(collation, args, arg_count, MY_COLL_ALLOW_CONV);
  1354.   else if (cached_result_type != REAL_RESULT)
  1355.     decimals= 0;
  1356. }
  1357. /****************************************************************************
  1358.  Classes and function for the IN operator
  1359. ****************************************************************************/
  1360. static int cmp_longlong(void *cmp_arg, longlong *a,longlong *b)
  1361. {
  1362.   return *a < *b ? -1 : *a == *b ? 0 : 1;
  1363. }
  1364. static int cmp_double(void *cmp_arg, double *a,double *b)
  1365. {
  1366.   return *a < *b ? -1 : *a == *b ? 0 : 1;
  1367. }
  1368. static int cmp_row(void *cmp_arg, cmp_item_row* a, cmp_item_row* b)
  1369. {
  1370.   return a->compare(b);
  1371. }
  1372. int in_vector::find(Item *item)
  1373. {
  1374.   byte *result=get_value(item);
  1375.   if (!result || !used_count)
  1376.     return 0; // Null value
  1377.   uint start,end;
  1378.   start=0; end=used_count-1;
  1379.   while (start != end)
  1380.   {
  1381.     uint mid=(start+end+1)/2;
  1382.     int res;
  1383.     if ((res=(*compare)(collation, base+mid*size, result)) == 0)
  1384.       return 1;
  1385.     if (res < 0)
  1386.       start=mid;
  1387.     else
  1388.       end=mid-1;
  1389.   }
  1390.   return (int) ((*compare)(collation, base+start*size, result) == 0);
  1391. }
  1392. in_string::in_string(uint elements,qsort2_cmp cmp_func, CHARSET_INFO *cs)
  1393.   :in_vector(elements, sizeof(String), cmp_func, cs),
  1394.    tmp(buff, sizeof(buff), &my_charset_bin)
  1395. {}
  1396. in_string::~in_string()
  1397. {
  1398.   if (base)
  1399.   {
  1400.     // base was allocated with help of sql_alloc => following is OK
  1401.     for (uint i=0 ; i < count ; i++)
  1402.       ((String*) base)[i].free();
  1403.   }
  1404. }
  1405. void in_string::set(uint pos,Item *item)
  1406. {
  1407.   String *str=((String*) base)+pos;
  1408.   String *res=item->val_str(str);
  1409.   if (res && res != str)
  1410.   {
  1411.     if (res->uses_buffer_owned_by(str))
  1412.       res->copy();
  1413.     *str= *res;
  1414.   }
  1415.   if (!str->charset())
  1416.   {
  1417.     CHARSET_INFO *cs;
  1418.     if (!(cs= item->collation.collation))
  1419.       cs= &my_charset_bin; // Should never happen for STR items
  1420.     str->set_charset(cs);
  1421.   }
  1422. }
  1423. byte *in_string::get_value(Item *item)
  1424. {
  1425.   return (byte*) item->val_str(&tmp);
  1426. }
  1427. in_row::in_row(uint elements, Item * item)
  1428. {
  1429.   base= (char*) new cmp_item_row[count= elements];
  1430.   size= sizeof(cmp_item_row);
  1431.   compare= (qsort2_cmp) cmp_row;
  1432.   tmp.store_value(item);
  1433.   /*
  1434.     We need to reset these as otherwise we will call sort() with
  1435.     uninitialized (even if not used) elements
  1436.   */
  1437.   used_count= elements;
  1438.   collation= 0;
  1439. }
  1440. in_row::~in_row()
  1441. {
  1442.   if (base)
  1443.     delete [] (cmp_item_row*) base;
  1444. }
  1445. byte *in_row::get_value(Item *item)
  1446. {
  1447.   tmp.store_value(item);
  1448.   if (item->is_null())
  1449.     return 0;
  1450.   return (byte *)&tmp;
  1451. }
  1452. void in_row::set(uint pos, Item *item)
  1453. {
  1454.   DBUG_ENTER("in_row::set");
  1455.   DBUG_PRINT("enter", ("pos %u item 0x%lx", pos, (ulong) item));
  1456.   ((cmp_item_row*) base)[pos].store_value_by_template(&tmp, item);
  1457.   DBUG_VOID_RETURN;
  1458. }
  1459. in_longlong::in_longlong(uint elements)
  1460.   :in_vector(elements,sizeof(longlong),(qsort2_cmp) cmp_longlong, 0)
  1461. {}
  1462. void in_longlong::set(uint pos,Item *item)
  1463. {
  1464.   ((longlong*) base)[pos]=item->val_int();
  1465. }
  1466. byte *in_longlong::get_value(Item *item)
  1467. {
  1468.   tmp= item->val_int();
  1469.   if (item->null_value)
  1470.     return 0;
  1471.   return (byte*) &tmp;
  1472. }
  1473. in_double::in_double(uint elements)
  1474.   :in_vector(elements,sizeof(double),(qsort2_cmp) cmp_double, 0)
  1475. {}
  1476. void in_double::set(uint pos,Item *item)
  1477. {
  1478.   ((double*) base)[pos]=item->val();
  1479. }
  1480. byte *in_double::get_value(Item *item)
  1481. {
  1482.   tmp= item->val();
  1483.   if (item->null_value)
  1484.     return 0; /* purecov: inspected */
  1485.   return (byte*) &tmp;
  1486. }
  1487. cmp_item* cmp_item::get_comparator(Item *item)
  1488. {
  1489.   switch (item->result_type()) {
  1490.   case STRING_RESULT:
  1491.     return new cmp_item_sort_string(item->collation.collation);
  1492.   case INT_RESULT:
  1493.     return new cmp_item_int;
  1494.   case REAL_RESULT:
  1495.     return new cmp_item_real;
  1496.   case ROW_RESULT:
  1497.     return new cmp_item_row;
  1498.   default:
  1499.     DBUG_ASSERT(0);
  1500.     break;
  1501.   }
  1502.   return 0; // to satisfy compiler :)
  1503. }
  1504. cmp_item* cmp_item_sort_string::make_same()
  1505. {
  1506.   return new cmp_item_sort_string_in_static(cmp_charset);
  1507. }
  1508. cmp_item* cmp_item_int::make_same()
  1509. {
  1510.   return new cmp_item_int();
  1511. }
  1512. cmp_item* cmp_item_real::make_same()
  1513. {
  1514.   return new cmp_item_real();
  1515. }
  1516. cmp_item* cmp_item_row::make_same()
  1517. {
  1518.   return new cmp_item_row();
  1519. }
  1520. cmp_item_row::~cmp_item_row()
  1521. {
  1522.   DBUG_ENTER("~cmp_item_row");
  1523.   DBUG_PRINT("enter",("this: %lx", this));
  1524.   if (comparators)
  1525.   {
  1526.     for (uint i= 0; i < n; i++)
  1527.     {
  1528.       if (comparators[i])
  1529. delete comparators[i];
  1530.     }
  1531.   }
  1532.   DBUG_VOID_RETURN;
  1533. }
  1534. void cmp_item_row::store_value(Item *item)
  1535. {
  1536.   DBUG_ENTER("cmp_item_row::store_value");
  1537.   n= item->cols();
  1538.   if (!comparators)
  1539.     comparators= (cmp_item **) current_thd->calloc(sizeof(cmp_item *)*n);
  1540.   if (comparators)
  1541.   {
  1542.     item->bring_value();
  1543.     item->null_value= 0;
  1544.     for (uint i=0; i < n; i++)
  1545.     {
  1546.       if (!comparators[i])
  1547. if (!(comparators[i]= cmp_item::get_comparator(item->el(i))))
  1548.   break; // new failed
  1549.       comparators[i]->store_value(item->el(i));
  1550.       item->null_value|= item->el(i)->null_value;
  1551.     }
  1552.   }
  1553.   DBUG_VOID_RETURN;
  1554. }
  1555. void cmp_item_row::store_value_by_template(cmp_item *t, Item *item)
  1556. {
  1557.   cmp_item_row *tmpl= (cmp_item_row*) t;
  1558.   if (tmpl->n != item->cols())
  1559.   {
  1560.     my_error(ER_OPERAND_COLUMNS, MYF(0), tmpl->n);
  1561.     return;
  1562.   }
  1563.   n= tmpl->n;
  1564.   if ((comparators= (cmp_item **) sql_alloc(sizeof(cmp_item *)*n)))
  1565.   {
  1566.     item->bring_value();
  1567.     item->null_value= 0;
  1568.     for (uint i=0; i < n; i++)
  1569.     {
  1570.       if (!(comparators[i]= tmpl->comparators[i]->make_same()))
  1571. break; // new failed
  1572.       comparators[i]->store_value_by_template(tmpl->comparators[i],
  1573.       item->el(i));
  1574.       item->null_value|= item->el(i)->null_value;
  1575.     }
  1576.   }
  1577. }
  1578. int cmp_item_row::cmp(Item *arg)
  1579. {
  1580.   arg->null_value= 0;
  1581.   if (arg->cols() != n)
  1582.   {
  1583.     my_error(ER_OPERAND_COLUMNS, MYF(0), n);
  1584.     return 1;
  1585.   }
  1586.   bool was_null= 0;
  1587.   arg->bring_value();
  1588.   for (uint i=0; i < n; i++)
  1589.   {
  1590.     if (comparators[i]->cmp(arg->el(i)))
  1591.     {
  1592.       if (!arg->el(i)->null_value)
  1593. return 1;
  1594.       was_null= 1;
  1595.     }
  1596.   }
  1597.   return (arg->null_value= was_null);
  1598. }
  1599. int cmp_item_row::compare(cmp_item *c)
  1600. {
  1601.   cmp_item_row *cmp= (cmp_item_row *) c;
  1602.   for (uint i=0; i < n; i++)
  1603.   {
  1604.     int res;
  1605.     if ((res= comparators[i]->compare(cmp->comparators[i])))
  1606.       return res;
  1607.   }
  1608.   return 0;
  1609. }
  1610. bool Item_func_in::nulls_in_row()
  1611. {
  1612.   Item **arg,**arg_end;
  1613.   for (arg= args+1, arg_end= args+arg_count; arg != arg_end ; arg++)
  1614.   {
  1615.     if ((*arg)->null_inside())
  1616.       return 1;
  1617.   }
  1618.   return 0;
  1619. }
  1620. /*
  1621.   Perform context analysis of an IN item tree
  1622.   SYNOPSIS:
  1623.     fix_fields()
  1624.     thd     reference to the global context of the query thread
  1625.     tables  list of all open tables involved in the query
  1626.     ref     pointer to Item* variable where pointer to resulting "fixed"
  1627.             item is to be assigned
  1628.   DESCRIPTION
  1629.     This function performs context analysis (name resolution) and calculates
  1630.     various attributes of the item tree with Item_func_in as its root.
  1631.     The function saves in ref the pointer to the item or to a newly created
  1632.     item that is considered as a replacement for the original one.
  1633.   NOTES
  1634.     Let T0(e)/T1(e) be the value of not_null_tables(e) when e is used on
  1635.     a predicate/function level. Then it's easy to show that:
  1636.       T0(e IN(e1,...,en))     = union(T1(e),intersection(T1(ei)))
  1637.       T1(e IN(e1,...,en))     = union(T1(e),intersection(T1(ei)))
  1638.       T0(e NOT IN(e1,...,en)) = union(T1(e),union(T1(ei)))
  1639.       T1(e NOT IN(e1,...,en)) = union(T1(e),intersection(T1(ei)))
  1640.   RETURN
  1641.     0   ok
  1642.     1   got error
  1643. */
  1644. bool
  1645. Item_func_in::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
  1646. {
  1647.   Item **arg, **arg_end;
  1648.   if (Item_func_opt_neg::fix_fields(thd, tables, ref))
  1649.     return 1;
  1650.   /* not_null_tables_cache == union(T1(e),union(T1(ei))) */
  1651.   if (pred_level && negated)
  1652.     return 0;
  1653.   /* not_null_tables_cache = union(T1(e),intersection(T1(ei))) */
  1654.   not_null_tables_cache= ~(table_map) 0;
  1655.   for (arg= args + 1, arg_end= args + arg_count; arg != arg_end; arg++)
  1656.     not_null_tables_cache&= (*arg)->not_null_tables();
  1657.   not_null_tables_cache|= (*args)->not_null_tables();
  1658.   return 0;
  1659. }
  1660. static int srtcmp_in(CHARSET_INFO *cs, const String *x,const String *y)
  1661. {
  1662.   return cs->coll->strnncollsp(cs,
  1663.                                (uchar *) x->ptr(),x->length(),
  1664.                                (uchar *) y->ptr(),y->length());
  1665. }
  1666. void Item_func_in::fix_length_and_dec()
  1667. {
  1668.   Item **arg, **arg_end;
  1669.   uint const_itm= 1;
  1670.   THD *thd= current_thd;
  1671.   
  1672.   agg_cmp_type(&cmp_type, args, arg_count);
  1673.   if (cmp_type == STRING_RESULT &&
  1674.       agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV))
  1675.     return;
  1676.   for (arg=args+1, arg_end=args+arg_count; arg != arg_end ; arg++)
  1677.     const_itm&= arg[0]->const_item();
  1678.   /*
  1679.     Row item with NULLs inside can return NULL or FALSE => 
  1680.     they can't be processed as static
  1681.   */
  1682.   if (const_itm && !nulls_in_row())
  1683.   {
  1684.     switch (cmp_type) {
  1685.     case STRING_RESULT:
  1686.       array=new in_string(arg_count-1,(qsort2_cmp) srtcmp_in, 
  1687.   cmp_collation.collation);
  1688.       break;
  1689.     case INT_RESULT:
  1690.       array= new in_longlong(arg_count-1);
  1691.       break;
  1692.     case REAL_RESULT:
  1693.       array= new in_double(arg_count-1);
  1694.       break;
  1695.     case ROW_RESULT:
  1696.       array= new in_row(arg_count-1, args[0]);
  1697.       break;
  1698.     default:
  1699.       DBUG_ASSERT(0);
  1700.       return;
  1701.     }
  1702.     if (array && !(thd->is_fatal_error)) // If not EOM
  1703.     {
  1704.       uint j=0;
  1705.       for (uint i=1 ; i < arg_count ; i++)
  1706.       {
  1707. array->set(j,args[i]);
  1708. if (!args[i]->null_value) // Skip NULL values
  1709.   j++;
  1710. else
  1711.   have_null= 1;
  1712.       }
  1713.       if ((array->used_count=j))
  1714. array->sort();
  1715.     }
  1716.   }
  1717.   else
  1718.   {
  1719.     in_item= cmp_item::get_comparator(args[0]);
  1720.     if (cmp_type  == STRING_RESULT)
  1721.       in_item->cmp_charset= cmp_collation.collation;
  1722.   }
  1723.   maybe_null= args[0]->maybe_null;
  1724.   max_length= 1;
  1725. }
  1726. void Item_func_in::print(String *str)
  1727. {
  1728.   str->append('(');
  1729.   args[0]->print(str);
  1730.   if (negated)
  1731.     str->append(" not", 4);
  1732.   str->append(" in (", 5);
  1733.   print_args(str, 1);
  1734.   str->append("))", 2);
  1735. }
  1736. longlong Item_func_in::val_int()
  1737. {
  1738.   DBUG_ASSERT(fixed == 1);
  1739.   if (array)
  1740.   {
  1741.     int tmp=array->find(args[0]);
  1742.     null_value=args[0]->null_value || (!tmp && have_null);
  1743.     return (longlong) (!null_value && tmp != negated);
  1744.   }
  1745.   in_item->store_value(args[0]);
  1746.   if ((null_value=args[0]->null_value))
  1747.     return 0;
  1748.   have_null= 0;
  1749.   for (uint i=1 ; i < arg_count ; i++)
  1750.   {
  1751.     if (!in_item->cmp(args[i]) && !args[i]->null_value)
  1752.       return (longlong) (!negated);
  1753.     have_null|= args[i]->null_value;
  1754.   }
  1755.   null_value= have_null;
  1756.   return (longlong) (!null_value && negated);
  1757. }
  1758. longlong Item_func_bit_or::val_int()
  1759. {
  1760.   DBUG_ASSERT(fixed == 1);
  1761.   ulonglong arg1= (ulonglong) args[0]->val_int();
  1762.   if (args[0]->null_value)
  1763.   {
  1764.     null_value=1; /* purecov: inspected */
  1765.     return 0; /* purecov: inspected */
  1766.   }
  1767.   ulonglong arg2= (ulonglong) args[1]->val_int();
  1768.   if (args[1]->null_value)
  1769.   {
  1770.     null_value=1;
  1771.     return 0;
  1772.   }
  1773.   null_value=0;
  1774.   return (longlong) (arg1 | arg2);
  1775. }
  1776. longlong Item_func_bit_and::val_int()
  1777. {
  1778.   DBUG_ASSERT(fixed == 1);
  1779.   ulonglong arg1= (ulonglong) args[0]->val_int();
  1780.   if (args[0]->null_value)
  1781.   {
  1782.     null_value=1; /* purecov: inspected */
  1783.     return 0; /* purecov: inspected */
  1784.   }
  1785.   ulonglong arg2= (ulonglong) args[1]->val_int();
  1786.   if (args[1]->null_value)
  1787.   {
  1788.     null_value=1; /* purecov: inspected */
  1789.     return 0; /* purecov: inspected */
  1790.   }
  1791.   null_value=0;
  1792.   return (longlong) (arg1 & arg2);
  1793. }
  1794. Item_cond::Item_cond(THD *thd, Item_cond *item)
  1795.   :Item_bool_func(thd, item),
  1796.    abort_on_null(item->abort_on_null),
  1797.    and_tables_cache(item->and_tables_cache)
  1798. {
  1799.   /*
  1800.     item->list will be copied by copy_andor_arguments() call
  1801.   */
  1802. }
  1803. void Item_cond::copy_andor_arguments(THD *thd, Item_cond *item)
  1804. {
  1805.   List_iterator_fast<Item> li(item->list);
  1806.   while (Item *it= li++)
  1807.     list.push_back(it->copy_andor_structure(thd));
  1808. }
  1809. bool
  1810. Item_cond::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
  1811. {
  1812.   DBUG_ASSERT(fixed == 0);
  1813.   List_iterator<Item> li(list);
  1814.   Item *item;
  1815. #ifndef EMBEDDED_LIBRARY
  1816.   char buff[sizeof(char*)]; // Max local vars in function
  1817. #endif
  1818.   not_null_tables_cache= used_tables_cache= 0;
  1819.   const_item_cache= 0;
  1820.   /*
  1821.     and_table_cache is the value that Item_cond_or() returns for
  1822.     not_null_tables()
  1823.   */
  1824.   and_tables_cache= ~(table_map) 0;
  1825.   if (check_stack_overrun(thd, buff))
  1826.     return 1; // Fatal error flag is set!
  1827.   while ((item=li++))
  1828.   {
  1829.     table_map tmp_table_map;
  1830.     while (item->type() == Item::COND_ITEM &&
  1831.    ((Item_cond*) item)->functype() == functype())
  1832.     { // Identical function
  1833.       li.replace(((Item_cond*) item)->list);
  1834.       ((Item_cond*) item)->list.empty();
  1835.       item= *li.ref(); // new current item
  1836.     }
  1837.     if (abort_on_null)
  1838.       item->top_level_item();
  1839.     // item can be substituted in fix_fields
  1840.     if ((!item->fixed &&
  1841.  item->fix_fields(thd, tables, li.ref())) ||
  1842. (item= *li.ref())->check_cols(1))
  1843.       return 1; /* purecov: inspected */
  1844.     used_tables_cache|=     item->used_tables();
  1845.     tmp_table_map=     item->not_null_tables();
  1846.     not_null_tables_cache|= tmp_table_map;
  1847.     and_tables_cache&=      tmp_table_map;
  1848.     const_item_cache&=     item->const_item();
  1849.     with_sum_func=     with_sum_func || item->with_sum_func;
  1850.     if (item->maybe_null)
  1851.       maybe_null=1;
  1852.   }
  1853.   thd->lex->current_select->cond_count+= list.elements;
  1854.   fix_length_and_dec();
  1855.   fixed= 1;
  1856.   return 0;
  1857. }
  1858. bool Item_cond::walk(Item_processor processor, byte *arg)
  1859. {
  1860.   List_iterator_fast<Item> li(list);
  1861.   Item *item;
  1862.   while ((item= li++))
  1863.     if (item->walk(processor, arg))
  1864.       return 1;
  1865.   return Item_func::walk(processor, arg);
  1866. }
  1867. /*
  1868.   Move SUM items out from item tree and replace with reference
  1869.   SYNOPSIS
  1870.     split_sum_func()
  1871.     thd Thread handler
  1872.     ref_pointer_array Pointer to array of reference fields
  1873.     fields All fields in select
  1874.   NOTES
  1875.    This function is run on all expression (SELECT list, WHERE, HAVING etc)
  1876.    that have or refer (HAVING) to a SUM expression.
  1877.    The split is done to get an unique item for each SUM function
  1878.    so that we can easily find and calculate them.
  1879.    (Calculation done by update_sum_func() and copy_sum_funcs() in
  1880.    sql_select.cc)
  1881. */
  1882. void Item_cond::split_sum_func(THD *thd, Item **ref_pointer_array,
  1883.                                List<Item> &fields)
  1884. {
  1885.   List_iterator<Item> li(list);
  1886.   Item *item;
  1887.   while ((item= li++))
  1888.     item->split_sum_func2(thd, ref_pointer_array, fields, li.ref());
  1889. }
  1890. table_map
  1891. Item_cond::used_tables() const
  1892. { // This caches used_tables
  1893.   return used_tables_cache;
  1894. }
  1895. void Item_cond::update_used_tables()
  1896. {
  1897.   List_iterator_fast<Item> li(list);
  1898.   Item *item;
  1899.   used_tables_cache=0;
  1900.   const_item_cache=1;
  1901.   while ((item=li++))
  1902.   {
  1903.     item->update_used_tables();
  1904.     used_tables_cache|= item->used_tables();
  1905.     const_item_cache&=  item->const_item();
  1906.   }
  1907. }
  1908. void Item_cond::print(String *str)
  1909. {
  1910.   str->append('(');
  1911.   List_iterator_fast<Item> li(list);
  1912.   Item *item;
  1913.   if ((item=li++))
  1914.     item->print(str);
  1915.   while ((item=li++))
  1916.   {
  1917.     str->append(' ');
  1918.     str->append(func_name());
  1919.     str->append(' ');
  1920.     item->print(str);
  1921.   }
  1922.   str->append(')');
  1923. }
  1924. void Item_cond::neg_arguments(THD *thd)
  1925. {
  1926.   List_iterator<Item> li(list);
  1927.   Item *item;
  1928.   while ((item= li++)) /* Apply not transformation to the arguments */
  1929.   {
  1930.     Item *new_item= item->neg_transformer(thd);
  1931.     if (!new_item)
  1932.     {
  1933.       if (!(new_item= new Item_func_not(item)))
  1934. return; // Fatal OEM error
  1935.     }
  1936.     VOID(li.replace(new_item));
  1937.   }
  1938. }
  1939. /*
  1940.   Evalution of AND(expr, expr, expr ...)
  1941.   NOTES:
  1942.     abort_if_null is set for AND expressions for which we don't care if the
  1943.     result is NULL or 0. This is set for:
  1944.     - WHERE clause
  1945.     - HAVING clause
  1946.     - IF(expression)
  1947.   RETURN VALUES
  1948.     1  If all expressions are true
  1949.     0  If all expressions are false or if we find a NULL expression and
  1950.        'abort_on_null' is set.
  1951.     NULL if all expression are either 1 or NULL
  1952. */
  1953. longlong Item_cond_and::val_int()
  1954. {
  1955.   DBUG_ASSERT(fixed == 1);
  1956.   List_iterator_fast<Item> li(list);
  1957.   Item *item;
  1958.   null_value= 0;
  1959.   while ((item=li++))
  1960.   {
  1961.     if (item->val_int() == 0)
  1962.     {
  1963.       if (abort_on_null || !(null_value= item->null_value))
  1964. return 0; // return FALSE
  1965.     }
  1966.   }
  1967.   return null_value ? 0 : 1;
  1968. }
  1969. longlong Item_cond_or::val_int()
  1970. {
  1971.   DBUG_ASSERT(fixed == 1);
  1972.   List_iterator_fast<Item> li(list);
  1973.   Item *item;
  1974.   null_value=0;
  1975.   while ((item=li++))
  1976.   {
  1977.     if (item->val_int() != 0)
  1978.     {
  1979.       null_value=0;
  1980.       return 1;
  1981.     }
  1982.     if (item->null_value)
  1983.       null_value=1;
  1984.   }
  1985.   return 0;
  1986. }
  1987. /*
  1988.   Create an AND expression from two expressions
  1989.   SYNOPSIS
  1990.    and_expressions()
  1991.    a expression or NULL
  1992.    b     expression.
  1993.    org_item Don't modify a if a == *org_item
  1994. If a == NULL, org_item is set to point at b,
  1995. to ensure that future calls will not modify b.
  1996.   NOTES
  1997.     This will not modify item pointed to by org_item or b
  1998.     The idea is that one can call this in a loop and create and
  1999.     'and' over all items without modifying any of the original items.
  2000.   RETURN
  2001.     NULL Error
  2002.     Item
  2003. */
  2004. Item *and_expressions(Item *a, Item *b, Item **org_item)
  2005. {
  2006.   if (!a)
  2007.     return (*org_item= (Item*) b);
  2008.   if (a == *org_item)
  2009.   {
  2010.     Item_cond *res;
  2011.     if ((res= new Item_cond_and(a, (Item*) b)))
  2012.     {
  2013.       res->used_tables_cache= a->used_tables() | b->used_tables();
  2014.       res->not_null_tables_cache= a->not_null_tables() | b->not_null_tables();
  2015.     }
  2016.     return res;
  2017.   }
  2018.   if (((Item_cond_and*) a)->add((Item*) b))
  2019.     return 0;
  2020.   ((Item_cond_and*) a)->used_tables_cache|= b->used_tables();
  2021.   ((Item_cond_and*) a)->not_null_tables_cache|= b->not_null_tables();
  2022.   return a;
  2023. }
  2024. longlong Item_func_isnull::val_int()
  2025. {
  2026.   DBUG_ASSERT(fixed == 1);
  2027.   /*
  2028.     Handle optimization if the argument can't be null
  2029.     This has to be here because of the test in update_used_tables().
  2030.   */
  2031.   if (!used_tables_cache)
  2032.     return cached_value;
  2033.   return args[0]->is_null() ? 1: 0;
  2034. }
  2035. longlong Item_is_not_null_test::val_int()
  2036. {
  2037.   DBUG_ASSERT(fixed == 1);
  2038.   DBUG_ENTER("Item_is_not_null_test::val_int");
  2039.   if (!used_tables_cache)
  2040.   {
  2041.     owner->was_null|= (!cached_value);
  2042.     DBUG_PRINT("info", ("cached :%d", cached_value));
  2043.     DBUG_RETURN(cached_value);
  2044.   }
  2045.   if (args[0]->is_null())
  2046.   {
  2047.     DBUG_PRINT("info", ("null"))
  2048.     owner->was_null|= 1;
  2049.     DBUG_RETURN(0);
  2050.   }
  2051.   else
  2052.     DBUG_RETURN(1);
  2053. }
  2054. /* Optimize case of not_null_column IS NULL */
  2055. void Item_is_not_null_test::update_used_tables()
  2056. {
  2057.   if (!args[0]->maybe_null)
  2058.   {
  2059.     used_tables_cache= 0; /* is always true */
  2060.     cached_value= (longlong) 1;
  2061.   }
  2062.   else
  2063.   {
  2064.     args[0]->update_used_tables();
  2065.     if (!(used_tables_cache=args[0]->used_tables()))
  2066.     {
  2067.       /* Remember if the value is always NULL or never NULL */
  2068.       cached_value= (longlong) !args[0]->is_null();
  2069.     }
  2070.   }
  2071. }
  2072. longlong Item_func_isnotnull::val_int()
  2073. {
  2074.   DBUG_ASSERT(fixed == 1);
  2075.   return args[0]->is_null() ? 0 : 1;
  2076. }
  2077. void Item_func_isnotnull::print(String *str)
  2078. {
  2079.   str->append('(');
  2080.   args[0]->print(str);
  2081.   str->append(" is not null)", 13);
  2082. }
  2083. longlong Item_func_like::val_int()
  2084. {
  2085.   DBUG_ASSERT(fixed == 1);
  2086.   String* res = args[0]->val_str(&tmp_value1);
  2087.   if (args[0]->null_value)
  2088.   {
  2089.     null_value=1;
  2090.     return 0;
  2091.   }
  2092.   String* res2 = args[1]->val_str(&tmp_value2);
  2093.   if (args[1]->null_value)
  2094.   {
  2095.     null_value=1;
  2096.     return 0;
  2097.   }
  2098.   null_value=0;
  2099.   if (canDoTurboBM)
  2100.     return turboBM_matches(res->ptr(), res->length()) ? 1 : 0;
  2101.   return my_wildcmp(cmp.cmp_collation.collation,
  2102.     res->ptr(),res->ptr()+res->length(),
  2103.     res2->ptr(),res2->ptr()+res2->length(),
  2104.     escape,wild_one,wild_many) ? 0 : 1;
  2105. }
  2106. /* We can optimize a where if first character isn't a wildcard */
  2107. Item_func::optimize_type Item_func_like::select_optimize() const
  2108. {
  2109.   if (args[1]->const_item())
  2110.   {
  2111.     String* res2= args[1]->val_str((String *)&tmp_value2);
  2112.     if (!res2)
  2113.       return OPTIMIZE_NONE;
  2114.     if (*res2->ptr() != wild_many)
  2115.     {
  2116.       if (args[0]->result_type() != STRING_RESULT || *res2->ptr() != wild_one)
  2117. return OPTIMIZE_OP;
  2118.     }
  2119.   }
  2120.   return OPTIMIZE_NONE;
  2121. }
  2122. bool Item_func_like::fix_fields(THD *thd, TABLE_LIST *tlist, Item ** ref)
  2123. {
  2124.   DBUG_ASSERT(fixed == 0);
  2125.   if (Item_bool_func2::fix_fields(thd, tlist, ref) ||
  2126.       escape_item->fix_fields(thd, tlist, &escape_item))
  2127.     return 1;
  2128.   if (!escape_item->const_during_execution())
  2129.   {
  2130.     my_error(ER_WRONG_ARGUMENTS,MYF(0),"ESCAPE");
  2131.     return 1;
  2132.   }
  2133.   
  2134.   if (escape_item->const_item())
  2135.   {
  2136.     /* If we are on execution stage */
  2137.     String *escape_str= escape_item->val_str(&tmp_value1);
  2138.     if (escape_str)
  2139.     {
  2140.       if (use_mb(cmp.cmp_collation.collation))
  2141.       {
  2142.         CHARSET_INFO *cs= escape_str->charset();
  2143.         my_wc_t wc;
  2144.         int rc= cs->cset->mb_wc(cs, &wc,
  2145.                                 (const uchar*) escape_str->ptr(),
  2146.                                 (const uchar*) escape_str->ptr() +
  2147.                                                escape_str->length());
  2148.         escape= (int) (rc > 0 ? wc : '\');
  2149.       }
  2150.       else
  2151.       {
  2152.         /*
  2153.           In the case of 8bit character set, we pass native
  2154.           code instead of Unicode code as "escape" argument.
  2155.           Convert to "cs" if charset of escape differs.
  2156.         */
  2157.         CHARSET_INFO *cs= cmp.cmp_collation.collation;
  2158.         uint32 unused;
  2159.         if (escape_str->needs_conversion(escape_str->length(),
  2160.                                          escape_str->charset(), cs, &unused))
  2161.         {
  2162.           char ch;
  2163.           uint errors;
  2164.           uint32 cnvlen= copy_and_convert(&ch, 1, cs, escape_str->ptr(),
  2165.                                           escape_str->length(),
  2166.                                           escape_str->charset(), &errors);
  2167.           escape= cnvlen ? ch : '\';
  2168.         }
  2169.         else
  2170.           escape= *(escape_str->ptr());
  2171.       }
  2172.     }
  2173.     else
  2174.       escape= '\';
  2175.  
  2176.     /*
  2177.       We could also do boyer-more for non-const items, but as we would have to
  2178.       recompute the tables for each row it's not worth it.
  2179.     */
  2180.     if (args[1]->const_item() && !use_strnxfrm(collation.collation) &&
  2181.        !(specialflag & SPECIAL_NO_NEW_FUNC))
  2182.     {
  2183.       String* res2 = args[1]->val_str(&tmp_value2);
  2184.       if (!res2)
  2185.         return 0; // Null argument
  2186.       
  2187.       const size_t len   = res2->length();
  2188.       const char*  first = res2->ptr();
  2189.       const char*  last  = first + len - 1;
  2190.       /*
  2191.         len must be > 2 ('%pattern%')
  2192.         heuristic: only do TurboBM for pattern_len > 2
  2193.       */
  2194.       
  2195.       if (len > MIN_TURBOBM_PATTERN_LEN + 2 &&
  2196.           *first == wild_many &&
  2197.           *last  == wild_many)
  2198.       {
  2199.         const char* tmp = first + 1;
  2200.         for (; *tmp != wild_many && *tmp != wild_one && *tmp != escape; tmp++) ;
  2201.         canDoTurboBM = (tmp == last) && !use_mb(args[0]->collation.collation);
  2202.       }
  2203.       if (canDoTurboBM)
  2204.       {
  2205.         pattern     = first + 1;
  2206.         pattern_len = len - 2;
  2207.         DBUG_PRINT("info", ("Initializing pattern: '%s'", first));
  2208.         int *suff = (int*) thd->alloc(sizeof(int)*((pattern_len + 1)*2+
  2209.                                       alphabet_size));
  2210.         bmGs      = suff + pattern_len + 1;
  2211.         bmBc      = bmGs + pattern_len + 1;
  2212.         turboBM_compute_good_suffix_shifts(suff);
  2213.         turboBM_compute_bad_character_shifts();
  2214.         DBUG_PRINT("info",("done"));
  2215.       }
  2216.     }
  2217.   }
  2218.   return 0;
  2219. }
  2220. #ifdef USE_REGEX
  2221. bool
  2222. Item_func_regex::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
  2223. {
  2224.   DBUG_ASSERT(fixed == 0);
  2225.   if ((!args[0]->fixed &&
  2226.        args[0]->fix_fields(thd, tables, args)) || args[0]->check_cols(1) ||
  2227.       (!args[1]->fixed && 
  2228.        args[1]->fix_fields(thd,tables, args + 1)) || args[1]->check_cols(1))
  2229.     return 1; /* purecov: inspected */
  2230.   with_sum_func=args[0]->with_sum_func || args[1]->with_sum_func;
  2231.   max_length= 1;
  2232.   decimals= 0;
  2233.   if (agg_arg_charsets(cmp_collation, args, 2, MY_COLL_CMP_CONV))
  2234.     return 1;
  2235.   used_tables_cache=args[0]->used_tables() | args[1]->used_tables();
  2236.   not_null_tables_cache= (args[0]->not_null_tables() |
  2237.   args[1]->not_null_tables());
  2238.   const_item_cache=args[0]->const_item() && args[1]->const_item();
  2239.   if (!regex_compiled && args[1]->const_item())
  2240.   {
  2241.     char buff[MAX_FIELD_WIDTH];
  2242.     String tmp(buff,sizeof(buff),&my_charset_bin);
  2243.     String *res=args[1]->val_str(&tmp);
  2244.     if (args[1]->null_value)
  2245.     { // Will always return NULL
  2246.       maybe_null=1;
  2247.       return 0;
  2248.     }
  2249.     int error;
  2250.     if ((error= my_regcomp(&preg,res->c_ptr(),
  2251.                            ((cmp_collation.collation->state &
  2252.                              (MY_CS_BINSORT | MY_CS_CSSORT)) ?
  2253.                             REG_EXTENDED | REG_NOSUB :
  2254.                             REG_EXTENDED | REG_NOSUB | REG_ICASE),
  2255.                            cmp_collation.collation)))
  2256.     {
  2257.       (void) my_regerror(error,&preg,buff,sizeof(buff));
  2258.       my_printf_error(ER_REGEXP_ERROR,ER(ER_REGEXP_ERROR),MYF(0),buff);
  2259.       return 1;
  2260.     }
  2261.     regex_compiled=regex_is_const=1;
  2262.     maybe_null=args[0]->maybe_null;
  2263.   }
  2264.   else
  2265.     maybe_null=1;
  2266.   fixed= 1;
  2267.   return 0;
  2268. }
  2269. longlong Item_func_regex::val_int()
  2270. {
  2271.   DBUG_ASSERT(fixed == 1);
  2272.   char buff[MAX_FIELD_WIDTH];
  2273.   String *res, tmp(buff,sizeof(buff),&my_charset_bin);
  2274.   res=args[0]->val_str(&tmp);
  2275.   if (args[0]->null_value)
  2276.   {
  2277.     null_value=1;
  2278.     return 0;
  2279.   }
  2280.   if (!regex_is_const)
  2281.   {
  2282.     char buff2[MAX_FIELD_WIDTH];
  2283.     String *res2, tmp2(buff2,sizeof(buff2),&my_charset_bin);
  2284.     res2= args[1]->val_str(&tmp2);
  2285.     if (args[1]->null_value)
  2286.     {
  2287.       null_value=1;
  2288.       return 0;
  2289.     }
  2290.     if (!regex_compiled || stringcmp(res2,&prev_regexp))
  2291.     {
  2292.       prev_regexp.copy(*res2);
  2293.       if (regex_compiled)
  2294.       {
  2295. my_regfree(&preg);
  2296. regex_compiled=0;
  2297.       }
  2298.       if (my_regcomp(&preg,res2->c_ptr(),
  2299.                      ((cmp_collation.collation->state &
  2300.                        (MY_CS_BINSORT | MY_CS_CSSORT)) ?
  2301.                       REG_EXTENDED | REG_NOSUB :
  2302.                       REG_EXTENDED | REG_NOSUB | REG_ICASE),
  2303.                      cmp_collation.collation))
  2304.       {
  2305. null_value=1;
  2306. return 0;
  2307.       }
  2308.       regex_compiled=1;
  2309.     }
  2310.   }
  2311.   null_value=0;
  2312.   return my_regexec(&preg,res->c_ptr(),0,(my_regmatch_t*) 0,0) ? 0 : 1;
  2313. }
  2314. void Item_func_regex::cleanup()
  2315. {
  2316.   DBUG_ENTER("Item_func_regex::cleanup");
  2317.   Item_bool_func::cleanup();
  2318.   if (regex_compiled)
  2319.   {
  2320.     my_regfree(&preg);
  2321.     regex_compiled=0;
  2322.   }
  2323.   DBUG_VOID_RETURN;
  2324. }
  2325. #endif /* USE_REGEX */
  2326. #ifdef LIKE_CMP_TOUPPER
  2327. #define likeconv(cs,A) (uchar) (cs)->toupper(A)
  2328. #else
  2329. #define likeconv(cs,A) (uchar) (cs)->sort_order[(uchar) (A)]
  2330. #endif
  2331. /**********************************************************************
  2332.   turboBM_compute_suffixes()
  2333.   Precomputation dependent only on pattern_len.
  2334. **********************************************************************/
  2335. void Item_func_like::turboBM_compute_suffixes(int *suff)
  2336. {
  2337.   const int   plm1 = pattern_len - 1;
  2338.   int            f = 0;
  2339.   int            g = plm1;
  2340.   int *const splm1 = suff + plm1;
  2341.   CHARSET_INFO *cs= cmp.cmp_collation.collation;
  2342.   *splm1 = pattern_len;
  2343.   if (!cs->sort_order)
  2344.   {
  2345.     int i;
  2346.     for (i = pattern_len - 2; i >= 0; i--)
  2347.     {
  2348.       int tmp = *(splm1 + i - f);
  2349.       if (g < i && tmp < i - g)
  2350. suff[i] = tmp;
  2351.       else
  2352.       {
  2353. if (i < g)
  2354.   g = i; // g = min(i, g)
  2355. f = i;
  2356. while (g >= 0 && pattern[g] == pattern[g + plm1 - f])
  2357.   g--;
  2358. suff[i] = f - g;
  2359.       }
  2360.     }
  2361.   }
  2362.   else
  2363.   {
  2364.     int i;
  2365.     for (i = pattern_len - 2; 0 <= i; --i)
  2366.     {
  2367.       int tmp = *(splm1 + i - f);
  2368.       if (g < i && tmp < i - g)
  2369. suff[i] = tmp;
  2370.       else
  2371.       {
  2372. if (i < g)
  2373.   g = i; // g = min(i, g)
  2374. f = i;
  2375. while (g >= 0 &&
  2376.        likeconv(cs, pattern[g]) == likeconv(cs, pattern[g + plm1 - f]))
  2377.   g--;
  2378. suff[i] = f - g;
  2379.       }
  2380.     }
  2381.   }
  2382. }
  2383. /**********************************************************************
  2384.    turboBM_compute_good_suffix_shifts()
  2385.    Precomputation dependent only on pattern_len.
  2386. **********************************************************************/
  2387. void Item_func_like::turboBM_compute_good_suffix_shifts(int *suff)
  2388. {
  2389.   turboBM_compute_suffixes(suff);
  2390.   int *end = bmGs + pattern_len;
  2391.   int *k;
  2392.   for (k = bmGs; k < end; k++)
  2393.     *k = pattern_len;
  2394.   int tmp;
  2395.   int i;
  2396.   int j          = 0;
  2397.   const int plm1 = pattern_len - 1;
  2398.   for (i = plm1; i > -1; i--)
  2399.   {
  2400.     if (suff[i] == i + 1)
  2401.     {
  2402.       for (tmp = plm1 - i; j < tmp; j++)
  2403.       {
  2404. int *tmp2 = bmGs + j;
  2405. if (*tmp2 == pattern_len)
  2406.   *tmp2 = tmp;
  2407.       }
  2408.     }
  2409.   }
  2410.   int *tmp2;
  2411.   for (tmp = plm1 - i; j < tmp; j++)
  2412.   {
  2413.     tmp2 = bmGs + j;
  2414.     if (*tmp2 == pattern_len)
  2415.       *tmp2 = tmp;
  2416.   }
  2417.   tmp2 = bmGs + plm1;
  2418.   for (i = 0; i <= pattern_len - 2; i++)
  2419.     *(tmp2 - suff[i]) = plm1 - i;
  2420. }
  2421. /**********************************************************************
  2422.    turboBM_compute_bad_character_shifts()
  2423.    Precomputation dependent on pattern_len.
  2424. **********************************************************************/
  2425. void Item_func_like::turboBM_compute_bad_character_shifts()
  2426. {
  2427.   int *i;
  2428.   int *end = bmBc + alphabet_size;
  2429.   int j;
  2430.   const int plm1 = pattern_len - 1;
  2431.   CHARSET_INFO *cs= cmp.cmp_collation.collation;
  2432.   for (i = bmBc; i < end; i++)
  2433.     *i = pattern_len;
  2434.   if (!cs->sort_order)
  2435.   {
  2436.     for (j = 0; j < plm1; j++)
  2437.       bmBc[(uint) (uchar) pattern[j]] = plm1 - j;
  2438.   }
  2439.   else
  2440.   {
  2441.     for (j = 0; j < plm1; j++)
  2442.       bmBc[(uint) likeconv(cs,pattern[j])] = plm1 - j;
  2443.   }
  2444. }
  2445. /**********************************************************************
  2446.   turboBM_matches()
  2447.   Search for pattern in text, returns true/false for match/no match
  2448. **********************************************************************/
  2449. bool Item_func_like::turboBM_matches(const char* text, int text_len) const
  2450. {
  2451.   register int bcShift;
  2452.   register int turboShift;
  2453.   int shift = pattern_len;
  2454.   int j     = 0;
  2455.   int u     = 0;
  2456.   CHARSET_INFO *cs= cmp.cmp_collation.collation;
  2457.   const int plm1=  pattern_len - 1;
  2458.   const int tlmpl= text_len - pattern_len;
  2459.   /* Searching */
  2460.   if (!cs->sort_order)
  2461.   {
  2462.     while (j <= tlmpl)
  2463.     {
  2464.       register int i= plm1;
  2465.       while (i >= 0 && pattern[i] == text[i + j])
  2466.       {
  2467. i--;
  2468. if (i == plm1 - shift)
  2469.   i-= u;
  2470.       }
  2471.       if (i < 0)
  2472. return 1;
  2473.       register const int v = plm1 - i;
  2474.       turboShift = u - v;
  2475.       bcShift    = bmBc[(uint) (uchar) text[i + j]] - plm1 + i;
  2476.       shift      = max(turboShift, bcShift);
  2477.       shift      = max(shift, bmGs[i]);
  2478.       if (shift == bmGs[i])
  2479. u = min(pattern_len - shift, v);
  2480.       else
  2481.       {
  2482. if (turboShift < bcShift)
  2483.   shift = max(shift, u + 1);
  2484. u = 0;
  2485.       }
  2486.       j+= shift;
  2487.     }
  2488.     return 0;
  2489.   }
  2490.   else
  2491.   {
  2492.     while (j <= tlmpl)
  2493.     {
  2494.       register int i = plm1;
  2495.       while (i >= 0 && likeconv(cs,pattern[i]) == likeconv(cs,text[i + j]))
  2496.       {
  2497. i--;
  2498. if (i == plm1 - shift)
  2499.   i-= u;
  2500.       }
  2501.       if (i < 0)
  2502. return 1;
  2503.       register const int v = plm1 - i;
  2504.       turboShift = u - v;
  2505.       bcShift    = bmBc[(uint) likeconv(cs, text[i + j])] - plm1 + i;
  2506.       shift      = max(turboShift, bcShift);
  2507.       shift      = max(shift, bmGs[i]);
  2508.       if (shift == bmGs[i])
  2509. u = min(pattern_len - shift, v);
  2510.       else
  2511.       {
  2512. if (turboShift < bcShift)
  2513.   shift = max(shift, u + 1);
  2514. u = 0;
  2515.       }
  2516.       j+= shift;
  2517.     }
  2518.     return 0;
  2519.   }
  2520. }
  2521. /*
  2522.   Make a logical XOR of the arguments.
  2523.   SYNOPSIS
  2524.     val_int()
  2525.   DESCRIPTION
  2526.   If either operator is NULL, return NULL.
  2527.   NOTE
  2528.     As we don't do any index optimization on XOR this is not going to be
  2529.     very fast to use.
  2530.   TODO (low priority)
  2531.     Change this to be optimized as:
  2532.       A XOR B   ->  (A) == 1 AND (B) <> 1) OR (A <> 1 AND (B) == 1)
  2533.     To be able to do this, we would however first have to extend the MySQL
  2534.     range optimizer to handle OR better.
  2535. */
  2536. longlong Item_cond_xor::val_int()
  2537. {
  2538.   DBUG_ASSERT(fixed == 1);
  2539.   List_iterator<Item> li(list);
  2540.   Item *item;
  2541.   int result=0;
  2542.   null_value=0;
  2543.   while ((item=li++))
  2544.   {
  2545.     result^= (item->val_int() != 0);
  2546.     if (item->null_value)
  2547.     {
  2548.       null_value=1;
  2549.       return 0;
  2550.     }
  2551.   }
  2552.   return (longlong) result;
  2553. }
  2554. /*
  2555.   Apply NOT transformation to the item and return a new one.
  2556.   SYNPOSIS
  2557.     neg_transformer()
  2558.     thd thread handler
  2559.   DESCRIPTION
  2560.     Transform the item using next rules:
  2561.        a AND b AND ...    -> NOT(a) OR NOT(b) OR ...
  2562.        a OR b OR ...      -> NOT(a) AND NOT(b) AND ...
  2563.        NOT(a)             -> a
  2564.        a = b              -> a != b
  2565.        a != b             -> a = b
  2566.        a < b              -> a >= b
  2567.        a >= b             -> a < b
  2568.        a > b              -> a <= b
  2569.        a <= b             -> a > b
  2570.        IS NULL(a)         -> IS NOT NULL(a)
  2571.        IS NOT NULL(a)     -> IS NULL(a)
  2572.   RETURN
  2573.     New item or
  2574.     NULL if we cannot apply NOT transformation (see Item::neg_transformer()).
  2575. */
  2576. Item *Item_func_not::neg_transformer(THD *thd) /* NOT(x)  ->  x */
  2577. {
  2578.   return args[0];
  2579. }
  2580. Item *Item_bool_rowready_func2::neg_transformer(THD *thd)
  2581. {
  2582.   Item *item= negated_item();
  2583.   return item;
  2584. }
  2585. /* a IS NULL  ->  a IS NOT NULL */
  2586. Item *Item_func_isnull::neg_transformer(THD *thd)
  2587. {
  2588.   Item *item= new Item_func_isnotnull(args[0]);
  2589.   return item;
  2590. }
  2591. /* a IS NOT NULL  ->  a IS NULL */
  2592. Item *Item_func_isnotnull::neg_transformer(THD *thd)
  2593. {
  2594.   Item *item= new Item_func_isnull(args[0]);
  2595.   return item;
  2596. }
  2597. Item *Item_cond_and::neg_transformer(THD *thd) /* NOT(a AND b AND ...)  -> */
  2598. /* NOT a OR NOT b OR ... */
  2599. {
  2600.   neg_arguments(thd);
  2601.   Item *item= new Item_cond_or(list);
  2602.   return item;
  2603. }
  2604. Item *Item_cond_or::neg_transformer(THD *thd) /* NOT(a OR b OR ...)  -> */
  2605. /* NOT a AND NOT b AND ... */
  2606. {
  2607.   neg_arguments(thd);
  2608.   Item *item= new Item_cond_and(list);
  2609.   return item;
  2610. }
  2611. Item *Item_func_eq::negated_item() /* a = b  ->  a != b */
  2612. {
  2613.   return new Item_func_ne(args[0], args[1]);
  2614. }
  2615. Item *Item_func_ne::negated_item() /* a != b  ->  a = b */
  2616. {
  2617.   return new Item_func_eq(args[0], args[1]);
  2618. }
  2619. Item *Item_func_lt::negated_item() /* a < b  ->  a >= b */
  2620. {
  2621.   return new Item_func_ge(args[0], args[1]);
  2622. }
  2623. Item *Item_func_ge::negated_item() /* a >= b  ->  a < b */
  2624. {
  2625.   return new Item_func_lt(args[0], args[1]);
  2626. }
  2627. Item *Item_func_gt::negated_item() /* a > b  ->  a <= b */
  2628. {
  2629.   return new Item_func_le(args[0], args[1]);
  2630. }
  2631. Item *Item_func_le::negated_item() /* a <= b  ->  a > b */
  2632. {
  2633.   return new Item_func_gt(args[0], args[1]);
  2634. }
  2635. // just fake method, should never be called
  2636. Item *Item_bool_rowready_func2::negated_item()
  2637. {
  2638.   DBUG_ASSERT(0);
  2639.   return 0;
  2640. }