From 39d3cdbf22acc21f0ac784807ccfcacb98cfd36e Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 24 Mar 2016 02:57:03 +0300 Subject: [PATCH] Encapsulate the switching between different return values in Item_window_func --- sql/item_windowfunc.cc | 3 +-- sql/item_windowfunc.h | 39 ++++++++++++++++++++++++++------------- sql/sql_window.cc | 4 ++-- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/sql/item_windowfunc.cc b/sql/item_windowfunc.cc index 1add0fa68db..8216cbcf441 100644 --- a/sql/item_windowfunc.cc +++ b/sql/item_windowfunc.cc @@ -112,8 +112,7 @@ Item_window_func::fix_fields(THD *thd, Item **ref) maybe_null= window_func()->maybe_null; fixed= 1; - force_return_blank= true; - read_value_from_result_field= false; + set_phase_to_initial(); return false; } diff --git a/sql/item_windowfunc.h b/sql/item_windowfunc.h index a0cba79fee1..04bd686c9fc 100644 --- a/sql/item_windowfunc.h +++ b/sql/item_windowfunc.h @@ -549,28 +549,41 @@ public: Window functions are very special functions, so val_() methods have special meaning for them: - - Phase#1: we run the join and put its result into temporary table. For - window functions, we write NULL (or some other) values as placeholders. + - Phase#1, "Initial" we run the join and put its result into temporary + table. For window functions, we write the default value (NULL?) as + a placeholder. - - Phase#2: executor does the scan in {PARTITION, ORDER BY} order of this - window function. It calls appropriate methods to inform the window - function about rows entering/leaving the window. - It calls window_func()->val_int() so that current window function value + - Phase#2: "Computation": executor does the scan in {PARTITION, ORDER BY} + order of this window function. It calls appropriate methods to inform + the window function about rows entering/leaving the window. + It calls window_func()->val_int() so that current window function value can be saved and stored in the temp.table. - - Phase#3: the temporary table is read and passed to query output. - However, Item_window_func still remains in the select list, so - item_windowfunc->val_int() will be called. + - Phase#3: "Retrieval" the temporary table is read and passed to query + output. However, Item_window_func still remains in the select list, + so item_windowfunc->val_int() will be called. During Phase#3, read_value_from_result_field= true. */ -public: - // TODO: how to reset this for subquery re-execution?? bool force_return_blank; -private: - bool read_value_from_result_field; public: + void set_phase_to_initial() + { + force_return_blank= true; + read_value_from_result_field= false; + } + void set_phase_to_computation() + { + force_return_blank= false; + read_value_from_result_field= false; + } + void set_phase_to_retrieval() + { + force_return_blank= false; + read_value_from_result_field= true; + } + void set_read_value_from_result_field() { read_value_from_result_field= true; diff --git a/sql/sql_window.cc b/sql/sql_window.cc index 15f23bcc00f..83e64cc692b 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -1590,7 +1590,7 @@ bool JOIN::process_window_functions(List *curr_fields_list) if (item->type() == Item::WINDOW_FUNC_ITEM) { Item_window_func *item_win = (Item_window_func *) item; - item_win->force_return_blank= false; + item_win->set_phase_to_computation(); Window_spec *spec = item_win->window_spec; /* The sorting criteria should be @@ -1663,7 +1663,7 @@ bool JOIN::process_window_functions(List *curr_fields_list) DBUG_ASSERT(0); } - item_win->set_read_value_from_result_field(); + item_win->set_phase_to_retrieval(); /* This calls filesort_free_buffers(): */ end_read_record(&info);