1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Encapsulate the switching between different return values in Item_window_func

This commit is contained in:
Sergei Petrunia
2016-03-24 02:57:03 +03:00
parent 722f1b2dcc
commit 39d3cdbf22
3 changed files with 29 additions and 17 deletions

View File

@ -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;
} }

View File

@ -549,28 +549,41 @@ public:
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;

View File

@ -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)
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);