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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /* Sum functions (COUNT, MIN...) */
  17. #ifdef __GNUC__
  18. #pragma implementation // gcc: Class implementation
  19. #endif
  20. #include "mysql_priv.h"
  21. Item_sum::Item_sum(List<Item> &list)
  22. {
  23.   arg_count=list.elements;
  24.   if ((args=(Item**) sql_alloc(sizeof(Item*)*arg_count)))
  25.   {
  26.     uint i=0;
  27.     List_iterator<Item> li(list);
  28.     Item *item;
  29.     while ((item=li++))
  30.     {
  31.       args[i++]= item;
  32.     }
  33.   }
  34.   with_sum_func=1;
  35.   list.empty(); // Fields are used
  36. }
  37. void Item_sum::make_field(Send_field *tmp_field)
  38. {
  39.   if (args[0]->type() == Item::FIELD_ITEM && keep_field_type())
  40.     ((Item_field*) args[0])->field->make_field(tmp_field);
  41.   else
  42.   {
  43.     tmp_field->flags=0;
  44.     if (!maybe_null)
  45.       tmp_field->flags|= NOT_NULL_FLAG;
  46.     tmp_field->length=max_length;
  47.     tmp_field->decimals=decimals;
  48.     tmp_field->type=(result_type() == INT_RESULT ? FIELD_TYPE_LONG :
  49.      result_type() == REAL_RESULT ? FIELD_TYPE_DOUBLE :
  50.      FIELD_TYPE_VAR_STRING);
  51.   }
  52.   tmp_field->table_name=(char*)"";
  53.   tmp_field->col_name=name;
  54. }
  55. void Item_sum::print(String *str)
  56. {
  57.   str->append(func_name());
  58.   str->append('(');
  59.   for (uint i=0 ; i < arg_count ; i++)
  60.   {
  61.     if (i)
  62.       str->append(',');
  63.     args[i]->print(str);
  64.   }
  65.   str->append(')');
  66. }
  67. void Item_sum::fix_num_length_and_dec()
  68. {
  69.   decimals=0;
  70.   for (uint i=0 ; i < arg_count ; i++)
  71.     set_if_bigger(decimals,args[i]->decimals);
  72.   max_length=float_length(decimals);
  73. }
  74. String *
  75. Item_sum_num::val_str(String *str)
  76. {
  77.   double nr=val();
  78.   if (null_value)
  79.     return 0;
  80.   str->set(nr,decimals);
  81.   return str;
  82. }
  83. String *
  84. Item_sum_int::val_str(String *str)
  85. {
  86.   longlong nr=val_int();
  87.   if (null_value)
  88.     return 0;
  89.   char buff[21];
  90.   uint length= (uint) (longlong10_to_str(nr,buff,-10)-buff);
  91.   str->copy(buff,length);
  92.   return str;
  93. }
  94. bool
  95. Item_sum_num::fix_fields(THD *thd,TABLE_LIST *tables)
  96. {
  97.   if (!thd->allow_sum_func)
  98.   {
  99.     my_error(ER_INVALID_GROUP_FUNC_USE,MYF(0));
  100.     return 1;
  101.   }
  102.   thd->allow_sum_func=0; // No included group funcs
  103.   decimals=0;
  104.   maybe_null=0;
  105.   for (uint i=0 ; i < arg_count ; i++)
  106.   {
  107.     if (args[i]->fix_fields(thd,tables))
  108.       return 1;
  109.     if (decimals < args[i]->decimals)
  110.       decimals=args[i]->decimals;
  111.     maybe_null |= args[i]->maybe_null;
  112.   }
  113.   result_field=0;
  114.   max_length=float_length(decimals);
  115.   null_value=1;
  116.   fix_length_and_dec();
  117.   thd->allow_sum_func=1; // Allow group functions
  118.   return 0;
  119. }
  120. bool
  121. Item_sum_hybrid::fix_fields(THD *thd,TABLE_LIST *tables)
  122. {
  123.   Item *item=args[0];
  124.   if (!thd->allow_sum_func)
  125.   {
  126.     my_error(ER_INVALID_GROUP_FUNC_USE,MYF(0));
  127.     return 1;
  128.   }
  129.   thd->allow_sum_func=0; // No included group funcs
  130.   if (item->fix_fields(thd,tables))
  131.     return 1;
  132.   hybrid_type=item->result_type();
  133.   if (hybrid_type == INT_RESULT)
  134.     max_length=21;
  135.   else if (hybrid_type == REAL_RESULT)
  136.     max_length=float_length(decimals);
  137.   else
  138.     max_length=item->max_length;
  139.   decimals=item->decimals;
  140.   maybe_null=item->maybe_null;
  141.   binary=item->binary;
  142.   result_field=0;
  143.   null_value=1;
  144.   fix_length_and_dec();
  145.   thd->allow_sum_func=1; // Allow group functions
  146.   return 0;
  147. }
  148. /***********************************************************************
  149. ** reset and add of sum_func
  150. ***********************************************************************/
  151. void Item_sum_sum::reset()
  152. {
  153.   null_value=0; sum=0.0; Item_sum_sum::add();
  154. }
  155. bool Item_sum_sum::add()
  156. {
  157.   sum+=args[0]->val();
  158.   return 0;
  159. }
  160. double Item_sum_sum::val()
  161. {
  162.   return sum;
  163. }
  164. void Item_sum_count::reset()
  165. {
  166.   count=0; add();
  167. }
  168. bool Item_sum_count::add()
  169. {
  170.   if (!args[0]->maybe_null)
  171.     count++;
  172.   else
  173.   {
  174.     (void) args[0]->val_int();
  175.     if (!args[0]->null_value)
  176.       count++;
  177.   }
  178.   return 0;
  179. }
  180. longlong Item_sum_count::val_int()
  181. {
  182.   return (longlong) count;
  183. }
  184. /*
  185. ** Avgerage
  186. */
  187. void Item_sum_avg::reset()
  188. {
  189.   sum=0.0; count=0; Item_sum_avg::add();
  190. }
  191. bool Item_sum_avg::add()
  192. {
  193.   double nr=args[0]->val();
  194.   if (!args[0]->null_value)
  195.   {
  196.     sum+=nr;
  197.     count++;
  198.   }
  199.   return 0;
  200. }
  201. double Item_sum_avg::val()
  202. {
  203.   if (!count)
  204.   {
  205.     null_value=1;
  206.     return 0.0;
  207.   }
  208.   null_value=0;
  209.   return sum/ulonglong2double(count);
  210. }
  211. /*
  212. ** Standard deviation
  213. */
  214. void Item_sum_std::reset()
  215. {
  216.   sum=sum_sqr=0.0; count=0; (void) Item_sum_std::add();
  217. }
  218. bool Item_sum_std::add()
  219. {
  220.   double nr=args[0]->val();
  221.   if (!args[0]->null_value)
  222.   {
  223.     sum+=nr;
  224.     sum_sqr+=nr*nr;
  225.     count++;
  226.   }
  227.   return 0;
  228. }
  229. double Item_sum_std::val()
  230. {
  231.   if (!count)
  232.   {
  233.     null_value=1;
  234.     return 0.0;
  235.   }
  236.   null_value=0;
  237.   /* Avoid problems when the precision isn't good enough */
  238.   double tmp=ulonglong2double(count);
  239.   double tmp2=(sum_sqr - sum*sum/tmp)/tmp;
  240.   return tmp2 <= 0.0 ? 0.0 : sqrt(tmp2);
  241. }
  242. void Item_sum_std::reset_field()
  243. {
  244.   double nr=args[0]->val();
  245.   char *res=result_field->ptr;
  246.   if (args[0]->null_value)
  247.     bzero(res,sizeof(double)*2+sizeof(longlong));
  248.   else
  249.   {
  250.     float8store(res,nr);
  251.     nr*=nr;
  252.     float8store(res+sizeof(double),nr);
  253.     longlong tmp=1;
  254.     int8store(res+sizeof(double)*2,tmp);
  255.   }
  256. }
  257. void Item_sum_std::update_field(int offset)
  258. {
  259.   double nr,old_nr,old_sqr;
  260.   longlong field_count;
  261.   char *res=result_field->ptr;
  262.   float8get(old_nr,res+offset);
  263.   float8get(old_sqr,res+offset+sizeof(double));
  264.   field_count=sint8korr(res+offset+sizeof(double)*2);
  265.   nr=args[0]->val();
  266.   if (!args[0]->null_value)
  267.   {
  268.     old_nr+=nr;
  269.     old_sqr+=nr*nr;
  270.     field_count++;
  271.   }
  272.   float8store(res,old_nr);
  273.   float8store(res+sizeof(double),old_sqr);
  274.   int8store(res+sizeof(double)*2,field_count);
  275. }
  276. /* min & max */
  277. double Item_sum_hybrid::val()
  278. {
  279.   if (null_value)
  280.     return 0.0;
  281.   if (hybrid_type == STRING_RESULT)
  282.   {
  283.     String *res;  res=val_str(&str_value);
  284.     return res ? atof(res->c_ptr()) : 0.0;
  285.   }
  286.   return sum;
  287. }
  288. String *
  289. Item_sum_hybrid::val_str(String *str)
  290. {
  291.   if (null_value)
  292.     return 0;
  293.   if (hybrid_type == STRING_RESULT)
  294.     return &value;
  295.   str->set(sum,decimals);
  296.   return str;
  297. }
  298. bool Item_sum_min::add()
  299. {
  300.   if (hybrid_type != STRING_RESULT)
  301.   {
  302.     double nr=args[0]->val();
  303.     if (!args[0]->null_value && (null_value || nr < sum))
  304.     {
  305.       sum=nr;
  306.       null_value=0;
  307.     }
  308.   }
  309.   else
  310.   {
  311.     String *result=args[0]->val_str(&tmp_value);
  312.     if (!args[0]->null_value &&
  313. (null_value ||
  314.  (binary ? stringcmp(&value,result) : sortcmp(&value,result)) > 0))
  315.     {
  316.       value.copy(*result);
  317.       null_value=0;
  318.     }
  319.   }
  320.   return 0;
  321. }
  322. bool Item_sum_max::add()
  323. {
  324.   if (hybrid_type != STRING_RESULT)
  325.   {
  326.     double nr=args[0]->val();
  327.     if (!args[0]->null_value && (null_value || nr > sum))
  328.     {
  329.       sum=nr;
  330.       null_value=0;
  331.     }
  332.   }
  333.   else
  334.   {
  335.     String *result=args[0]->val_str(&tmp_value);
  336.     if (!args[0]->null_value &&
  337. (null_value ||
  338.  (binary ? stringcmp(&value,result) : sortcmp(&value,result)) < 0))
  339.     {
  340.       value.copy(*result);
  341.       null_value=0;
  342.     }
  343.   }
  344.   return 0;
  345. }
  346. /* bit_or and bit_and */
  347. longlong Item_sum_bit::val_int()
  348. {
  349.   return (longlong) bits;
  350. }
  351. void Item_sum_bit::reset()
  352. {
  353.   bits=reset_bits; add();
  354. }
  355. bool Item_sum_or::add()
  356. {
  357.   ulonglong value= (ulonglong) args[0]->val_int();
  358.   if (!args[0]->null_value)
  359.     bits|=value;
  360.   return 0;
  361. }
  362. bool Item_sum_and::add()
  363. {
  364.   ulonglong value= (ulonglong) args[0]->val_int();
  365.   if (!args[0]->null_value)
  366.     bits&=value;
  367.   return 0;
  368. }
  369. /************************************************************************
  370. ** reset result of a Item_sum with is saved in a tmp_table
  371. *************************************************************************/
  372. void Item_sum_num::reset_field()
  373. {
  374.   double nr=args[0]->val();
  375.   char *res=result_field->ptr;
  376.   if (maybe_null)
  377.   {
  378.     if (args[0]->null_value)
  379.     {
  380.       nr=0.0;
  381.       result_field->set_null();
  382.     }
  383.     else
  384.       result_field->set_notnull();
  385.   }
  386.   float8store(res,nr);
  387. }
  388. void Item_sum_hybrid::reset_field()
  389. {
  390.   if (hybrid_type == STRING_RESULT)
  391.   {
  392.     char buff[MAX_FIELD_WIDTH];
  393.     String tmp(buff,sizeof(buff)),*res;
  394.     res=args[0]->val_str(&tmp);
  395.     if (args[0]->null_value)
  396.     {
  397.       result_field->set_null();
  398.       result_field->reset();
  399.     }
  400.     else
  401.     {
  402.       result_field->set_notnull();
  403.       result_field->store(res->ptr(),res->length());
  404.     }
  405.   }
  406.   else if (hybrid_type == INT_RESULT)
  407.   {
  408.     longlong nr=args[0]->val_int();
  409.     if (maybe_null)
  410.     {
  411.       if (args[0]->null_value)
  412.       {
  413. nr=0;
  414. result_field->set_null();
  415.       }
  416.       else
  417. result_field->set_notnull();
  418.     }
  419.     result_field->store(nr);
  420.   }
  421.   else // REAL_RESULT
  422.   {
  423.     double nr=args[0]->val();
  424.     if (maybe_null)
  425.     {
  426.       if (args[0]->null_value)
  427.       {
  428. nr=0.0;
  429. result_field->set_null();
  430.       }
  431.       else
  432. result_field->set_notnull();
  433.     }
  434.     result_field->store(nr);
  435.   }
  436. }
  437. void Item_sum_sum::reset_field()
  438. {
  439.   double nr=args[0]->val(); // Nulls also return 0
  440.   float8store(result_field->ptr,nr);
  441.   null_value=0;
  442.   result_field->set_notnull();
  443. }
  444. void Item_sum_count::reset_field()
  445. {
  446.   char *res=result_field->ptr;
  447.   longlong nr=0;
  448.   if (!args[0]->maybe_null)
  449.     nr=1;
  450.   else
  451.   {
  452.     (void) args[0]->val_int();
  453.     if (!args[0]->null_value)
  454.       nr=1;
  455.   }
  456.   int8store(res,nr);
  457. }
  458. void Item_sum_avg::reset_field()
  459. {
  460.   double nr=args[0]->val();
  461.   char *res=result_field->ptr;
  462.   if (args[0]->null_value)
  463.     bzero(res,sizeof(double)+sizeof(longlong));
  464.   else
  465.   {
  466.     float8store(res,nr);
  467.     res+=sizeof(double);
  468.     longlong tmp=1;
  469.     int8store(res,tmp);
  470.   }
  471. }
  472. void Item_sum_bit::reset_field()
  473. {
  474.   char *res=result_field->ptr;
  475.   ulonglong nr=(ulonglong) args[0]->val_int();
  476.   int8store(res,nr);
  477. }
  478. /*
  479. ** calc next value and merge it with field_value
  480. */
  481. void Item_sum_sum::update_field(int offset)
  482. {
  483.   double old_nr,nr;
  484.   char *res=result_field->ptr;
  485.   float8get(old_nr,res+offset);
  486.   nr=args[0]->val();
  487.   if (!args[0]->null_value)
  488.     old_nr+=nr;
  489.   float8store(res,old_nr);
  490. }
  491. void Item_sum_count::update_field(int offset)
  492. {
  493.   longlong nr;
  494.   char *res=result_field->ptr;
  495.   nr=sint8korr(res+offset);
  496.   if (!args[0]->maybe_null)
  497.     nr++;
  498.   else
  499.   {
  500.     (void) args[0]->val_int();
  501.     if (!args[0]->null_value)
  502.       nr++;
  503.   }
  504.   int8store(res,nr);
  505. }
  506. void Item_sum_avg::update_field(int offset)
  507. {
  508.   double nr,old_nr;
  509.   longlong field_count;
  510.   char *res=result_field->ptr;
  511.   float8get(old_nr,res+offset);
  512.   field_count=sint8korr(res+offset+sizeof(double));
  513.   nr=args[0]->val();
  514.   if (!args[0]->null_value)
  515.   {
  516.     old_nr+=nr;
  517.     field_count++;
  518.   }
  519.   float8store(res,old_nr);
  520.   res+=sizeof(double);
  521.   int8store(res,field_count);
  522. }
  523. void Item_sum_hybrid::update_field(int offset)
  524. {
  525.   if (hybrid_type == STRING_RESULT)
  526.     min_max_update_str_field(offset);
  527.   else if (hybrid_type == INT_RESULT)
  528.     min_max_update_int_field(offset);
  529.   else
  530.     min_max_update_real_field(offset);
  531. }
  532. void
  533. Item_sum_hybrid::min_max_update_str_field(int offset)
  534. {
  535.   String *res_str=args[0]->val_str(&value);
  536.   if (args[0]->null_value)
  537.     result_field->copy_from_tmp(offset); // Use old value
  538.   else
  539.   {
  540.     res_str->strip_sp();
  541.     result_field->ptr+=offset; // Get old max/min
  542.     result_field->val_str(&tmp_value,&tmp_value);
  543.     result_field->ptr-=offset;
  544.     if (result_field->is_null() ||
  545. (cmp_sign * (binary ? stringcmp(res_str,&tmp_value) :
  546.  sortcmp(res_str,&tmp_value)) < 0))
  547.       result_field->store(res_str->ptr(),res_str->length());
  548.     else
  549.     { // Use old value
  550.       char *res=result_field->ptr;
  551.       memcpy(res,res+offset,result_field->pack_length());
  552.     }
  553.     result_field->set_notnull();
  554.   }
  555. }
  556. void
  557. Item_sum_hybrid::min_max_update_real_field(int offset)
  558. {
  559.   double nr,old_nr;
  560.   result_field->ptr+=offset;
  561.   old_nr=result_field->val_real();
  562.   nr=args[0]->val();
  563.   if (!args[0]->null_value)
  564.   {
  565.     if (result_field->is_null(offset) ||
  566. (cmp_sign > 0 ? old_nr > nr : old_nr < nr))
  567.       old_nr=nr;
  568.     result_field->set_notnull();
  569.   }
  570.   else if (result_field->is_null(offset))
  571.     result_field->set_null();
  572.   result_field->ptr-=offset;
  573.   result_field->store(old_nr);
  574. }
  575. void
  576. Item_sum_hybrid::min_max_update_int_field(int offset)
  577. {
  578.   longlong nr,old_nr;
  579.   result_field->ptr+=offset;
  580.   old_nr=result_field->val_int();
  581.   nr=args[0]->val_int();
  582.   if (!args[0]->null_value)
  583.   {
  584.     if (result_field->is_null(offset) ||
  585. (cmp_sign > 0 ? old_nr > nr : old_nr < nr))
  586.       old_nr=nr;
  587.     result_field->set_notnull();
  588.   }
  589.   else if (result_field->is_null(offset))
  590.     result_field->set_null();
  591.   result_field->ptr-=offset;
  592.   result_field->store(old_nr);
  593. }
  594. void Item_sum_or::update_field(int offset)
  595. {
  596.   ulonglong nr;
  597.   char *res=result_field->ptr;
  598.   nr=uint8korr(res+offset);
  599.   nr|= (ulonglong) args[0]->val_int();
  600.   int8store(res,nr);
  601. }
  602. void Item_sum_and::update_field(int offset)
  603. {
  604.   ulonglong nr;
  605.   char *res=result_field->ptr;
  606.   nr=uint8korr(res+offset);
  607.   nr&= (ulonglong) args[0]->val_int();
  608.   int8store(res,nr);
  609. }
  610. Item_avg_field::Item_avg_field(Item_sum_avg *item)
  611. {
  612.   name=item->name;
  613.   decimals=item->decimals;
  614.   max_length=item->max_length;
  615.   field=item->result_field;
  616.   maybe_null=1;
  617. }
  618. double Item_avg_field::val()
  619. {
  620.   double nr;
  621.   longlong count;
  622.   float8get(nr,field->ptr);
  623.   char *res=(field->ptr+sizeof(double));
  624.   count=sint8korr(res);
  625.   if (!count)
  626.   {
  627.     null_value=1;
  628.     return 0.0;
  629.   }
  630.   null_value=0;
  631.   return nr/(double) count;
  632. }
  633. String *Item_avg_field::val_str(String *str)
  634. {
  635.   double nr=Item_avg_field::val();
  636.   if (null_value)
  637.     return 0;
  638.   str->set(nr,decimals);
  639.   return str;
  640. }
  641. Item_std_field::Item_std_field(Item_sum_std *item)
  642. {
  643.   name=item->name;
  644.   decimals=item->decimals;
  645.   max_length=item->max_length;
  646.   field=item->result_field;
  647.   maybe_null=1;
  648. }
  649. double Item_std_field::val()
  650. {
  651.   double sum,sum_sqr;
  652.   longlong count;
  653.   float8get(sum,field->ptr);
  654.   float8get(sum_sqr,(field->ptr+sizeof(double)));
  655.   count=sint8korr(field->ptr+sizeof(double)*2);
  656.   if (!count)
  657.   {
  658.     null_value=1;
  659.     return 0.0;
  660.   }
  661.   null_value=0;
  662.   double tmp= (double) count;
  663.   double tmp2=(sum_sqr - sum*sum/tmp)/tmp;
  664.   return tmp2 <= 0.0 ? 0.0 : sqrt(tmp2);
  665. }
  666. String *Item_std_field::val_str(String *str)
  667. {
  668.   double nr=val();
  669.   if (null_value)
  670.     return 0;
  671.   str->set(nr,decimals);
  672.   return str;
  673. }
  674. /****************************************************************************
  675. ** COUNT(DISTINCT ...)
  676. ****************************************************************************/
  677. #include "sql_select.h"
  678. Item_sum_count_distinct::~Item_sum_count_distinct()
  679. {
  680.   if (table)
  681.     free_tmp_table(current_thd, table);
  682.   delete tmp_table_param;
  683. }
  684. bool Item_sum_count_distinct::fix_fields(THD *thd,TABLE_LIST *tables)
  685. {
  686.   if (Item_sum_num::fix_fields(thd,tables) ||
  687.       !(tmp_table_param= new TMP_TABLE_PARAM))
  688.     return 1;
  689.   return 0;
  690. }
  691. bool Item_sum_count_distinct::setup(THD *thd)
  692. {
  693.   List<Item> list;
  694.   /* Create a table with an unique key over all parameters */
  695.   for (uint i=0; i < arg_count ; i++)
  696.     if (list.push_back(args[i]))
  697.       return 1;
  698.   count_field_types(tmp_table_param,list,0);
  699.   if (table)
  700.   {
  701.     free_tmp_table(thd, table);
  702.     tmp_table_param->cleanup();
  703.   }
  704.   if (!(table=create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1,
  705.        0, 0, current_lex->options | thd->options)))
  706.     return 1;
  707.   table->file->extra(HA_EXTRA_NO_ROWS); // Don't update rows
  708.   return 0;
  709. }
  710. void Item_sum_count_distinct::reset()
  711. {
  712.   table->file->extra(HA_EXTRA_NO_CACHE);
  713.   table->file->delete_all_rows();
  714.   table->file->extra(HA_EXTRA_WRITE_CACHE);
  715.   (void) add();
  716. }
  717. bool Item_sum_count_distinct::add()
  718. {
  719.   int error;
  720.   copy_fields(tmp_table_param);
  721.   copy_funcs(tmp_table_param->funcs);
  722.   for (Field **field=table->field ; *field ; field++)
  723.     if ((*field)->is_real_null(0))
  724.       return 0; // Don't count NULL
  725.   if ((error=table->file->write_row(table->record[0])))
  726.   {
  727.     if (error != HA_ERR_FOUND_DUPP_KEY &&
  728. error != HA_ERR_FOUND_DUPP_UNIQUE)
  729.     {
  730.       if (create_myisam_from_heap(table, tmp_table_param, error,1))
  731. return 1; // Not a table_is_full error
  732.     }
  733.   }
  734.   return 0;
  735. }
  736. longlong Item_sum_count_distinct::val_int()
  737. {
  738.   if (!table) // Empty query
  739.     return LL(0);
  740.   table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
  741.   return table->file->records;
  742. }
  743. /****************************************************************************
  744. ** Functions to handle dynamic loadable aggregates
  745. ** Original source by: Alexis Mikhailov <root@medinf.chuvashia.su>
  746. ** Adapted for UDAs by: Andreas F. Bobak <bobak@relog.ch>.
  747. ** Rewritten by: Monty.
  748. ****************************************************************************/
  749. #ifdef HAVE_DLOPEN
  750. void Item_udf_sum::reset()
  751. {
  752.   DBUG_ENTER("Item_udf_sum::reset");
  753.   udf.reset(&null_value);
  754.   DBUG_VOID_RETURN;
  755. }
  756. bool Item_udf_sum::add()
  757. {
  758.   DBUG_ENTER("Item_udf_sum::reset");
  759.   udf.add(&null_value);
  760.   DBUG_RETURN(0);
  761. }
  762. double Item_sum_udf_float::val()
  763. {
  764.   DBUG_ENTER("Item_sum_udf_float::val");
  765.   DBUG_PRINT("info",("result_type: %d  arg_count: %d",
  766.      args[0]->result_type(), arg_count));
  767.   DBUG_RETURN(udf.val(&null_value));
  768. }
  769. String *Item_sum_udf_float::val_str(String *str)
  770. {
  771.   double nr=val();
  772.   if (null_value)
  773.     return 0; /* purecov: inspected */
  774.   else
  775.     str->set(nr,decimals);
  776.   return str;
  777. }
  778. longlong Item_sum_udf_int::val_int()
  779. {
  780.   DBUG_ENTER("Item_sum_udf_int::val_int");
  781.   DBUG_PRINT("info",("result_type: %d  arg_count: %d",
  782.      args[0]->result_type(), arg_count));
  783.   DBUG_RETURN(udf.val_int(&null_value));
  784. }
  785. String *Item_sum_udf_int::val_str(String *str)
  786. {
  787.   longlong nr=val_int();
  788.   if (null_value)
  789.     return 0;
  790.   else
  791.     str->set(nr);
  792.   return str;
  793. }
  794. /* Default max_length is max argument length */
  795. void Item_sum_udf_str::fix_length_and_dec()
  796. {
  797.   DBUG_ENTER("Item_sum_udf_str::fix_length_and_dec");
  798.   max_length=0;
  799.   for (uint i = 0; i < arg_count; i++)
  800.     set_if_bigger(max_length,args[i]->max_length);
  801.   DBUG_VOID_RETURN;
  802. }
  803. String *Item_sum_udf_str::val_str(String *str)
  804. {
  805.   DBUG_ENTER("Item_sum_udf_str::str");
  806.   String *res=udf.val_str(str,&str_value);
  807.   null_value = !res;
  808.   DBUG_RETURN(res);
  809. }
  810. #endif /* HAVE_DLOPEN */