1
/* Copyright (C) 2000-2006 MySQL AB
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; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
21
/* classes for sum functions */
19
#ifdef USE_PRAGMA_INTERFACE
20
#pragma interface /* gcc class implementation */
23
24
#include <mysys/my_tree.h>
364
365
void no_rows_in_result() { clear(); }
366
virtual bool setup(THD *thd __attribute__((unused))) {return 0;}
367
virtual bool setup(Session *session __attribute__((unused))) {return 0;}
367
368
virtual void make_unique(void) {}
368
Item *get_tmp_table_item(THD *thd);
369
Item *get_tmp_table_item(Session *session);
369
370
virtual Field *create_tmp_field(bool group, Table *table,
370
uint convert_blob_length);
371
bool walk(Item_processor processor, bool walk_subquery, uchar *argument);
372
bool init_sum_func_check(THD *thd);
373
bool check_sum_func(THD *thd, Item **ref);
374
bool register_sum_func(THD *thd, Item **ref);
371
uint32_t convert_blob_length);
372
bool walk(Item_processor processor, bool walk_subquery, unsigned char *argument);
373
bool init_sum_func_check(Session *session);
374
bool check_sum_func(Session *session, Item **ref);
375
bool register_sum_func(Session *session, Item **ref);
375
376
st_select_lex *depended_from()
376
377
{ return (nest_level == aggr_level ? 0 : aggr_sel); }
755
751
double recurrence_m, recurrence_s; /* Used in recurrence relation. */
757
uint f_precision0, f_scale0;
758
uint f_precision1, f_scale1;
759
uint dec_bin_size0, dec_bin_size1;
753
uint32_t f_precision0, f_scale0;
754
uint32_t f_precision1, f_scale1;
755
uint32_t dec_bin_size0, dec_bin_size1;
757
uint32_t prec_increment;
763
Item_sum_variance(Item *item_par, uint sample_arg) :Item_sum_num(item_par),
759
Item_sum_variance(Item *item_par, uint32_t sample_arg) :Item_sum_num(item_par),
764
760
hybrid_type(REAL_RESULT), count(0), sample(sample_arg)
766
Item_sum_variance(THD *thd, Item_sum_variance *item);
762
Item_sum_variance(Session *session, Item_sum_variance *item);
767
763
enum Sumfunctype sum_func () const { return VARIANCE_FUNC; }
770
766
double val_real();
771
768
my_decimal *val_decimal(my_decimal *);
772
769
void reset_field();
773
770
void update_field();
806
803
class Item_sum_std :public Item_sum_variance
809
Item_sum_std(Item *item_par, uint sample_arg)
806
Item_sum_std(Item *item_par, uint32_t sample_arg)
810
807
:Item_sum_variance(item_par, sample_arg) {}
811
Item_sum_std(THD *thd, Item_sum_std *item)
812
:Item_sum_variance(thd, item)
808
Item_sum_std(Session *session, Item_sum_std *item)
809
:Item_sum_variance(session, item)
814
811
enum Sumfunctype sum_func () const { return STD_FUNC; }
815
812
double val_real();
816
813
Item *result_item(Field *field __attribute__((unused)))
817
814
{ return new Item_std_field(this); }
818
815
const char *func_name() const { return "std("; }
819
Item *copy_or_same(THD* thd);
816
Item *copy_or_same(Session* session);
820
817
enum Item_result result_type () const { return REAL_RESULT; }
821
818
enum_field_types field_type() const { return DRIZZLE_TYPE_DOUBLE;}
933
930
Item_sum_and(Item *item_par) :Item_sum_bit(item_par, UINT64_MAX) {}
934
Item_sum_and(THD *thd, Item_sum_and *item) :Item_sum_bit(thd, item) {}
931
Item_sum_and(Session *session, Item_sum_and *item) :Item_sum_bit(session, item) {}
936
933
const char *func_name() const { return "bit_and("; }
937
Item *copy_or_same(THD* thd);
934
Item *copy_or_same(Session* session);
940
937
class Item_sum_xor :public Item_sum_bit
943
Item_sum_xor(Item *item_par) :Item_sum_bit(item_par,0LL) {}
944
Item_sum_xor(THD *thd, Item_sum_xor *item) :Item_sum_bit(thd, item) {}
940
Item_sum_xor(Item *item_par) :Item_sum_bit(item_par,0) {}
941
Item_sum_xor(Session *session, Item_sum_xor *item) :Item_sum_bit(session, item) {}
946
943
const char *func_name() const { return "bit_xor("; }
947
Item *copy_or_same(THD* thd);
952
User defined aggregates
955
class Item_udf_sum : public Item_sum
961
Item_udf_sum(udf_func *udf_arg)
962
:Item_sum(), udf(udf_arg)
964
Item_udf_sum(udf_func *udf_arg, List<Item> &list)
965
:Item_sum(list), udf(udf_arg)
967
Item_udf_sum(THD *thd, Item_udf_sum *item)
968
:Item_sum(thd, item), udf(item->udf)
969
{ udf.not_original= true; }
970
const char *func_name() const { return udf.name(); }
971
bool fix_fields(THD *thd, Item **ref)
975
if (init_sum_func_check(thd))
979
if (udf.fix_fields(thd, this, this->arg_count, this->args))
982
return check_sum_func(thd, ref);
984
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
985
virtual bool have_field_update(void) const { return 0; }
989
void reset_field() {};
990
void update_field() {};
992
virtual void print(String *str, enum_query_type query_type);
996
class Item_sum_udf_float :public Item_udf_sum
999
Item_sum_udf_float(udf_func *udf_arg)
1000
:Item_udf_sum(udf_arg) {}
1001
Item_sum_udf_float(udf_func *udf_arg, List<Item> &list)
1002
:Item_udf_sum(udf_arg, list) {}
1003
Item_sum_udf_float(THD *thd, Item_sum_udf_float *item)
1004
:Item_udf_sum(thd, item) {}
1008
return (int64_t) rint(Item_sum_udf_float::val_real());
1011
String *val_str(String*str);
1012
my_decimal *val_decimal(my_decimal *);
1013
void fix_length_and_dec() { fix_num_length_and_dec(); }
1014
Item *copy_or_same(THD* thd);
1018
class Item_sum_udf_int :public Item_udf_sum
1021
Item_sum_udf_int(udf_func *udf_arg)
1022
:Item_udf_sum(udf_arg) {}
1023
Item_sum_udf_int(udf_func *udf_arg, List<Item> &list)
1024
:Item_udf_sum(udf_arg, list) {}
1025
Item_sum_udf_int(THD *thd, Item_sum_udf_int *item)
1026
:Item_udf_sum(thd, item) {}
1029
{ assert(fixed == 1); return (double) Item_sum_udf_int::val_int(); }
1030
String *val_str(String*str);
1031
my_decimal *val_decimal(my_decimal *);
1032
enum Item_result result_type () const { return INT_RESULT; }
1033
void fix_length_and_dec() { decimals=0; max_length=21; }
1034
Item *copy_or_same(THD* thd);
1038
class Item_sum_udf_str :public Item_udf_sum
1041
Item_sum_udf_str(udf_func *udf_arg)
1042
:Item_udf_sum(udf_arg) {}
1043
Item_sum_udf_str(udf_func *udf_arg, List<Item> &list)
1044
:Item_udf_sum(udf_arg,list) {}
1045
Item_sum_udf_str(THD *thd, Item_sum_udf_str *item)
1046
:Item_udf_sum(thd, item) {}
1047
String *val_str(String *);
1053
res=val_str(&str_value);
1054
return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),
1055
&end_not_used, &err_not_used) : 0.0;
1062
const CHARSET_INFO *cs;
1064
if (!(res= val_str(&str_value)))
1065
return 0; /* Null value */
1067
end= (char*) res->ptr()+res->length();
1068
return cs->cset->strtoll10(cs, res->ptr(), &end, &err_not_used);
1070
my_decimal *val_decimal(my_decimal *dec);
1071
enum Item_result result_type () const { return STRING_RESULT; }
1072
void fix_length_and_dec();
1073
Item *copy_or_same(THD* thd);
1077
class Item_sum_udf_decimal :public Item_udf_sum
1080
Item_sum_udf_decimal(udf_func *udf_arg)
1081
:Item_udf_sum(udf_arg) {}
1082
Item_sum_udf_decimal(udf_func *udf_arg, List<Item> &list)
1083
:Item_udf_sum(udf_arg, list) {}
1084
Item_sum_udf_decimal(THD *thd, Item_sum_udf_decimal *item)
1085
:Item_udf_sum(thd, item) {}
1086
String *val_str(String *);
1089
my_decimal *val_decimal(my_decimal *);
1090
enum Item_result result_type () const { return DECIMAL_RESULT; }
1091
void fix_length_and_dec() { fix_num_length_and_dec(); }
1092
Item *copy_or_same(THD* thd);
944
Item *copy_or_same(Session* session);
1095
949
class DRIZZLE_ERROR;