235
235
Item_sum *in_sum_func; /* embedding set function if any */
236
236
st_select_lex * aggr_sel; /* select where the function is aggregated */
237
int8_t nest_level; /* number of the nesting level of the set function */
238
int8_t aggr_level; /* nesting level of the aggregating subquery */
239
int8_t max_arg_level; /* max level of unbound column references */
240
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 */
241
241
bool quick_group; /* If incremental update of fields */
243
243
This list is used by the check for mixing non aggregated fields and
256
256
void mark_as_sum_func();
257
Item_sum() :arg_count(0), quick_group(1), forced_const(false)
257
Item_sum() :arg_count(0), quick_group(1), forced_const(FALSE)
259
259
mark_as_sum_func();
261
261
Item_sum(Item *a) :args(tmp_args), arg_count(1), quick_group(1),
265
265
mark_as_sum_func();
267
267
Item_sum( Item *a, Item *b ) :args(tmp_args), arg_count(2), quick_group(1),
270
270
args[0]=a; args[1]=b;
271
271
mark_as_sum_func();
364
364
void no_rows_in_result() { clear(); }
366
virtual bool setup(THD *thd __attribute__((unused))) {return 0;}
366
virtual bool setup(THD *thd __attribute__((__unused__))) {return 0;}
367
367
virtual void make_unique(void) {}
368
368
Item *get_tmp_table_item(THD *thd);
369
virtual Field *create_tmp_field(bool group, Table *table,
369
virtual Field *create_tmp_field(bool group, TABLE *table,
370
370
uint convert_blob_length);
371
371
bool walk(Item_processor processor, bool walk_subquery, uchar *argument);
372
372
bool init_sum_func_check(THD *thd);
389
389
bool is_evaluated;
391
Item_sum_num() :Item_sum(),is_evaluated(false) {}
391
Item_sum_num() :Item_sum(),is_evaluated(FALSE) {}
392
392
Item_sum_num(Item *item_par)
393
:Item_sum(item_par), is_evaluated(false) {}
394
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) {}
395
395
Item_sum_num(List<Item> &list)
396
:Item_sum(list), is_evaluated(false) {}
396
:Item_sum(list), is_evaluated(FALSE) {}
397
397
Item_sum_num(THD *thd, Item_sum_num *item)
398
398
:Item_sum(thd, item),is_evaluated(item->is_evaluated) {}
399
399
bool fix_fields(THD *, Item **);
403
return (int64_t) rint(val_real()); /* Real as default */
402
DBUG_ASSERT(fixed == 1);
403
return (longlong) rint(val_real()); /* Real as default */
405
405
String *val_str(String*str);
406
406
my_decimal *val_decimal(my_decimal *);
414
414
Item_sum_int(Item *item_par) :Item_sum_num(item_par) {}
415
415
Item_sum_int(List<Item> &list) :Item_sum_num(list) {}
416
416
Item_sum_int(THD *thd, Item_sum_int *item) :Item_sum_num(thd, item) {}
417
double val_real() { assert(fixed == 1); return (double) val_int(); }
417
double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
418
418
String *val_str(String*str);
419
419
my_decimal *val_decimal(my_decimal *);
420
420
enum Item_result result_type () const { return INT_RESULT; }
601
601
Item_sum_count_distinct(List<Item> &list)
602
602
:Item_sum_int(list), table(0), field_lengths(0), tmp_table_param(0),
603
603
force_copy_fields(0), tree(0), count(0),
604
original(0), always_null(false)
604
original(0), always_null(FALSE)
605
605
{ quick_group= 0; }
606
606
Item_sum_count_distinct(THD *thd, Item_sum_count_distinct *item)
607
607
:Item_sum_int(thd, item), table(item->table),
643
643
Item_avg_field(Item_result res_type, Item_sum_avg *item);
644
644
enum Type type() const { return FIELD_AVG_ITEM; }
645
645
double val_real();
647
647
my_decimal *val_decimal(my_decimal *);
648
648
bool is_null() { update_null_value(); return null_value; }
649
649
String *val_str(String*);
650
650
enum_field_types field_type() const
652
652
return hybrid_type == DECIMAL_RESULT ?
653
DRIZZLE_TYPE_NEWDECIMAL : DRIZZLE_TYPE_DOUBLE;
653
MYSQL_TYPE_NEWDECIMAL : MYSQL_TYPE_DOUBLE;
655
655
void fix_length_and_dec() {}
656
656
enum Item_result result_type () const { return hybrid_type; }
676
676
double val_real();
677
677
// In SPs we might force the "wrong" type with select into a declare variable
678
int64_t val_int() { return (int64_t) rint(val_real()); }
678
longlong val_int() { return (longlong) rint(val_real()); }
679
679
my_decimal *val_decimal(my_decimal *);
680
680
String *val_str(String *str);
681
681
void reset_field();
682
682
void update_field();
683
Item *result_item(Field *field __attribute__((unused)))
683
Item *result_item(Field *field __attribute__((__unused__)))
684
684
{ return new Item_avg_field(hybrid_type, this); }
685
685
void no_rows_in_result() {}
686
686
const char *func_name() const { return "avg("; }
687
687
Item *copy_or_same(THD* thd);
688
Field *create_tmp_field(bool group, Table *table, uint convert_blob_length);
688
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
708
708
Item_variance_field(Item_sum_variance *item);
709
709
enum Type type() const {return FIELD_VARIANCE_ITEM; }
710
710
double val_real();
712
{ /* can't be fix_fields()ed */ return (int64_t) rint(val_real()); }
712
{ /* can't be fix_fields()ed */ return (longlong) rint(val_real()); }
713
713
String *val_str(String *str)
714
714
{ return val_string_from_real(str); }
715
715
my_decimal *val_decimal(my_decimal *dec_buf)
771
771
my_decimal *val_decimal(my_decimal *);
772
772
void reset_field();
773
773
void update_field();
774
Item *result_item(Field *field __attribute__((unused)))
774
Item *result_item(Field *field __attribute__((__unused__)))
775
775
{ return new Item_variance_field(this); }
776
776
void no_rows_in_result() {}
777
777
const char *func_name() const
778
778
{ return sample ? "var_samp(" : "variance("; }
779
779
Item *copy_or_same(THD* thd);
780
Field *create_tmp_field(bool group, Table *table, uint convert_blob_length);
780
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
781
781
enum Item_result result_type () const { return REAL_RESULT; }
814
814
enum Sumfunctype sum_func () const { return STD_FUNC; }
815
815
double val_real();
816
Item *result_item(Field *field __attribute__((unused)))
816
Item *result_item(Field *field __attribute__((__unused__)))
817
817
{ return new Item_std_field(this); }
818
818
const char *func_name() const { return "std("; }
819
819
Item *copy_or_same(THD* thd);
820
820
enum Item_result result_type () const { return REAL_RESULT; }
821
enum_field_types field_type() const { return DRIZZLE_TYPE_DOUBLE;}
821
enum_field_types field_type() const { return MYSQL_TYPE_DOUBLE;}
824
824
// This class is a string or number function depending on num_func
839
839
Item_sum_hybrid(Item *item_par,int sign)
840
840
:Item_sum(item_par), sum(0.0), sum_int(0),
841
hybrid_type(INT_RESULT), hybrid_field_type(DRIZZLE_TYPE_LONGLONG),
842
cmp_sign(sign), was_values(true)
841
hybrid_type(INT_RESULT), hybrid_field_type(MYSQL_TYPE_LONGLONG),
842
cmp_sign(sign), was_values(TRUE)
843
843
{ collation.set(&my_charset_bin); }
844
844
Item_sum_hybrid(THD *thd, Item_sum_hybrid *item);
845
845
bool fix_fields(THD *, Item **);
847
847
double val_real();
849
849
my_decimal *val_decimal(my_decimal *);
850
850
void reset_field();
851
851
String *val_str(String *);
894
894
class Item_sum_bit :public Item_sum_int
897
uint64_t reset_bits,bits;
897
ulonglong reset_bits,bits;
900
Item_sum_bit(Item *item_par,uint64_t reset_arg)
900
Item_sum_bit(Item *item_par,ulonglong reset_arg)
901
901
:Item_sum_int(item_par),reset_bits(reset_arg),bits(reset_arg) {}
902
902
Item_sum_bit(THD *thd, Item_sum_bit *item):
903
903
Item_sum_int(thd, item), reset_bits(item->reset_bits), bits(item->bits) {}
904
904
enum Sumfunctype sum_func () const {return SUM_BIT_FUNC;}
907
907
void reset_field();
908
908
void update_field();
909
909
void fix_length_and_dec()
930
930
class Item_sum_and :public Item_sum_bit
933
Item_sum_and(Item *item_par) :Item_sum_bit(item_par, UINT64_MAX) {}
933
Item_sum_and(Item *item_par) :Item_sum_bit(item_par, ULONGLONG_MAX) {}
934
934
Item_sum_and(THD *thd, Item_sum_and *item) :Item_sum_bit(thd, item) {}
936
936
const char *func_name() const { return "bit_and("; }
966
968
{ quick_group=0;}
967
969
Item_udf_sum(THD *thd, Item_udf_sum *item)
968
970
:Item_sum(thd, item), udf(item->udf)
969
{ udf.not_original= true; }
971
{ udf.not_original= TRUE; }
970
972
const char *func_name() const { return udf.name(); }
971
973
bool fix_fields(THD *thd, Item **ref)
975
DBUG_ASSERT(fixed == 0);
975
977
if (init_sum_func_check(thd))
979
981
if (udf.fix_fields(thd, this, this->arg_count, this->args))
982
984
return check_sum_func(thd, ref);
1002
1004
:Item_udf_sum(udf_arg, list) {}
1003
1005
Item_sum_udf_float(THD *thd, Item_sum_udf_float *item)
1004
1006
:Item_udf_sum(thd, item) {}
1008
return (int64_t) rint(Item_sum_udf_float::val_real());
1009
DBUG_ASSERT(fixed == 1);
1010
return (longlong) rint(Item_sum_udf_float::val_real());
1010
1012
double val_real();
1011
1013
String *val_str(String*str);
1024
1026
:Item_udf_sum(udf_arg, list) {}
1025
1027
Item_sum_udf_int(THD *thd, Item_sum_udf_int *item)
1026
1028
:Item_udf_sum(thd, item) {}
1028
1030
double val_real()
1029
{ assert(fixed == 1); return (double) Item_sum_udf_int::val_int(); }
1031
{ DBUG_ASSERT(fixed == 1); return (double) Item_sum_udf_int::val_int(); }
1030
1032
String *val_str(String*str);
1031
1033
my_decimal *val_decimal(my_decimal *);
1032
1034
enum Item_result result_type () const { return INT_RESULT; }
1085
1087
:Item_udf_sum(thd, item) {}
1086
1088
String *val_str(String *);
1087
1089
double val_real();
1089
1091
my_decimal *val_decimal(my_decimal *);
1090
1092
enum Item_result result_type () const { return DECIMAL_RESULT; }
1091
1093
void fix_length_and_dec() { fix_num_length_and_dec(); }
1092
1094
Item *copy_or_same(THD* thd);
1095
class DRIZZLE_ERROR;
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 */
1097
1175
class Item_func_group_concat : public Item_sum
1099
1177
TMP_TABLE_PARAM *tmp_table_param;
1100
DRIZZLE_ERROR *warning;
1178
MYSQL_ERROR *warning;
1102
1180
String *separator;
1103
1181
TREE tree_base;
1153
1231
enum_field_types field_type() const
1155
1233
if (max_length/collation.collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB )
1156
return DRIZZLE_TYPE_BLOB;
1234
return MYSQL_TYPE_BLOB;
1158
return DRIZZLE_TYPE_VARCHAR;
1236
return MYSQL_TYPE_VARCHAR;
1162
void reset_field() { assert(0); } // not used
1163
void update_field() { assert(0); } // not used
1240
void reset_field() { DBUG_ASSERT(0); } // not used
1241
void update_field() { DBUG_ASSERT(0); } // not used
1164
1242
bool fix_fields(THD *,Item **);
1165
1243
bool setup(THD *thd);
1166
1244
void make_unique();