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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000-2003 MySQL 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. /* Sum functions (COUNT, MIN...) */
  14. #ifdef USE_PRAGMA_IMPLEMENTATION
  15. #pragma implementation // gcc: Class implementation
  16. #endif
  17. #include "mysql_priv.h"
  18. Item_sum::Item_sum(List<Item> &list)
  19.   :arg_count(list.elements)
  20. {
  21.   if ((args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
  22.   {
  23.     uint i=0;
  24.     List_iterator_fast<Item> li(list);
  25.     Item *item;
  26.     while ((item=li++))
  27.     {
  28.       args[i++]= item;
  29.     }
  30.   }
  31.   mark_as_sum_func();
  32.   list.empty(); // Fields are used
  33. }
  34. /*
  35.   Constructor used in processing select with temporary tebles
  36. */
  37. Item_sum::Item_sum(THD *thd, Item_sum *item):
  38.   Item_result_field(thd, item), arg_count(item->arg_count),
  39.   quick_group(item->quick_group)
  40. {
  41.   if (arg_count <= 2)
  42.     args=tmp_args;
  43.   else
  44.     if (!(args= (Item**) thd->alloc(sizeof(Item*)*arg_count)))
  45.       return;
  46.   memcpy(args, item->args, sizeof(Item*)*arg_count);
  47. }
  48. void Item_sum::mark_as_sum_func()
  49. {
  50.   current_thd->lex->current_select->with_sum_func= 1;
  51.   with_sum_func= 1;
  52. }
  53. void Item_sum::make_field(Send_field *tmp_field)
  54. {
  55.   if (args[0]->type() == Item::FIELD_ITEM && keep_field_type())
  56.   {
  57.     ((Item_field*) args[0])->field->make_field(tmp_field);
  58.     tmp_field->db_name=(char*)"";
  59.     tmp_field->org_table_name=tmp_field->table_name=(char*)"";
  60.     tmp_field->org_col_name=tmp_field->col_name=name;
  61.     if (maybe_null)
  62.       tmp_field->flags&= ~NOT_NULL_FLAG;
  63.   }
  64.   else
  65.     init_make_field(tmp_field, field_type());
  66. }
  67. void Item_sum::print(String *str)
  68. {
  69.   str->append(func_name());
  70.   str->append('(');
  71.   for (uint i=0 ; i < arg_count ; i++)
  72.   {
  73.     if (i)
  74.       str->append(',');
  75.     args[i]->print(str);
  76.   }
  77.   str->append(')');
  78. }
  79. void Item_sum::fix_num_length_and_dec()
  80. {
  81.   decimals=0;
  82.   for (uint i=0 ; i < arg_count ; i++)
  83.     set_if_bigger(decimals,args[i]->decimals);
  84.   max_length=float_length(decimals);
  85. }
  86. Item *Item_sum::get_tmp_table_item(THD *thd)
  87. {
  88.   Item_sum* sum_item= (Item_sum *) copy_or_same(thd);
  89.   if (sum_item && sum_item->result_field)    // If not a const sum func
  90.   {
  91.     Field *result_field_tmp= sum_item->result_field;
  92.     for (uint i=0 ; i < sum_item->arg_count ; i++)
  93.     {
  94.       Item *arg= sum_item->args[i];
  95.       if (!arg->const_item())
  96.       {
  97. if (arg->type() == Item::FIELD_ITEM)
  98.   ((Item_field*) arg)->field= result_field_tmp++;
  99. else
  100.   sum_item->args[i]= new Item_field(result_field_tmp++);
  101.       }
  102.     }
  103.   }
  104.   return sum_item;
  105. }
  106. bool Item_sum::walk (Item_processor processor, byte *argument)
  107. {
  108.   if (arg_count)
  109.   {
  110.     Item **arg,**arg_end;
  111.     for (arg= args, arg_end= args+arg_count; arg != arg_end; arg++)
  112.     {
  113.       if ((*arg)->walk(processor, argument))
  114. return 1;
  115.     }
  116.   }
  117.   return (this->*processor)(argument);
  118. }
  119. String *
  120. Item_sum_num::val_str(String *str)
  121. {
  122.   DBUG_ASSERT(fixed == 1);
  123.   double nr=val();
  124.   if (null_value)
  125.     return 0;
  126.   str->set(nr,decimals, &my_charset_bin);
  127.   return str;
  128. }
  129. String *
  130. Item_sum_int::val_str(String *str)
  131. {
  132.   DBUG_ASSERT(fixed == 1);
  133.   longlong nr= val_int();
  134.   if (null_value)
  135.     return 0;
  136.   if (unsigned_flag)
  137.     str->set((ulonglong) nr, &my_charset_bin);
  138.   else
  139.     str->set(nr, &my_charset_bin);
  140.   return str;
  141. }
  142. bool
  143. Item_sum_num::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
  144. {
  145.   DBUG_ASSERT(fixed == 0);
  146.   if (!thd->allow_sum_func)
  147.   {
  148.     my_error(ER_INVALID_GROUP_FUNC_USE,MYF(0));
  149.     return 1;
  150.   }
  151.   thd->allow_sum_func=0; // No included group funcs
  152.   decimals=0;
  153.   maybe_null=0;
  154.   for (uint i=0 ; i < arg_count ; i++)
  155.   {
  156.     if (args[i]->fix_fields(thd, tables, args + i) || args[i]->check_cols(1))
  157.       return 1;
  158.     if (decimals < args[i]->decimals)
  159.       decimals=args[i]->decimals;
  160.     maybe_null |= args[i]->maybe_null;
  161.   }
  162.   result_field=0;
  163.   max_length=float_length(decimals);
  164.   null_value=1;
  165.   fix_length_and_dec();
  166.   thd->allow_sum_func=1; // Allow group functions
  167.   fixed= 1;
  168.   return 0;
  169. }
  170. bool
  171. Item_sum_hybrid::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
  172. {
  173.   DBUG_ASSERT(fixed == 0);
  174.   Item *item= args[0];
  175.   if (!thd->allow_sum_func)
  176.   {
  177.     my_error(ER_INVALID_GROUP_FUNC_USE,MYF(0));
  178.     return 1;
  179.   }
  180.   thd->allow_sum_func=0; // No included group funcs
  181.   // 'item' can be changed during fix_fields
  182.   if (!item->fixed &&
  183.       item->fix_fields(thd, tables, args) ||
  184.       (item= args[0])->check_cols(1))
  185.     return 1;
  186.   hybrid_type= item->result_type();
  187.   if (hybrid_type == INT_RESULT)
  188.   {
  189.     max_length=20;
  190.   }
  191.   else if (hybrid_type == REAL_RESULT)
  192.   {
  193.     max_length=float_length(decimals);
  194.   }else
  195.   {
  196.     max_length=item->max_length;
  197.   }
  198.   decimals=item->decimals;
  199.   /* MIN/MAX can return NULL for empty set indepedent of the used column */
  200.   maybe_null= 1;
  201.   unsigned_flag=item->unsigned_flag;
  202.   collation.set(item->collation);
  203.   result_field=0;
  204.   null_value=1;
  205.   fix_length_and_dec();
  206.   thd->allow_sum_func=1; // Allow group functions
  207.   if (item->type() == Item::FIELD_ITEM)
  208.     hybrid_field_type= ((Item_field*) item)->field->type();
  209.   else
  210.     hybrid_field_type= Item::field_type();
  211.   fixed= 1;
  212.   return 0;
  213. }
  214. /***********************************************************************
  215. ** reset and add of sum_func
  216. ***********************************************************************/
  217. Item *Item_sum_sum::copy_or_same(THD* thd)
  218. {
  219.   return new (thd->mem_root) Item_sum_sum(thd, this);
  220. }
  221. void Item_sum_sum::clear()
  222. {
  223.   null_value=1; sum=0.0;
  224. }
  225. bool Item_sum_sum::add()
  226. {
  227.   sum+=args[0]->val();
  228.   if (!args[0]->null_value)
  229.     null_value= 0;
  230.   return 0;
  231. }
  232. double Item_sum_sum::val()
  233. {
  234.   DBUG_ASSERT(fixed == 1);
  235.   return sum;
  236. }
  237. Item *Item_sum_count::copy_or_same(THD* thd)
  238. {
  239.   return new (thd->mem_root) Item_sum_count(thd, this);
  240. }
  241. void Item_sum_count::clear()
  242. {
  243.   count= 0;
  244. }
  245. bool Item_sum_count::add()
  246. {
  247.   if (!args[0]->maybe_null)
  248.     count++;
  249.   else
  250.   {
  251.     (void) args[0]->val_int();
  252.     if (!args[0]->null_value)
  253.       count++;
  254.   }
  255.   return 0;
  256. }
  257. longlong Item_sum_count::val_int()
  258. {
  259.   DBUG_ASSERT(fixed == 1);
  260.   return (longlong) count;
  261. }
  262. void Item_sum_count::cleanup()
  263. {
  264.   DBUG_ENTER("Item_sum_count::cleanup");
  265.   Item_sum_int::cleanup();
  266.   used_table_cache= ~(table_map) 0;
  267.   DBUG_VOID_RETURN;
  268. }
  269. /*
  270.   Avgerage
  271. */
  272. Item *Item_sum_avg::copy_or_same(THD* thd)
  273. {
  274.   return new (thd->mem_root) Item_sum_avg(thd, this);
  275. }
  276. void Item_sum_avg::clear()
  277. {
  278.   sum=0.0; count=0;
  279. }
  280. bool Item_sum_avg::add()
  281. {
  282.   double nr=args[0]->val();
  283.   if (!args[0]->null_value)
  284.   {
  285.     sum+=nr;
  286.     count++;
  287.   }
  288.   return 0;
  289. }
  290. double Item_sum_avg::val()
  291. {
  292.   DBUG_ASSERT(fixed == 1);
  293.   if (!count)
  294.   {
  295.     null_value=1;
  296.     return 0.0;
  297.   }
  298.   null_value=0;
  299.   return sum/ulonglong2double(count);
  300. }
  301. /*
  302.   Standard deviation
  303. */
  304. double Item_sum_std::val()
  305. {
  306.   DBUG_ASSERT(fixed == 1);
  307.   double tmp= Item_sum_variance::val();
  308.   return tmp <= 0.0 ? 0.0 : sqrt(tmp);
  309. }
  310. Item *Item_sum_std::copy_or_same(THD* thd)
  311. {
  312.   return new (thd->mem_root) Item_sum_std(thd, this);
  313. }
  314. /*
  315.   Variance
  316. */
  317. Item *Item_sum_variance::copy_or_same(THD* thd)
  318. {
  319.   return new (thd->mem_root) Item_sum_variance(thd, this);
  320. }
  321. void Item_sum_variance::clear()
  322. {
  323.   sum=sum_sqr=0.0; 
  324.   count=0; 
  325. }
  326. bool Item_sum_variance::add()
  327. {
  328.   double nr=args[0]->val();
  329.   if (!args[0]->null_value)
  330.   {
  331.     sum+=nr;
  332.     sum_sqr+=nr*nr;
  333.     count++;
  334.   }
  335.   return 0;
  336. }
  337. double Item_sum_variance::val()
  338. {
  339.   DBUG_ASSERT(fixed == 1);
  340.   if (!count)
  341.   {
  342.     null_value=1;
  343.     return 0.0;
  344.   }
  345.   null_value=0;
  346.   /* Avoid problems when the precision isn't good enough */
  347.   double tmp=ulonglong2double(count);
  348.   double tmp2=(sum_sqr - sum*sum/tmp)/tmp;
  349.   return tmp2 <= 0.0 ? 0.0 : tmp2;
  350. }
  351. void Item_sum_variance::reset_field()
  352. {
  353.   double nr=args[0]->val();
  354.   char *res=result_field->ptr;
  355.   if (args[0]->null_value)
  356.     bzero(res,sizeof(double)*2+sizeof(longlong));
  357.   else
  358.   {
  359.     float8store(res,nr);
  360.     nr*=nr;
  361.     float8store(res+sizeof(double),nr);
  362.     longlong tmp=1;
  363.     int8store(res+sizeof(double)*2,tmp);
  364.   }
  365. }
  366. void Item_sum_variance::update_field()
  367. {
  368.   double nr,old_nr,old_sqr;
  369.   longlong field_count;
  370.   char *res=result_field->ptr;
  371.   float8get(old_nr, res);
  372.   float8get(old_sqr, res+sizeof(double));
  373.   field_count=sint8korr(res+sizeof(double)*2);
  374.   nr=args[0]->val();
  375.   if (!args[0]->null_value)
  376.   {
  377.     old_nr+=nr;
  378.     old_sqr+=nr*nr;
  379.     field_count++;
  380.   }
  381.   float8store(res,old_nr);
  382.   float8store(res+sizeof(double),old_sqr);
  383.   int8store(res+sizeof(double)*2,field_count);
  384. }
  385. /* min & max */
  386. void Item_sum_hybrid::clear()
  387. {
  388.   sum= 0.0;
  389.   sum_int= 0;
  390.   value.length(0);
  391.   null_value= 1;
  392. }
  393. double Item_sum_hybrid::val()
  394. {
  395.   DBUG_ASSERT(fixed == 1);
  396.   int err;
  397.   char *end_not_used;
  398.   if (null_value)
  399.     return 0.0;
  400.   switch (hybrid_type) {
  401.   case STRING_RESULT:
  402.     String *res;  res=val_str(&str_value);
  403.     return (res ? my_strntod(res->charset(), (char*) res->ptr(),res->length(),
  404.      &end_not_used, &err) : 0.0);
  405.   case INT_RESULT:
  406.     if (unsigned_flag)
  407.       return ulonglong2double(sum_int);
  408.     return (double) sum_int;
  409.   case REAL_RESULT:
  410.     return sum;
  411.   case ROW_RESULT:
  412.   default:
  413.     // This case should never be choosen
  414.     DBUG_ASSERT(0);
  415.     return 0;
  416.   }
  417.   return 0; // Keep compiler happy
  418. }
  419. longlong Item_sum_hybrid::val_int()
  420. {
  421.   DBUG_ASSERT(fixed == 1);
  422.   if (null_value)
  423.     return 0;
  424.   if (hybrid_type == INT_RESULT)
  425.     return sum_int;
  426.   return (longlong) Item_sum_hybrid::val();
  427. }
  428. String *
  429. Item_sum_hybrid::val_str(String *str)
  430. {
  431.   DBUG_ASSERT(fixed == 1);
  432.   if (null_value)
  433.     return 0;
  434.   switch (hybrid_type) {
  435.   case STRING_RESULT:
  436.     return &value;
  437.   case REAL_RESULT:
  438.     str->set(sum,decimals, &my_charset_bin);
  439.     break;
  440.   case INT_RESULT:
  441.     if (unsigned_flag)
  442.       str->set((ulonglong) sum_int, &my_charset_bin);
  443.     else
  444.       str->set((longlong) sum_int, &my_charset_bin);
  445.     break;
  446.   case ROW_RESULT:
  447.   default:
  448.     // This case should never be choosen
  449.     DBUG_ASSERT(0);
  450.     break;
  451.   }
  452.   return str; // Keep compiler happy
  453. }
  454. void Item_sum_hybrid::cleanup()
  455. {
  456.   DBUG_ENTER("Item_sum_hybrid::cleanup");
  457.   Item_sum::cleanup();
  458.   used_table_cache= ~(table_map) 0;
  459.   /*
  460.     by default it is TRUE to avoid TRUE reporting by
  461.     Item_func_not_all/Item_func_nop_all if this item was never called.
  462.     no_rows_in_result() set it to FALSE if was not results found.
  463.     If some results found it will be left unchanged.
  464.   */
  465.   was_values= TRUE;
  466.   DBUG_VOID_RETURN;
  467. }
  468. void Item_sum_hybrid::no_rows_in_result()
  469. {
  470.   was_values= FALSE;
  471.   clear();
  472. }
  473. Item *Item_sum_min::copy_or_same(THD* thd)
  474. {
  475.   return new (thd->mem_root) Item_sum_min(thd, this);
  476. }
  477. bool Item_sum_min::add()
  478. {
  479.   switch (hybrid_type) {
  480.   case STRING_RESULT:
  481.   {
  482.     String *result=args[0]->val_str(&tmp_value);
  483.     if (!args[0]->null_value &&
  484. (null_value || sortcmp(&value,result,collation.collation) > 0))
  485.     {
  486.       value.copy(*result);
  487.       null_value=0;
  488.     }
  489.   }
  490.   break;
  491.   case INT_RESULT:
  492.   {
  493.     longlong nr=args[0]->val_int();
  494.     if (!args[0]->null_value && (null_value ||
  495.  (unsigned_flag && 
  496.   (ulonglong) nr < (ulonglong) sum_int) ||
  497.  (!unsigned_flag && nr < sum_int)))
  498.     {
  499.       sum_int=nr;
  500.       null_value=0;
  501.     }
  502.   }
  503.   break;
  504.   case REAL_RESULT:
  505.   {
  506.     double nr=args[0]->val();
  507.     if (!args[0]->null_value && (null_value || nr < sum))
  508.     {
  509.       sum=nr;
  510.       null_value=0;
  511.     }
  512.   }
  513.   break;
  514.   case ROW_RESULT:
  515.   default:
  516.     // This case should never be choosen
  517.     DBUG_ASSERT(0);
  518.     break;
  519.   }
  520.   return 0;
  521. }
  522. Item *Item_sum_max::copy_or_same(THD* thd)
  523. {
  524.   return new (thd->mem_root) Item_sum_max(thd, this);
  525. }
  526. bool Item_sum_max::add()
  527. {
  528.   switch (hybrid_type) {
  529.   case STRING_RESULT:
  530.   {
  531.     String *result=args[0]->val_str(&tmp_value);
  532.     if (!args[0]->null_value &&
  533. (null_value || sortcmp(&value,result,collation.collation) < 0))
  534.     {
  535.       value.copy(*result);
  536.       null_value=0;
  537.     }
  538.   }
  539.   break;
  540.   case INT_RESULT:
  541.   {
  542.     longlong nr=args[0]->val_int();
  543.     if (!args[0]->null_value && (null_value ||
  544.  (unsigned_flag && 
  545.   (ulonglong) nr > (ulonglong) sum_int) ||
  546.  (!unsigned_flag && nr > sum_int)))
  547.     {
  548.       sum_int=nr;
  549.       null_value=0;
  550.     }
  551.   }
  552.   break;
  553.   case REAL_RESULT:
  554.   {
  555.     double nr=args[0]->val();
  556.     if (!args[0]->null_value && (null_value || nr > sum))
  557.     {
  558.       sum=nr;
  559.       null_value=0;
  560.     }
  561.   }
  562.   break;
  563.   case ROW_RESULT:
  564.   default:
  565.     // This case should never be choosen
  566.     DBUG_ASSERT(0);
  567.     break;
  568.   }
  569.   return 0;
  570. }
  571. /* bit_or and bit_and */
  572. longlong Item_sum_bit::val_int()
  573. {
  574.   DBUG_ASSERT(fixed == 1);
  575.   return (longlong) bits;
  576. }
  577. void Item_sum_bit::clear()
  578. {
  579.   bits= reset_bits;
  580. }
  581. Item *Item_sum_or::copy_or_same(THD* thd)
  582. {
  583.   return new (thd->mem_root) Item_sum_or(thd, this);
  584. }
  585. bool Item_sum_or::add()
  586. {
  587.   ulonglong value= (ulonglong) args[0]->val_int();
  588.   if (!args[0]->null_value)
  589.     bits|=value;
  590.   return 0;
  591. }
  592. Item *Item_sum_xor::copy_or_same(THD* thd)
  593. {
  594.   return new (thd->mem_root) Item_sum_xor(thd, this);
  595. }
  596. bool Item_sum_xor::add()
  597. {
  598.   ulonglong value= (ulonglong) args[0]->val_int();
  599.   if (!args[0]->null_value)
  600.     bits^=value;
  601.   return 0;
  602. }
  603. Item *Item_sum_and::copy_or_same(THD* thd)
  604. {
  605.   return new (thd->mem_root) Item_sum_and(thd, this);
  606. }
  607. bool Item_sum_and::add()
  608. {
  609.   ulonglong value= (ulonglong) args[0]->val_int();
  610.   if (!args[0]->null_value)
  611.     bits&=value;
  612.   return 0;
  613. }
  614. /************************************************************************
  615. ** reset result of a Item_sum with is saved in a tmp_table
  616. *************************************************************************/
  617. void Item_sum_num::reset_field()
  618. {
  619.   double nr=args[0]->val();
  620.   char *res=result_field->ptr;
  621.   if (maybe_null)
  622.   {
  623.     if (args[0]->null_value)
  624.     {
  625.       nr=0.0;
  626.       result_field->set_null();
  627.     }
  628.     else
  629.       result_field->set_notnull();
  630.   }
  631.   float8store(res,nr);
  632. }
  633. void Item_sum_hybrid::reset_field()
  634. {
  635.   if (hybrid_type == STRING_RESULT)
  636.   {
  637.     char buff[MAX_FIELD_WIDTH];
  638.     String tmp(buff,sizeof(buff),result_field->charset()),*res;
  639.     res=args[0]->val_str(&tmp);
  640.     if (args[0]->null_value)
  641.     {
  642.       result_field->set_null();
  643.       result_field->reset();
  644.     }
  645.     else
  646.     {
  647.       result_field->set_notnull();
  648.       result_field->store(res->ptr(),res->length(),tmp.charset());
  649.     }
  650.   }
  651.   else if (hybrid_type == INT_RESULT)
  652.   {
  653.     longlong nr=args[0]->val_int();
  654.     if (maybe_null)
  655.     {
  656.       if (args[0]->null_value)
  657.       {
  658. nr=0;
  659. result_field->set_null();
  660.       }
  661.       else
  662. result_field->set_notnull();
  663.     }
  664.     result_field->store(nr);
  665.   }
  666.   else // REAL_RESULT
  667.   {
  668.     double nr=args[0]->val();
  669.     if (maybe_null)
  670.     {
  671.       if (args[0]->null_value)
  672.       {
  673. nr=0.0;
  674. result_field->set_null();
  675.       }
  676.       else
  677. result_field->set_notnull();
  678.     }
  679.     result_field->store(nr);
  680.   }
  681. }
  682. void Item_sum_sum::reset_field()
  683. {
  684.   double nr=args[0]->val(); // Nulls also return 0
  685.   float8store(result_field->ptr,nr);
  686.   if (args[0]->null_value)
  687.     result_field->set_null();
  688.   else
  689.     result_field->set_notnull();
  690. }
  691. void Item_sum_count::reset_field()
  692. {
  693.   char *res=result_field->ptr;
  694.   longlong nr=0;
  695.   if (!args[0]->maybe_null)
  696.     nr=1;
  697.   else
  698.   {
  699.     (void) args[0]->val_int();
  700.     if (!args[0]->null_value)
  701.       nr=1;
  702.   }
  703.   int8store(res,nr);
  704. }
  705. void Item_sum_avg::reset_field()
  706. {
  707.   double nr=args[0]->val();
  708.   char *res=result_field->ptr;
  709.   if (args[0]->null_value)
  710.     bzero(res,sizeof(double)+sizeof(longlong));
  711.   else
  712.   {
  713.     float8store(res,nr);
  714.     res+=sizeof(double);
  715.     longlong tmp=1;
  716.     int8store(res,tmp);
  717.   }
  718. }
  719. void Item_sum_bit::reset_field()
  720. {
  721.   reset();
  722.   int8store(result_field->ptr, bits);
  723. }
  724. void Item_sum_bit::update_field()
  725. {
  726.   char *res=result_field->ptr;
  727.   bits= uint8korr(res);
  728.   add();
  729.   int8store(res, bits);
  730. }
  731. /*
  732. ** calc next value and merge it with field_value
  733. */
  734. void Item_sum_sum::update_field()
  735. {
  736.   double old_nr,nr;
  737.   char *res=result_field->ptr;
  738.   float8get(old_nr,res);
  739.   nr=args[0]->val();
  740.   if (!args[0]->null_value)
  741.   {
  742.     old_nr+=nr;
  743.     result_field->set_notnull();
  744.   }
  745.   float8store(res,old_nr);
  746. }
  747. void Item_sum_count::update_field()
  748. {
  749.   longlong nr;
  750.   char *res=result_field->ptr;
  751.   nr=sint8korr(res);
  752.   if (!args[0]->maybe_null)
  753.     nr++;
  754.   else
  755.   {
  756.     (void) args[0]->val_int();
  757.     if (!args[0]->null_value)
  758.       nr++;
  759.   }
  760.   int8store(res,nr);
  761. }
  762. void Item_sum_avg::update_field()
  763. {
  764.   double nr,old_nr;
  765.   longlong field_count;
  766.   char *res=result_field->ptr;
  767.   float8get(old_nr,res);
  768.   field_count=sint8korr(res+sizeof(double));
  769.   nr=args[0]->val();
  770.   if (!args[0]->null_value)
  771.   {
  772.     old_nr+=nr;
  773.     field_count++;
  774.   }
  775.   float8store(res,old_nr);
  776.   res+=sizeof(double);
  777.   int8store(res,field_count);
  778. }
  779. void Item_sum_hybrid::update_field()
  780. {
  781.   if (hybrid_type == STRING_RESULT)
  782.     min_max_update_str_field();
  783.   else if (hybrid_type == INT_RESULT)
  784.     min_max_update_int_field();
  785.   else
  786.     min_max_update_real_field();
  787. }
  788. void
  789. Item_sum_hybrid::min_max_update_str_field()
  790. {
  791.   String *res_str=args[0]->val_str(&value);
  792.   if (!args[0]->null_value)
  793.   {
  794.     res_str->strip_sp();
  795.     result_field->val_str(&tmp_value);
  796.     if (result_field->is_null() ||
  797. (cmp_sign * sortcmp(res_str,&tmp_value,collation.collation)) < 0)
  798.       result_field->store(res_str->ptr(),res_str->length(),res_str->charset());
  799.     result_field->set_notnull();
  800.   }
  801. }
  802. void
  803. Item_sum_hybrid::min_max_update_real_field()
  804. {
  805.   double nr,old_nr;
  806.   old_nr=result_field->val_real();
  807.   nr=args[0]->val();
  808.   if (!args[0]->null_value)
  809.   {
  810.     if (result_field->is_null(0) ||
  811. (cmp_sign > 0 ? old_nr > nr : old_nr < nr))
  812.       old_nr=nr;
  813.     result_field->set_notnull();
  814.   }
  815.   else if (result_field->is_null(0))
  816.     result_field->set_null();
  817.   result_field->store(old_nr);
  818. }
  819. void
  820. Item_sum_hybrid::min_max_update_int_field()
  821. {
  822.   longlong nr,old_nr;
  823.   old_nr=result_field->val_int();
  824.   nr=args[0]->val_int();
  825.   if (!args[0]->null_value)
  826.   {
  827.     if (result_field->is_null(0))
  828.       old_nr=nr;
  829.     else
  830.     {
  831.       bool res=(unsigned_flag ?
  832. (ulonglong) old_nr > (ulonglong) nr :
  833. old_nr > nr);
  834.       /* (cmp_sign > 0 && res) || (!(cmp_sign > 0) && !res) */
  835.       if ((cmp_sign > 0) ^ (!res))
  836. old_nr=nr;
  837.     }
  838.     result_field->set_notnull();
  839.   }
  840.   else if (result_field->is_null(0))
  841.     result_field->set_null();
  842.   result_field->store(old_nr);
  843. }
  844. Item_avg_field::Item_avg_field(Item_sum_avg *item)
  845. {
  846.   name=item->name;
  847.   decimals=item->decimals;
  848.   max_length=item->max_length;
  849.   field=item->result_field;
  850.   maybe_null=1;
  851. }
  852. double Item_avg_field::val()
  853. {
  854.   // fix_fields() never calls for this Item
  855.   double nr;
  856.   longlong count;
  857.   float8get(nr,field->ptr);
  858.   char *res=(field->ptr+sizeof(double));
  859.   count=sint8korr(res);
  860.   if (!count)
  861.   {
  862.     null_value=1;
  863.     return 0.0;
  864.   }
  865.   null_value=0;
  866.   return nr/(double) count;
  867. }
  868. String *Item_avg_field::val_str(String *str)
  869. {
  870.   // fix_fields() never calls for this Item
  871.   double nr=Item_avg_field::val();
  872.   if (null_value)
  873.     return 0;
  874.   str->set(nr,decimals, &my_charset_bin);
  875.   return str;
  876. }
  877. Item_std_field::Item_std_field(Item_sum_std *item)
  878.   : Item_variance_field(item)
  879. {
  880. }
  881. double Item_std_field::val()
  882. {
  883.   // fix_fields() never calls for this Item
  884.   double tmp= Item_variance_field::val();
  885.   return tmp <= 0.0 ? 0.0 : sqrt(tmp);
  886. }
  887. Item_variance_field::Item_variance_field(Item_sum_variance *item)
  888. {
  889.   name=item->name;
  890.   decimals=item->decimals;
  891.   max_length=item->max_length;
  892.   field=item->result_field;
  893.   maybe_null=1;
  894. }
  895. double Item_variance_field::val()
  896. {
  897.   // fix_fields() never calls for this Item
  898.   double sum,sum_sqr;
  899.   longlong count;
  900.   float8get(sum,field->ptr);
  901.   float8get(sum_sqr,(field->ptr+sizeof(double)));
  902.   count=sint8korr(field->ptr+sizeof(double)*2);
  903.   if (!count)
  904.   {
  905.     null_value=1;
  906.     return 0.0;
  907.   }
  908.   null_value=0;
  909.   double tmp= (double) count;
  910.   double tmp2=(sum_sqr - sum*sum/tmp)/tmp;
  911.   return tmp2 <= 0.0 ? 0.0 : tmp2;
  912. }
  913. String *Item_variance_field::val_str(String *str)
  914. {
  915.   // fix_fields() never calls for this Item
  916.   double nr=val();
  917.   if (null_value)
  918.     return 0;
  919.   str->set(nr,decimals, &my_charset_bin);
  920.   return str;
  921. }
  922. /****************************************************************************
  923. ** COUNT(DISTINCT ...)
  924. ****************************************************************************/
  925. #include "sql_select.h"
  926. int simple_raw_key_cmp(void* arg, byte* key1, byte* key2)
  927. {
  928.   return memcmp(key1, key2, *(uint*) arg);
  929. }
  930. int simple_str_key_cmp(void* arg, byte* key1, byte* key2)
  931. {
  932.   Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg;
  933.   CHARSET_INFO *cs=item->key_charset;
  934.   uint len=item->key_length;
  935.   return cs->coll->strnncollsp(cs, 
  936.        (const uchar*) key1, len, 
  937.        (const uchar*) key2, len);
  938. }
  939. /*
  940.   Did not make this one static - at least gcc gets confused when
  941.   I try to declare a static function as a friend. If you can figure
  942.   out the syntax to make a static function a friend, make this one
  943.   static
  944. */
  945. int composite_key_cmp(void* arg, byte* key1, byte* key2)
  946. {
  947.   Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg;
  948.   Field **field    = item->table->field;
  949.   Field **field_end= field + item->table->fields;
  950.   uint32 *lengths=item->field_lengths;
  951.   for (; field < field_end; ++field)
  952.   {
  953.     Field* f = *field;
  954.     int len = *lengths++;
  955.     int res = f->key_cmp(key1, key2);
  956.     if (res)
  957.       return res;
  958.     key1 += len;
  959.     key2 += len;
  960.   }
  961.   return 0;
  962. }
  963. /*
  964.   helper function for walking the tree when we dump it to MyISAM -
  965.   tree_walk will call it for each leaf
  966. */
  967. int dump_leaf(byte* key, uint32 count __attribute__((unused)),
  968.      Item_sum_count_distinct* item)
  969. {
  970.   byte* buf = item->table->record[0];
  971.   int error;
  972.   /*
  973.     The first item->rec_offset bytes are taken care of with
  974.     restore_record(table,default_values) in setup()
  975.   */
  976.   memcpy(buf + item->rec_offset, key, item->tree->size_of_element);
  977.   if ((error = item->table->file->write_row(buf)))
  978.   {
  979.     if (error != HA_ERR_FOUND_DUPP_KEY &&
  980. error != HA_ERR_FOUND_DUPP_UNIQUE)
  981.       return 1;
  982.   }
  983.   return 0;
  984. }
  985. void Item_sum_count_distinct::cleanup()
  986. {
  987.   DBUG_ENTER("Item_sum_count_distinct::cleanup");
  988.   Item_sum_int::cleanup();
  989.   /*
  990.     Free table and tree if they belong to this item (if item have not pointer
  991.     to original item from which was made copy => it own its objects )
  992.   */
  993.   if (!original)
  994.   {
  995.     if (table)
  996.     {
  997.       free_tmp_table(current_thd, table);
  998.       table= 0;
  999.     }
  1000.     delete tmp_table_param;
  1001.     tmp_table_param= 0;
  1002.     if (use_tree)
  1003.     {
  1004.       delete_tree(tree);
  1005.       use_tree= 0;
  1006.     }
  1007.   }
  1008.   DBUG_VOID_RETURN;
  1009. }
  1010. /* This is used by rollup to create a separate usable copy of the function */
  1011. void Item_sum_count_distinct::make_unique()
  1012. {
  1013.   table=0;
  1014.   original= 0;
  1015.   use_tree= 0; // to prevent delete_tree call on uninitialized tree
  1016.   tree= &tree_base;
  1017. }
  1018. bool Item_sum_count_distinct::setup(THD *thd)
  1019. {
  1020.   List<Item> list;
  1021.   SELECT_LEX *select_lex= thd->lex->current_select;
  1022.   if (select_lex->linkage == GLOBAL_OPTIONS_TYPE)
  1023.     return 1;
  1024.     
  1025.   if (!(tmp_table_param= new TMP_TABLE_PARAM))
  1026.     return 1;
  1027.   /* Create a table with an unique key over all parameters */
  1028.   for (uint i=0; i < arg_count ; i++)
  1029.   {
  1030.     Item *item=args[i];
  1031.     if (list.push_back(item))
  1032.       return 1; // End of memory
  1033.     if (item->const_item())
  1034.     {
  1035.       (void) item->val_int();
  1036.       if (item->null_value)
  1037. always_null=1;
  1038.     }
  1039.   }
  1040.   if (always_null)
  1041.     return 0;
  1042.   count_field_types(tmp_table_param,list,0);
  1043.   if (table)
  1044.   {
  1045.     free_tmp_table(thd, table);
  1046.     tmp_table_param->cleanup();
  1047.   }
  1048.   if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1,
  1049. 0,
  1050. select_lex->options | thd->options,
  1051. HA_POS_ERROR, (char*)"")))
  1052.     return 1;
  1053.   table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows
  1054.   table->no_rows=1;
  1055.   // no blobs, otherwise it would be MyISAM
  1056.   if (table->db_type == DB_TYPE_HEAP)
  1057.   {
  1058.     qsort_cmp2 compare_key;
  1059.     void* cmp_arg;
  1060.     // to make things easier for dump_leaf if we ever have to dump to MyISAM
  1061.     restore_record(table,default_values);
  1062.     if (table->fields == 1)
  1063.     {
  1064.       /*
  1065. If we have only one field, which is the most common use of
  1066. count(distinct), it is much faster to use a simpler key
  1067. compare method that can take advantage of not having to worry
  1068. about other fields
  1069.       */
  1070.       Field* field = table->field[0];
  1071.       switch(field->type())
  1072.       {
  1073.       case FIELD_TYPE_STRING:
  1074.       case FIELD_TYPE_VAR_STRING:
  1075. if (field->binary())
  1076. {
  1077.   compare_key = (qsort_cmp2)simple_raw_key_cmp;
  1078.   cmp_arg = (void*) &key_length;
  1079. }
  1080. else
  1081. {
  1082.   /*
  1083.     If we have a string, we must take care of charsets and case
  1084.     sensitivity
  1085.   */
  1086.   compare_key = (qsort_cmp2)simple_str_key_cmp;
  1087.   cmp_arg = (void*) this;
  1088. }
  1089. break;
  1090.       default:
  1091. /*
  1092.   Since at this point we cannot have blobs anything else can
  1093.   be compared with memcmp
  1094. */
  1095. compare_key = (qsort_cmp2)simple_raw_key_cmp;
  1096. cmp_arg = (void*) &key_length;
  1097. break;
  1098.       }
  1099.       key_charset = field->charset();
  1100.       key_length  = field->pack_length();
  1101.       rec_offset  = 1;
  1102.     }
  1103.     else // too bad, cannot cheat - there is more than one field
  1104.     {
  1105.       bool all_binary = 1;
  1106.       Field** field, **field_end;
  1107.       field_end = (field = table->field) + table->fields;
  1108.       uint32 *lengths;
  1109.       if (!(field_lengths= 
  1110.     (uint32*) thd->alloc(sizeof(uint32) * table->fields)))
  1111. return 1;
  1112.       for (key_length = 0, lengths=field_lengths; field < field_end; ++field)
  1113.       {
  1114. uint32 length= (*field)->pack_length();
  1115. key_length += length;
  1116. *lengths++ = length;
  1117. if (!(*field)->binary())
  1118.   all_binary = 0; // Can't break loop here
  1119.       }
  1120.       rec_offset = table->reclength - key_length;
  1121.       if (all_binary)
  1122.       {
  1123. compare_key = (qsort_cmp2)simple_raw_key_cmp;
  1124. cmp_arg = (void*) &key_length;
  1125.       }
  1126.       else
  1127.       {
  1128. compare_key = (qsort_cmp2) composite_key_cmp ;
  1129. cmp_arg = (void*) this;
  1130.       }
  1131.     }
  1132.     if (use_tree)
  1133.       delete_tree(tree);
  1134.     init_tree(tree, min(thd->variables.max_heap_table_size,
  1135. thd->variables.sortbuff_size/16), 0,
  1136.       key_length, compare_key, 0, NULL, cmp_arg);
  1137.     use_tree = 1;
  1138.     /*
  1139.       The only time key_length could be 0 is if someone does
  1140.       count(distinct) on a char(0) field - stupid thing to do,
  1141.       but this has to be handled - otherwise someone can crash
  1142.       the server with a DoS attack
  1143.     */
  1144.     max_elements_in_tree = ((key_length) ? 
  1145.     thd->variables.max_heap_table_size/key_length : 1);
  1146.   }
  1147.   if (original)
  1148.   {
  1149.     original->table= table;
  1150.     original->use_tree= use_tree;
  1151.   }
  1152.   return 0;
  1153. }
  1154. int Item_sum_count_distinct::tree_to_myisam()
  1155. {
  1156.   if (create_myisam_from_heap(current_thd, table, tmp_table_param,
  1157.       HA_ERR_RECORD_FILE_FULL, 1) ||
  1158.       tree_walk(tree, (tree_walk_action)&dump_leaf, (void*)this,
  1159. left_root_right))
  1160.     return 1;
  1161.   delete_tree(tree);
  1162.   use_tree = 0;
  1163.   return 0;
  1164. }
  1165. Item *Item_sum_count_distinct::copy_or_same(THD* thd) 
  1166. {
  1167.   return new (thd->mem_root) Item_sum_count_distinct(thd, this);
  1168. }
  1169. void Item_sum_count_distinct::clear()
  1170. {
  1171.   if (use_tree)
  1172.     reset_tree(tree);
  1173.   else if (table)
  1174.   {
  1175.     table->file->extra(HA_EXTRA_NO_CACHE);
  1176.     table->file->delete_all_rows();
  1177.     table->file->extra(HA_EXTRA_WRITE_CACHE);
  1178.   }
  1179. }
  1180. bool Item_sum_count_distinct::add()
  1181. {
  1182.   int error;
  1183.   if (always_null)
  1184.     return 0;
  1185.   copy_fields(tmp_table_param);
  1186.   copy_funcs(tmp_table_param->items_to_copy);
  1187.   for (Field **field=table->field ; *field ; field++)
  1188.     if ((*field)->is_real_null(0))
  1189.       return 0; // Don't count NULL
  1190.   if (use_tree)
  1191.   {
  1192.     /*
  1193.       If the tree got too big, convert to MyISAM, otherwise insert into the
  1194.       tree.
  1195.     */
  1196.     if (tree->elements_in_tree > max_elements_in_tree)
  1197.     {
  1198.       if (tree_to_myisam())
  1199. return 1;
  1200.     }
  1201.     else if (!tree_insert(tree, table->record[0] + rec_offset, 0,
  1202.   tree->custom_arg))
  1203.       return 1;
  1204.   }
  1205.   else if ((error=table->file->write_row(table->record[0])))
  1206.   {
  1207.     if (error != HA_ERR_FOUND_DUPP_KEY &&
  1208. error != HA_ERR_FOUND_DUPP_UNIQUE)
  1209.     {
  1210.       if (create_myisam_from_heap(current_thd, table, tmp_table_param, error,
  1211.   1))
  1212. return 1; // Not a table_is_full error
  1213.     }
  1214.   }
  1215.   return 0;
  1216. }
  1217. longlong Item_sum_count_distinct::val_int()
  1218. {
  1219.   DBUG_ASSERT(fixed == 1);
  1220.   if (!table) // Empty query
  1221.     return LL(0);
  1222.   if (use_tree)
  1223.     return tree->elements_in_tree;
  1224.   table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
  1225.   return table->file->records;
  1226. }
  1227. void Item_sum_count_distinct::print(String *str)
  1228. {
  1229.   str->append("count(distinct ", 15);
  1230.   args[0]->print(str);
  1231.   str->append(')');
  1232. }
  1233. /****************************************************************************
  1234. ** Functions to handle dynamic loadable aggregates
  1235. ** Original source by: Alexis Mikhailov <root@medinf.chuvashia.su>
  1236. ** Adapted for UDAs by: Andreas F. Bobak <bobak@relog.ch>.
  1237. ** Rewritten by: Monty.
  1238. ****************************************************************************/
  1239. #ifdef HAVE_DLOPEN
  1240. void Item_udf_sum::clear()
  1241. {
  1242.   DBUG_ENTER("Item_udf_sum::clear");
  1243.   udf.clear();
  1244.   DBUG_VOID_RETURN;
  1245. }
  1246. bool Item_udf_sum::add()
  1247. {
  1248.   DBUG_ENTER("Item_udf_sum::add");
  1249.   udf.add(&null_value);
  1250.   DBUG_RETURN(0);
  1251. }
  1252. void Item_udf_sum::cleanup()
  1253. {
  1254.   /*
  1255.     udf_handler::cleanup() nicely handles case when we have not
  1256.     original item but one created by copy_or_same() method.
  1257.   */
  1258.   udf.cleanup();
  1259.   Item_sum::cleanup();
  1260. }
  1261. Item *Item_sum_udf_float::copy_or_same(THD* thd)
  1262. {
  1263.   return new (thd->mem_root) Item_sum_udf_float(thd, this);
  1264. }
  1265. double Item_sum_udf_float::val()
  1266. {
  1267.   DBUG_ASSERT(fixed == 1);
  1268.   DBUG_ENTER("Item_sum_udf_float::val");
  1269.   DBUG_PRINT("info",("result_type: %d  arg_count: %d",
  1270.      args[0]->result_type(), arg_count));
  1271.   DBUG_RETURN(udf.val(&null_value));
  1272. }
  1273. String *Item_sum_udf_float::val_str(String *str)
  1274. {
  1275.   DBUG_ASSERT(fixed == 1);
  1276.   double nr=val();
  1277.   if (null_value)
  1278.     return 0; /* purecov: inspected */
  1279.   str->set(nr,decimals, &my_charset_bin);
  1280.   return str;
  1281. }
  1282. Item *Item_sum_udf_int::copy_or_same(THD* thd)
  1283. {
  1284.   return new (thd->mem_root) Item_sum_udf_int(thd, this);
  1285. }
  1286. longlong Item_sum_udf_int::val_int()
  1287. {
  1288.   DBUG_ASSERT(fixed == 1);
  1289.   DBUG_ENTER("Item_sum_udf_int::val_int");
  1290.   DBUG_PRINT("info",("result_type: %d  arg_count: %d",
  1291.      args[0]->result_type(), arg_count));
  1292.   DBUG_RETURN(udf.val_int(&null_value));
  1293. }
  1294. String *Item_sum_udf_int::val_str(String *str)
  1295. {
  1296.   DBUG_ASSERT(fixed == 1);
  1297.   longlong nr=val_int();
  1298.   if (null_value)
  1299.     return 0;
  1300.   str->set(nr, &my_charset_bin);
  1301.   return str;
  1302. }
  1303. /* Default max_length is max argument length */
  1304. void Item_sum_udf_str::fix_length_and_dec()
  1305. {
  1306.   DBUG_ENTER("Item_sum_udf_str::fix_length_and_dec");
  1307.   max_length=0;
  1308.   for (uint i = 0; i < arg_count; i++)
  1309.     set_if_bigger(max_length,args[i]->max_length);
  1310.   DBUG_VOID_RETURN;
  1311. }
  1312. Item *Item_sum_udf_str::copy_or_same(THD* thd)
  1313. {
  1314.   return new (thd->mem_root) Item_sum_udf_str(thd, this);
  1315. }
  1316. String *Item_sum_udf_str::val_str(String *str)
  1317. {
  1318.   DBUG_ASSERT(fixed == 1);
  1319.   DBUG_ENTER("Item_sum_udf_str::str");
  1320.   String *res=udf.val_str(str,&str_value);
  1321.   null_value = !res;
  1322.   DBUG_RETURN(res);
  1323. }
  1324. #endif /* HAVE_DLOPEN */
  1325. /*****************************************************************************
  1326.  GROUP_CONCAT function
  1327.  SQL SYNTAX:
  1328.   GROUP_CONCAT([DISTINCT] expr,... [ORDER BY col [ASC|DESC],...] 
  1329.     [SEPARATOR str_const])
  1330.  concat of values from "group by" operation
  1331.  BUGS
  1332.    DISTINCT and ORDER BY only works if ORDER BY uses all fields and only fields
  1333.    in expression list
  1334.    Blobs doesn't work with DISTINCT or ORDER BY
  1335. *****************************************************************************/
  1336. /*
  1337.   function of sort for syntax:
  1338.   GROUP_CONCAT(DISTINCT expr,...)
  1339. */
  1340. int group_concat_key_cmp_with_distinct(void* arg, byte* key1,
  1341.        byte* key2)
  1342. {
  1343.   Item_func_group_concat* grp_item= (Item_func_group_concat*)arg;
  1344.   Item **field_item, **end;
  1345.   for (field_item= grp_item->args, end= field_item + grp_item->arg_count_field;
  1346.        field_item < end;
  1347.        field_item++)
  1348.   {
  1349.     /*
  1350.       We have to use get_tmp_table_field() instead of
  1351.       real_item()->get_tmp_table_field() because we want the field in
  1352.       the temporary table, not the original field
  1353.     */
  1354.     Field *field= (*field_item)->get_tmp_table_field();
  1355.     /* 
  1356.       If field_item is a const item then either get_tp_table_field returns 0
  1357.       or it is an item over a const table. 
  1358.     */
  1359.     if (field && !(*field_item)->const_item())
  1360.     {
  1361.       int res;
  1362.       uint offset= field->offset();
  1363.       if ((res= field->key_cmp(key1 + offset, key2 + offset)))
  1364. return res;
  1365.     }
  1366.   }
  1367.   return 0;
  1368. }
  1369. /*
  1370.   function of sort for syntax:
  1371.   GROUP_CONCAT(expr,... ORDER BY col,... )
  1372. */
  1373. int group_concat_key_cmp_with_order(void* arg, byte* key1, byte* key2)
  1374. {
  1375.   Item_func_group_concat* grp_item= (Item_func_group_concat*) arg;
  1376.   ORDER **order_item, **end;
  1377.   for (order_item= grp_item->order, end=order_item+ grp_item->arg_count_order;
  1378.        order_item < end;
  1379.        order_item++)
  1380.   {
  1381.     Item *item= *(*order_item)->item;
  1382.     /*
  1383.       We have to use get_tmp_table_field() instead of
  1384.       real_item()->get_tmp_table_field() because we want the field in
  1385.       the temporary table, not the original field
  1386.     */
  1387.     Field *field= item->get_tmp_table_field();
  1388.     /* 
  1389.       If item is a const item then either get_tp_table_field returns 0
  1390.       or it is an item over a const table. 
  1391.     */
  1392.     if (field && !item->const_item())
  1393.     {
  1394.       int res;
  1395.       uint offset= field->offset();
  1396.       if ((res= field->key_cmp(key1 + offset, key2 + offset)))
  1397.         return (*order_item)->asc ? res : -res;
  1398.     }
  1399.   }
  1400.   /*
  1401.     We can't return 0 because in that case the tree class would remove this
  1402.     item as double value. This would cause problems for case-changes and
  1403.     if the the returned values are not the same we do the sort on.
  1404.   */
  1405.   return 1;
  1406. }
  1407. /*
  1408.   function of sort for syntax:
  1409.   GROUP_CONCAT(DISTINCT expr,... ORDER BY col,... )
  1410.   BUG:
  1411.     This doesn't work in the case when the order by contains data that
  1412.     is not part of the field list because tree-insert will not notice
  1413.     the duplicated values when inserting things sorted by ORDER BY
  1414. */
  1415. int group_concat_key_cmp_with_distinct_and_order(void* arg,byte* key1,
  1416.  byte* key2)
  1417. {
  1418.   if (!group_concat_key_cmp_with_distinct(arg,key1,key2))
  1419.     return 0;
  1420.   return(group_concat_key_cmp_with_order(arg,key1,key2));
  1421. }
  1422. /*
  1423.   Append data from current leaf to item->result
  1424. */
  1425. int dump_leaf_key(byte* key, uint32 count __attribute__((unused)),
  1426.                   Item_func_group_concat *item)
  1427. {
  1428.   char buff[MAX_FIELD_WIDTH];
  1429.   String tmp((char *)&buff,sizeof(buff),default_charset_info), tmp2;
  1430.   if (item->no_appended)
  1431.     item->no_appended= FALSE;
  1432.   else
  1433.     item->result.append(*item->separator);
  1434.   tmp.length(0);
  1435.   
  1436.   for (uint i= 0; i < item->arg_count_field; i++)
  1437.   {
  1438.     Item *show_item= item->args[i];
  1439.     if (!show_item->const_item())
  1440.     {
  1441.       /*
  1442. We have to use get_tmp_table_field() instead of
  1443. real_item()->get_tmp_table_field() because we want the field in
  1444. the temporary table, not the original field
  1445.       */
  1446.       Field *field= show_item->get_tmp_table_field();
  1447.       String *res;
  1448.       char *save_ptr= field->ptr;
  1449.       DBUG_ASSERT(field->offset() < item->table->reclength);
  1450.       field->ptr= (char *) key + field->offset();
  1451.       res= field->val_str(&tmp,&tmp2);
  1452.       item->result.append(*res);
  1453.       field->ptr= save_ptr;
  1454.     }
  1455.     else 
  1456.     {
  1457.       String *res= show_item->val_str(&tmp);
  1458.       if (res)
  1459.         item->result.append(*res);
  1460.     }
  1461.   }
  1462.   /* stop if length of result more than group_concat_max_len */  
  1463.   if (item->result.length() > item->group_concat_max_len)
  1464.   {
  1465.     item->count_cut_values++;
  1466.     item->result.length(item->group_concat_max_len);
  1467.     item->warning_for_row= TRUE;
  1468.     return 1;
  1469.   }
  1470.   return 0;
  1471. }
  1472. /*
  1473.   Constructor of Item_func_group_concat
  1474.   is_distinct - distinct
  1475.   is_select - list of expression for show values
  1476.   is_order - list of sort columns 
  1477.   is_separator - string value of separator
  1478. */
  1479. Item_func_group_concat::Item_func_group_concat(bool is_distinct,
  1480.        List<Item> *is_select,
  1481.        SQL_LIST *is_order,
  1482.        String *is_separator)
  1483.   :Item_sum(), tmp_table_param(0), max_elements_in_tree(0), warning(0),
  1484.    key_length(0), tree_mode(0), distinct(is_distinct), warning_for_row(0),
  1485.    separator(is_separator), tree(&tree_base), table(0),
  1486.    order(0), tables_list(0),
  1487.    arg_count_order(0), arg_count_field(0),
  1488.    count_cut_values(0)
  1489. {
  1490.   Item *item_select;
  1491.   Item **arg_ptr;
  1492.   original= 0;
  1493.   quick_group= 0;
  1494.   mark_as_sum_func();
  1495.   order= 0;
  1496.   group_concat_max_len= current_thd->variables.group_concat_max_len;
  1497.     
  1498.   arg_count_field= is_select->elements;
  1499.   arg_count_order= is_order ? is_order->elements : 0;
  1500.   arg_count= arg_count_field + arg_count_order;
  1501.   
  1502.   /*
  1503.     We need to allocate:
  1504.     args - arg_count_field+arg_count_order
  1505.            (for possible order items in temporare tables)
  1506.     order - arg_count_order
  1507.   */
  1508.   if (!(args= (Item**) sql_alloc(sizeof(Item*) * arg_count +
  1509.  sizeof(ORDER*)*arg_count_order)))
  1510.     return;
  1511.   order= (ORDER**)(args + arg_count);
  1512.   /* fill args items of show and sort */
  1513.   List_iterator_fast<Item> li(*is_select);
  1514.   for (arg_ptr=args ; (item_select= li++) ; arg_ptr++)
  1515.     *arg_ptr= item_select;
  1516.   if (arg_count_order) 
  1517.   {
  1518.     ORDER **order_ptr= order;
  1519.     for (ORDER *order_item= (ORDER*) is_order->first;
  1520.  order_item != NULL;
  1521.  order_item= order_item->next)
  1522.     {
  1523.       (*order_ptr++)= order_item;
  1524.       *arg_ptr= *order_item->item;
  1525.       order_item->item= arg_ptr++;
  1526.     }
  1527.   }
  1528. }
  1529.   
  1530. Item_func_group_concat::Item_func_group_concat(THD *thd,
  1531.        Item_func_group_concat *item)
  1532.   :Item_sum(thd, item),item_thd(thd),
  1533.   tmp_table_param(item->tmp_table_param),
  1534.   max_elements_in_tree(item->max_elements_in_tree),
  1535.   warning(item->warning),
  1536.   key_length(item->key_length), 
  1537.   tree_mode(item->tree_mode),
  1538.   distinct(item->distinct),
  1539.   warning_for_row(item->warning_for_row),
  1540.   separator(item->separator),
  1541.   tree(item->tree),
  1542.   table(item->table),
  1543.   order(item->order),
  1544.   tables_list(item->tables_list),
  1545.   group_concat_max_len(item->group_concat_max_len),
  1546.   arg_count_order(item->arg_count_order),
  1547.   arg_count_field(item->arg_count_field),
  1548.   field_list_offset(item->field_list_offset),
  1549.   count_cut_values(item->count_cut_values),
  1550.   original(item)
  1551. {
  1552.   quick_group= item->quick_group;
  1553. }
  1554. void Item_func_group_concat::cleanup()
  1555. {
  1556.   THD *thd= current_thd;
  1557.   DBUG_ENTER("Item_func_group_concat::cleanup");
  1558.   Item_sum::cleanup();
  1559.   /* Adjust warning message to include total number of cut values */
  1560.   if (warning)
  1561.   {
  1562.     char warn_buff[MYSQL_ERRMSG_SIZE];
  1563.     sprintf(warn_buff, ER(ER_CUT_VALUE_GROUP_CONCAT), count_cut_values);
  1564.     warning->set_msg(thd, warn_buff);
  1565.     warning= 0;
  1566.   }
  1567.   /*
  1568.     Free table and tree if they belong to this item (if item have not pointer
  1569.     to original item from which was made copy => it own its objects )
  1570.   */
  1571.   if (!original)
  1572.   {
  1573.     if (table)
  1574.     {
  1575.       free_tmp_table(thd, table);
  1576.       table= 0;
  1577.     }
  1578.     delete tmp_table_param;
  1579.     tmp_table_param= 0;
  1580.     if (tree_mode)
  1581.     {
  1582.       tree_mode= 0;
  1583.       delete_tree(tree); 
  1584.     }
  1585.   }
  1586.   DBUG_VOID_RETURN;
  1587. }
  1588. Item_func_group_concat::~Item_func_group_concat()
  1589. {
  1590. }
  1591. Item *Item_func_group_concat::copy_or_same(THD* thd)
  1592. {
  1593.   return new (thd->mem_root) Item_func_group_concat(thd, this);
  1594. }
  1595. void Item_func_group_concat::clear()
  1596. {
  1597.   result.length(0);
  1598.   result.copy();
  1599.   null_value= TRUE;
  1600.   warning_for_row= FALSE;
  1601.   no_appended= TRUE;
  1602.   if (tree_mode)
  1603.     reset_tree(tree);
  1604. }
  1605. bool Item_func_group_concat::add()
  1606. {
  1607.   if (always_null)
  1608.     return 0;
  1609.   copy_fields(tmp_table_param);
  1610.   copy_funcs(tmp_table_param->items_to_copy);
  1611.   for (Item **arg= args, **arg_end= args + arg_count_field;
  1612.        arg < arg_end; arg++)
  1613.   {
  1614.     if (!(*arg)->const_item() &&
  1615.         (*arg)->get_tmp_table_field()->is_null_in_record(
  1616.           (const uchar*) table->record[0]))
  1617. return 0; // Skip row if it contains null
  1618.   }
  1619.   null_value= FALSE;
  1620.   TREE_ELEMENT *el= 0;                          // Only for safety
  1621.   if (tree_mode)
  1622.     el= tree_insert(tree, table->record[0], 0, tree->custom_arg);
  1623.   /*
  1624.     If the row is not a duplicate (el->count == 1)
  1625.     we can dump the row here in case of GROUP_CONCAT(DISTINCT...)
  1626.     instead of doing tree traverse later.
  1627.   */
  1628.   if (result.length() <= group_concat_max_len && 
  1629.       !warning_for_row &&
  1630.       (!tree_mode || (el->count == 1 && distinct && !arg_count_order)))
  1631.     dump_leaf_key(table->record[0], 1, this);
  1632.   return 0;
  1633. }
  1634. void Item_func_group_concat::reset_field()
  1635. {
  1636.   DBUG_ASSERT(0);
  1637. }
  1638. bool
  1639. Item_func_group_concat::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
  1640. {
  1641.   uint i; /* for loop variable */ 
  1642.   DBUG_ASSERT(fixed == 0);
  1643.   if (!thd->allow_sum_func)
  1644.   {
  1645.     my_error(ER_INVALID_GROUP_FUNC_USE,MYF(0));
  1646.     return 1;
  1647.   }
  1648.   
  1649.   thd->allow_sum_func= 0;
  1650.   maybe_null= 1;
  1651.   item_thd= thd;
  1652.   /*
  1653.     Fix fields for select list and ORDER clause
  1654.   */
  1655.   for (i=0 ; i < arg_count ; i++)  
  1656.   {
  1657.     if ((!args[i]->fixed && 
  1658.          args[i]->fix_fields(thd, tables, args + i)) ||
  1659.         args[i]->check_cols(1))
  1660.       return 1;
  1661.   }
  1662.   if (agg_item_charsets(collation, func_name(),
  1663.                         args, arg_count, MY_COLL_ALLOW_CONV))
  1664.     return 1;
  1665.   result.set_charset(collation.collation);
  1666.   result_field= 0;
  1667.   null_value= 1;
  1668.   max_length= group_concat_max_len;
  1669.   thd->allow_sum_func= 1;
  1670.   tables_list= tables;
  1671.   fixed= 1;
  1672.   return 0;
  1673. }
  1674. bool Item_func_group_concat::setup(THD *thd)
  1675. {
  1676.   List<Item> list;
  1677.   SELECT_LEX *select_lex= thd->lex->current_select;
  1678.   uint const_fields;
  1679.   byte *record;
  1680.   qsort_cmp2 compare_key;
  1681.   DBUG_ENTER("Item_func_group_concat::setup");
  1682.   if (select_lex->linkage == GLOBAL_OPTIONS_TYPE)
  1683.     DBUG_RETURN(1);
  1684.   if (!(tmp_table_param= new TMP_TABLE_PARAM))
  1685.     return 1;
  1686.   /* We'll convert all blobs to varchar fields in the temporary table */
  1687.   tmp_table_param->convert_blob_length= group_concat_max_len;
  1688.   /*
  1689.     push all not constant fields to list and create temp table
  1690.   */ 
  1691.   const_fields= 0;
  1692.   always_null= 0;
  1693.   for (uint i= 0; i < arg_count_field; i++)
  1694.   {
  1695.     Item *item= args[i];
  1696.     if (list.push_back(item))
  1697.       DBUG_RETURN(1);
  1698.     if (item->const_item())
  1699.     {
  1700.       const_fields++;
  1701.       (void) item->val_int();
  1702.       if (item->null_value)
  1703. always_null= 1;
  1704.     }
  1705.   }
  1706.   if (always_null)
  1707.     DBUG_RETURN(0);
  1708.         
  1709.   List<Item> all_fields(list);
  1710.   if (arg_count_order) 
  1711.   {
  1712.     bool hidden_group_fields;
  1713.     setup_group(thd, args, tables_list, list, all_fields, *order,
  1714.                 &hidden_group_fields);
  1715.   }
  1716.   
  1717.   count_field_types(tmp_table_param,all_fields,0);
  1718.   if (table)
  1719.   {
  1720.     /*
  1721.       We come here when we are getting the result from a temporary table,
  1722.       not the original tables used in the query
  1723.     */
  1724.     free_tmp_table(thd, table);
  1725.     tmp_table_param->cleanup();
  1726.   }
  1727.   /*
  1728.     We have to create a temporary table to get descriptions of fields 
  1729.     (types, sizes and so on).
  1730.     Note that in the table, we first have the ORDER BY fields, then the
  1731.     field list.
  1732.     We need to set set_sum_field in true for storing value of blob in buffer 
  1733.     of a record instead of a pointer of one. 
  1734.   */
  1735.   if (!(table=create_tmp_table(thd, tmp_table_param, all_fields, 
  1736.        (ORDER*) 0, 0, TRUE,
  1737.                                select_lex->options | thd->options,
  1738.        HA_POS_ERROR,(char *) "")))
  1739.     DBUG_RETURN(1);
  1740.   table->file->extra(HA_EXTRA_NO_ROWS);
  1741.   table->no_rows= 1;
  1742.   key_length= table->reclength;
  1743.   record= table->record[0];
  1744.   /* Offset to first result field in table */
  1745.   field_list_offset= table->fields - (list.elements - const_fields);
  1746.   if (tree_mode)
  1747.     delete_tree(tree);
  1748.   /* choose function of sort */  
  1749.   tree_mode= distinct || arg_count_order; 
  1750.   if (tree_mode)
  1751.   {
  1752.     if (arg_count_order)
  1753.     {
  1754.       if (distinct)
  1755.         compare_key= (qsort_cmp2) group_concat_key_cmp_with_distinct_and_order;
  1756.       else
  1757.         compare_key= (qsort_cmp2) group_concat_key_cmp_with_order;
  1758.     }
  1759.     else
  1760.     {
  1761.       compare_key= (qsort_cmp2) group_concat_key_cmp_with_distinct;
  1762.     }
  1763.     /*
  1764.       Create a tree of sort. Tree is used for a sort and a remove double 
  1765.       values (according with syntax of the function). If function doesn't
  1766.       contain DISTINCT and ORDER BY clauses, we don't create this tree.
  1767.     */
  1768.     init_tree(tree, min(thd->variables.max_heap_table_size,
  1769. thd->variables.sortbuff_size/16), 0,
  1770.               key_length, compare_key, 0, NULL, (void*) this);
  1771.     max_elements_in_tree= (key_length ? 
  1772.    thd->variables.max_heap_table_size/key_length : 1);
  1773.   };
  1774.   /*
  1775.     Copy table and tree_mode if they belong to this item (if item have not 
  1776.     pointer to original item from which was made copy => it own its objects)
  1777.   */
  1778.   if (original)
  1779.   {
  1780.     original->table= table;
  1781.     original->tree_mode= tree_mode;
  1782.   }
  1783.   DBUG_RETURN(0);
  1784. }
  1785. /* This is used by rollup to create a separate usable copy of the function */
  1786. void Item_func_group_concat::make_unique()
  1787. {
  1788.   table=0;
  1789.   original= 0;
  1790.   tree_mode= 0; // to prevent delete_tree call on uninitialized tree
  1791.   tree= &tree_base;
  1792. }
  1793. String* Item_func_group_concat::val_str(String* str)
  1794. {
  1795.   DBUG_ASSERT(fixed == 1);
  1796.   if (null_value)
  1797.     return 0;
  1798.   if (count_cut_values && !warning)
  1799.     /*
  1800.       ER_CUT_VALUE_GROUP_CONCAT needs an argument, but this gets set in
  1801.       Item_func_group_concat::cleanup().
  1802.     */
  1803.     warning= push_warning(item_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
  1804.                           ER_CUT_VALUE_GROUP_CONCAT,
  1805.                           ER(ER_CUT_VALUE_GROUP_CONCAT));
  1806.   if (result.length())
  1807.     return &result;
  1808.   if (tree_mode)
  1809.   {
  1810.     tree_walk(tree, (tree_walk_action)&dump_leaf_key, (void*)this,
  1811.               left_root_right);
  1812.   }
  1813.   return &result;
  1814. }
  1815. void Item_func_group_concat::print(String *str)
  1816. {
  1817.   str->append("group_concat(", 13);
  1818.   if (distinct)
  1819.     str->append("distinct ", 9);
  1820.   for (uint i= 0; i < arg_count_field; i++)
  1821.   {
  1822.     if (i)
  1823.       str->append(',');
  1824.     args[i]->print(str);
  1825.   }
  1826.   if (arg_count_order)
  1827.   {
  1828.     str->append(" order by ", 10);
  1829.     for (uint i= 0 ; i < arg_count_order ; i++)
  1830.     {
  1831.       if (i)
  1832. str->append(',');
  1833.       (*order[i]->item)->print(str);
  1834.     }
  1835.   }
  1836.   str->append(" separator '", 12);
  1837.   str->append(*separator);
  1838.   str->append("')", 2);
  1839. }