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;
fixed= 1;
force_return_blank= true;
read_value_from_result_field= false;
set_phase_to_initial();
return false;
}

View File

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

View File

@ -1590,7 +1590,7 @@ bool JOIN::process_window_functions(List<Item> *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<Item> *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);