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