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
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 */
21
17
/* classes for sum functions */
19
#ifdef USE_PRAGMA_INTERFACE
20
#pragma interface /* gcc class implementation */
24
#include <mysys/my_tree.h>
27
26
Class Item_sum is the base class used for special expressions that SQL calls
227
226
{ COUNT_FUNC, COUNT_DISTINCT_FUNC, SUM_FUNC, SUM_DISTINCT_FUNC, AVG_FUNC,
228
227
AVG_DISTINCT_FUNC, MIN_FUNC, MAX_FUNC, STD_FUNC,
229
VARIANCE_FUNC, SUM_BIT_FUNC, GROUP_CONCAT_FUNC
228
VARIANCE_FUNC, SUM_BIT_FUNC, UDF_SUM_FUNC, GROUP_CONCAT_FUNC
232
231
Item **args, *tmp_args[2];
233
232
Item **ref_by; /* pointer to a ref to the object used to register it */
234
233
Item_sum *next; /* next in the circular chain of registered objects */
236
235
Item_sum *in_sum_func; /* embedding set function if any */
237
236
st_select_lex * aggr_sel; /* select where the function is aggregated */
238
int8_t nest_level; /* number of the nesting level of the set function */
239
int8_t aggr_level; /* nesting level of the aggregating subquery */
240
int8_t max_arg_level; /* max level of unbound column references */
241
int8_t max_sum_func_level;/* max level of aggregation for embedded functions */
237
int8 nest_level; /* number of the nesting level of the set function */
238
int8 aggr_level; /* nesting level of the aggregating subquery */
239
int8 max_arg_level; /* max level of unbound column references */
240
int8 max_sum_func_level;/* max level of aggregation for embedded functions */
242
241
bool quick_group; /* If incremental update of fields */
244
243
This list is used by the check for mixing non aggregated fields and
390
389
bool is_evaluated;
392
Item_sum_num() :Item_sum(),is_evaluated(false) {}
391
Item_sum_num() :Item_sum(),is_evaluated(FALSE) {}
393
392
Item_sum_num(Item *item_par)
394
:Item_sum(item_par), is_evaluated(false) {}
395
Item_sum_num(Item *a, Item* b) :Item_sum(a,b),is_evaluated(false) {}
393
:Item_sum(item_par), is_evaluated(FALSE) {}
394
Item_sum_num(Item *a, Item* b) :Item_sum(a,b),is_evaluated(FALSE) {}
396
395
Item_sum_num(List<Item> &list)
397
:Item_sum(list), is_evaluated(false) {}
396
:Item_sum(list), is_evaluated(FALSE) {}
398
397
Item_sum_num(THD *thd, Item_sum_num *item)
399
398
:Item_sum(thd, item),is_evaluated(item->is_evaluated) {}
400
399
bool fix_fields(THD *, Item **);
404
return (int64_t) rint(val_real()); /* Real as default */
402
DBUG_ASSERT(fixed == 1);
403
return (longlong) rint(val_real()); /* Real as default */
406
405
String *val_str(String*str);
407
406
my_decimal *val_decimal(my_decimal *);
583
582
will not recalculate on each call. Validitiy of the value is stored in
588
587
Following is 0 normal object and pointer to original one for copy
589
588
(to correctly free resources)
591
590
Item_sum_count_distinct *original;
592
uint32_t tree_key_length;
591
uint tree_key_length;
595
594
bool always_null; // Set to 1 if the result is always NULL
598
friend int composite_key_cmp(void* arg, unsigned char* key1, unsigned char* key2);
599
friend int simple_str_key_cmp(void* arg, unsigned char* key1, unsigned char* key2);
597
friend int composite_key_cmp(void* arg, uchar* key1, uchar* key2);
598
friend int simple_str_key_cmp(void* arg, uchar* key1, uchar* key2);
602
601
Item_sum_count_distinct(List<Item> &list)
603
602
:Item_sum_int(list), table(0), field_lengths(0), tmp_table_param(0),
604
603
force_copy_fields(0), tree(0), count(0),
605
original(0), always_null(false)
604
original(0), always_null(FALSE)
606
605
{ quick_group= 0; }
607
606
Item_sum_count_distinct(THD *thd, Item_sum_count_distinct *item)
608
607
:Item_sum_int(thd, item), table(item->table),
952
User defined aggregates
957
class Item_udf_sum : public Item_sum
963
Item_udf_sum(udf_func *udf_arg)
964
:Item_sum(), udf(udf_arg)
966
Item_udf_sum(udf_func *udf_arg, List<Item> &list)
967
:Item_sum(list), udf(udf_arg)
969
Item_udf_sum(THD *thd, Item_udf_sum *item)
970
:Item_sum(thd, item), udf(item->udf)
971
{ udf.not_original= TRUE; }
972
const char *func_name() const { return udf.name(); }
973
bool fix_fields(THD *thd, Item **ref)
975
DBUG_ASSERT(fixed == 0);
977
if (init_sum_func_check(thd))
981
if (udf.fix_fields(thd, this, this->arg_count, this->args))
984
return check_sum_func(thd, ref);
986
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
987
virtual bool have_field_update(void) const { return 0; }
991
void reset_field() {};
992
void update_field() {};
994
virtual void print(String *str, enum_query_type query_type);
998
class Item_sum_udf_float :public Item_udf_sum
1001
Item_sum_udf_float(udf_func *udf_arg)
1002
:Item_udf_sum(udf_arg) {}
1003
Item_sum_udf_float(udf_func *udf_arg, List<Item> &list)
1004
:Item_udf_sum(udf_arg, list) {}
1005
Item_sum_udf_float(THD *thd, Item_sum_udf_float *item)
1006
:Item_udf_sum(thd, item) {}
1009
DBUG_ASSERT(fixed == 1);
1010
return (longlong) rint(Item_sum_udf_float::val_real());
1013
String *val_str(String*str);
1014
my_decimal *val_decimal(my_decimal *);
1015
void fix_length_and_dec() { fix_num_length_and_dec(); }
1016
Item *copy_or_same(THD* thd);
1020
class Item_sum_udf_int :public Item_udf_sum
1023
Item_sum_udf_int(udf_func *udf_arg)
1024
:Item_udf_sum(udf_arg) {}
1025
Item_sum_udf_int(udf_func *udf_arg, List<Item> &list)
1026
:Item_udf_sum(udf_arg, list) {}
1027
Item_sum_udf_int(THD *thd, Item_sum_udf_int *item)
1028
:Item_udf_sum(thd, item) {}
1031
{ DBUG_ASSERT(fixed == 1); return (double) Item_sum_udf_int::val_int(); }
1032
String *val_str(String*str);
1033
my_decimal *val_decimal(my_decimal *);
1034
enum Item_result result_type () const { return INT_RESULT; }
1035
void fix_length_and_dec() { decimals=0; max_length=21; }
1036
Item *copy_or_same(THD* thd);
1040
class Item_sum_udf_str :public Item_udf_sum
1043
Item_sum_udf_str(udf_func *udf_arg)
1044
:Item_udf_sum(udf_arg) {}
1045
Item_sum_udf_str(udf_func *udf_arg, List<Item> &list)
1046
:Item_udf_sum(udf_arg,list) {}
1047
Item_sum_udf_str(THD *thd, Item_sum_udf_str *item)
1048
:Item_udf_sum(thd, item) {}
1049
String *val_str(String *);
1055
res=val_str(&str_value);
1056
return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),
1057
&end_not_used, &err_not_used) : 0.0;
1066
if (!(res= val_str(&str_value)))
1067
return 0; /* Null value */
1069
end= (char*) res->ptr()+res->length();
1070
return cs->cset->strtoll10(cs, res->ptr(), &end, &err_not_used);
1072
my_decimal *val_decimal(my_decimal *dec);
1073
enum Item_result result_type () const { return STRING_RESULT; }
1074
void fix_length_and_dec();
1075
Item *copy_or_same(THD* thd);
1079
class Item_sum_udf_decimal :public Item_udf_sum
1082
Item_sum_udf_decimal(udf_func *udf_arg)
1083
:Item_udf_sum(udf_arg) {}
1084
Item_sum_udf_decimal(udf_func *udf_arg, List<Item> &list)
1085
:Item_udf_sum(udf_arg, list) {}
1086
Item_sum_udf_decimal(THD *thd, Item_sum_udf_decimal *item)
1087
:Item_udf_sum(thd, item) {}
1088
String *val_str(String *);
1091
my_decimal *val_decimal(my_decimal *);
1092
enum Item_result result_type () const { return DECIMAL_RESULT; }
1093
void fix_length_and_dec() { fix_num_length_and_dec(); }
1094
Item *copy_or_same(THD* thd);
1097
#else /* Dummy functions to get sql_yacc.cc compiled */
1099
class Item_sum_udf_float :public Item_sum_num
1102
Item_sum_udf_float(udf_func *udf_arg)
1104
Item_sum_udf_float(udf_func *udf_arg, List<Item> &list) :Item_sum_num() {}
1105
Item_sum_udf_float(THD *thd, Item_sum_udf_float *item)
1106
:Item_sum_num(thd, item) {}
1107
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
1108
double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; }
1110
bool add() { return 0; }
1111
void update_field() {}
1115
class Item_sum_udf_int :public Item_sum_num
1118
Item_sum_udf_int(udf_func *udf_arg)
1120
Item_sum_udf_int(udf_func *udf_arg, List<Item> &list) :Item_sum_num() {}
1121
Item_sum_udf_int(THD *thd, Item_sum_udf_int *item)
1122
:Item_sum_num(thd, item) {}
1123
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
1124
longlong val_int() { DBUG_ASSERT(fixed == 1); return 0; }
1125
double val_real() { DBUG_ASSERT(fixed == 1); return 0; }
1127
bool add() { return 0; }
1128
void update_field() {}
1132
class Item_sum_udf_decimal :public Item_sum_num
1135
Item_sum_udf_decimal(udf_func *udf_arg)
1137
Item_sum_udf_decimal(udf_func *udf_arg, List<Item> &list)
1139
Item_sum_udf_decimal(THD *thd, Item_sum_udf_float *item)
1140
:Item_sum_num(thd, item) {}
1141
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
1142
double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; }
1143
my_decimal *val_decimal(my_decimal *) { DBUG_ASSERT(fixed == 1); return 0; }
1145
bool add() { return 0; }
1146
void update_field() {}
1150
class Item_sum_udf_str :public Item_sum_num
1153
Item_sum_udf_str(udf_func *udf_arg)
1155
Item_sum_udf_str(udf_func *udf_arg, List<Item> &list)
1157
Item_sum_udf_str(THD *thd, Item_sum_udf_str *item)
1158
:Item_sum_num(thd, item) {}
1159
String *val_str(String *)
1160
{ DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
1161
double val_real() { DBUG_ASSERT(fixed == 1); null_value=1; return 0.0; }
1162
longlong val_int() { DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
1163
enum Item_result result_type () const { return STRING_RESULT; }
1164
void fix_length_and_dec() { maybe_null=1; max_length=0; }
1165
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
1167
bool add() { return 0; }
1168
void update_field() {}
1171
#endif /* HAVE_DLOPEN */
955
1175
class Item_func_group_concat : public Item_sum
957
1177
TMP_TABLE_PARAM *tmp_table_param;
958
DRIZZLE_ERROR *warning;
1178
MYSQL_ERROR *warning;
960
1180
String *separator;