diff options
author | Vicențiu Ciorbaru <vicentiu@mariadb.org> | 2016-09-01 18:10:15 +0300 |
---|---|---|
committer | Vicențiu Ciorbaru <vicentiu@mariadb.org> | 2016-09-09 18:32:35 +0300 |
commit | 23e8b508a00a23653da436519371943487ad6fe4 (patch) | |
tree | 39640892aea08485ea2eb8f9005472b1808d500c /sql/sql_window.h | |
parent | 19d24f011cc16efd0edb4ca8cc9ce8c720842961 (diff) | |
download | mariadb-git-23e8b508a00a23653da436519371943487ad6fe4.tar.gz |
MDEV-10059: Compute window functions with same sorting criteria simultaneously
Perform only one table scan for each window function present. We do this
by keeping keeping cursors for each window function frame bound and
running them for each function for every row.
Diffstat (limited to 'sql/sql_window.h')
-rw-r--r-- | sql/sql_window.h | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/sql/sql_window.h b/sql/sql_window.h index 54e39d827fe..c3847240e9a 100644 --- a/sql/sql_window.h +++ b/sql/sql_window.h @@ -154,9 +154,7 @@ int setup_windows(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, // Classes that make window functions computation a part of SELECT's query plan ////////////////////////////////////////////////////////////////////////////// -typedef bool (*window_compute_func_t)(Item_window_func *item_win, - TABLE *tbl, READ_RECORD *info); - +class Frame_cursor; /* This handles computation of one window function. @@ -165,21 +163,17 @@ typedef bool (*window_compute_func_t)(Item_window_func *item_win, class Window_func_runner : public Sql_alloc { - Item_window_func *win_func; - - /* The function to use for computation*/ - window_compute_func_t compute_func; - public: - Window_func_runner(Item_window_func *win_func_arg) : - win_func(win_func_arg) - {} + /* Add the function to be computed during the execution pass */ + bool add_function_to_run(Item_window_func *win_func); - // Set things up. Create filesort structures, etc - bool setup(THD *thd); - - // This sorts and runs the window function. - bool exec(TABLE *tbl, SORT_INFO *filesort_result); + /* Compute and fill the fields in the table. */ + bool exec(THD *thd, TABLE *tbl, SORT_INFO *filesort_result); + +private: + /* A list of window functions for which this Window_func_runner will compute + values during the execution phase. */ + List<Item_window_func> window_functions; }; @@ -191,21 +185,24 @@ public: class Window_funcs_sort : public Sql_alloc { - List<Window_func_runner> runners; - - /* Window functions can be computed over this sorting */ - Filesort *filesort; public: bool setup(THD *thd, SQL_SELECT *sel, List_iterator<Item_window_func> &it); bool exec(JOIN *join); void cleanup() { delete filesort; } friend class Window_funcs_computation; + +private: + Window_func_runner runner; + + /* Window functions can be computed over this sorting */ + Filesort *filesort; }; struct st_join_table; class Explain_aggr_window_funcs; + /* This is a "window function computation phase": a single object of this class takes care of computing all window functions in a SELECT. |