diff options
author | kroki/tomash@moonlight.intranet <> | 2006-10-10 17:18:36 +0400 |
---|---|---|
committer | kroki/tomash@moonlight.intranet <> | 2006-10-10 17:18:36 +0400 |
commit | 0d457976eab5b7ed7bd0b9efb1e0b591574550de (patch) | |
tree | c881185e4a66dc674d6e798f91b22b8027ec5f16 /sql/item_sum.h | |
parent | 76c5979f9ed14b8e2d2856a5ff0f60630f13aa5e (diff) | |
parent | fbf6507cf74688be3b5b687c3f99f3ef88e8dcb9 (diff) | |
download | mariadb-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.h | 48 |
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(); + } }; |