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:
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user