Commit 39d3cdbf authored by Sergei Petrunia's avatar Sergei Petrunia

Encapsulate the switching between different return values in Item_window_func

parent 722f1b2d
...@@ -112,8 +112,7 @@ Item_window_func::fix_fields(THD *thd, Item **ref) ...@@ -112,8 +112,7 @@ Item_window_func::fix_fields(THD *thd, Item **ref)
maybe_null= window_func()->maybe_null; maybe_null= window_func()->maybe_null;
fixed= 1; fixed= 1;
force_return_blank= true; set_phase_to_initial();
read_value_from_result_field= false;
return false; return false;
} }
......
...@@ -549,28 +549,41 @@ class Item_window_func : public Item_func_or_sum ...@@ -549,28 +549,41 @@ class Item_window_func : public Item_func_or_sum
Window functions are very special functions, so val_() methods have Window functions are very special functions, so val_() methods have
special meaning for them: special meaning for them:
- Phase#1: we run the join and put its result into temporary table. For - Phase#1, "Initial" we run the join and put its result into temporary
window functions, we write NULL (or some other) values as placeholders. 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 - Phase#2: "Computation": executor does the scan in {PARTITION, ORDER BY}
window function. It calls appropriate methods to inform the window order of this window function. It calls appropriate methods to inform
function about rows entering/leaving the window. the window function about rows entering/leaving the window.
It calls window_func()->val_int() so that current window function value It calls window_func()->val_int() so that current window function value
can be saved and stored in the temp.table. can be saved and stored in the temp.table.
- Phase#3: the temporary table is read and passed to query output. - Phase#3: "Retrieval" the temporary table is read and passed to query
However, Item_window_func still remains in the select list, so output. However, Item_window_func still remains in the select list,
item_windowfunc->val_int() will be called. so item_windowfunc->val_int() will be called.
During Phase#3, read_value_from_result_field= true. During Phase#3, read_value_from_result_field= true.
*/ */
public:
// TODO: how to reset this for subquery re-execution??
bool force_return_blank; bool force_return_blank;
private:
bool read_value_from_result_field; bool read_value_from_result_field;
public: 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() void set_read_value_from_result_field()
{ {
read_value_from_result_field= true; read_value_from_result_field= true;
......
...@@ -1590,7 +1590,7 @@ bool JOIN::process_window_functions(List<Item> *curr_fields_list) ...@@ -1590,7 +1590,7 @@ bool JOIN::process_window_functions(List<Item> *curr_fields_list)
if (item->type() == Item::WINDOW_FUNC_ITEM) if (item->type() == Item::WINDOW_FUNC_ITEM)
{ {
Item_window_func *item_win = (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; Window_spec *spec = item_win->window_spec;
/* /*
The sorting criteria should be The sorting criteria should be
...@@ -1663,7 +1663,7 @@ bool JOIN::process_window_functions(List<Item> *curr_fields_list) ...@@ -1663,7 +1663,7 @@ bool JOIN::process_window_functions(List<Item> *curr_fields_list)
DBUG_ASSERT(0); DBUG_ASSERT(0);
} }
item_win->set_read_value_from_result_field(); item_win->set_phase_to_retrieval();
/* This calls filesort_free_buffers(): */ /* This calls filesort_free_buffers(): */
end_read_record(&info); end_read_record(&info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment