summaryrefslogtreecommitdiff
path: root/sql/item_sum.h
diff options
context:
space:
mode:
authorkroki/tomash@moonlight.intranet <>2006-10-10 17:18:36 +0400
committerkroki/tomash@moonlight.intranet <>2006-10-10 17:18:36 +0400
commit0d457976eab5b7ed7bd0b9efb1e0b591574550de (patch)
treec881185e4a66dc674d6e798f91b22b8027ec5f16 /sql/item_sum.h
parent76c5979f9ed14b8e2d2856a5ff0f60630f13aa5e (diff)
parentfbf6507cf74688be3b5b687c3f99f3ef88e8dcb9 (diff)
downloadmariadb-git-0d457976eab5b7ed7bd0b9efb1e0b591574550de.tar.gz
Merge moonlight.intranet:/home/tomash/src/mysql_ab/mysql-4.1-bug21354
into moonlight.intranet:/home/tomash/src/mysql_ab/mysql-5.0-bug21354
Diffstat (limited to 'sql/item_sum.h')
-rw-r--r--sql/item_sum.h48
1 files changed, 47 insertions, 1 deletions
diff --git a/sql/item_sum.h b/sql/item_sum.h
index f1ea95214de..4a0930184c7 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -260,9 +260,30 @@ public:
Item_sum(THD *thd, Item_sum *item);
enum Type type() const { return SUM_FUNC_ITEM; }
virtual enum Sumfunctype sum_func () const=0;
+
+ /*
+ This method is similar to add(), but it is called when the current
+ aggregation group changes. Thus it performs a combination of
+ clear() and add().
+ */
inline bool reset() { clear(); return add(); };
+
+ /*
+ Prepare this item for evaluation of an aggregate value. This is
+ called by reset() when a group changes, or, for correlated
+ subqueries, between subquery executions. E.g. for COUNT(), this
+ method should set count= 0;
+ */
virtual void clear()= 0;
+
+ /*
+ This method is called for the next row in the same group. Its
+ purpose is to aggregate the new value to the previous values in
+ the group (i.e. since clear() was called last time). For example,
+ for COUNT(), do count++.
+ */
virtual bool add()=0;
+
/*
Called when new group is started and results are being saved in
a temporary table. Similar to reset(), but must also store value in
@@ -306,7 +327,17 @@ public:
void make_field(Send_field *field);
void print(String *str);
void fix_num_length_and_dec();
- void no_rows_in_result() { reset(); }
+
+ /*
+ This function is called by the execution engine to assign 'NO ROWS
+ FOUND' value to an aggregate item, when the underlying result set
+ has no rows. Such value, in a general case, may be different from
+ the default value of the item after 'clear()': e.g. a numeric item
+ may be initialized to 0 by clear() and to NULL by
+ no_rows_in_result().
+ */
+ void no_rows_in_result() { clear(); }
+
virtual bool setup(THD *thd) {return 0;}
virtual void make_unique() {}
Item *get_tmp_table_item(THD *thd);
@@ -610,6 +641,11 @@ public:
const char *func_name() const { return "avg("; }
Item *copy_or_same(THD* thd);
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
+ void cleanup()
+ {
+ clear();
+ Item_sum_num::cleanup();
+ }
};
class Item_sum_variance;
@@ -689,6 +725,11 @@ public:
Item *copy_or_same(THD* thd);
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
enum Item_result result_type () const { return REAL_RESULT; }
+ void cleanup()
+ {
+ clear();
+ Item_sum_num::cleanup();
+ }
};
class Item_sum_std;
@@ -819,6 +860,11 @@ public:
void update_field();
void fix_length_and_dec()
{ decimals= 0; max_length=21; unsigned_flag= 1; maybe_null= null_value= 0; }
+ void cleanup()
+ {
+ clear();
+ Item_sum_int::cleanup();
+ }
};