Skip to content
Permalink
Browse files

Make window functions computation step show up in EXPLAIN FORMAT=JSON…

… output
  • Loading branch information...
spetrunia committed Mar 28, 2016
1 parent 44fdb56 commit e88758330c49b40556a1f9c3d316b66ce11ca67d
Showing with 126 additions and 8 deletions.
  1. +73 −0 mysql-test/r/win.result
  2. +25 −0 mysql-test/t/win.test
  3. +3 −0 sql/sql_explain.cc
  4. +7 −1 sql/sql_explain.h
  5. +17 −6 sql/sql_select.cc
  6. +1 −1 sql/sql_select.h
@@ -1401,3 +1401,76 @@ pk c CNT
9 2 4
10 2 3
drop table t0,t1;
#
# EXPLAIN FORMAT=JSON support for window functions
#
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
explain format=json select rank() over (order by a) from t0;
EXPLAIN
{
"query_block": {
"select_id": 1,
"window_functions_computation": {
"temporary_table": {
"table": {
"table_name": "t0",
"access_type": "ALL",
"rows": 10,
"filtered": 100
}
}
}
}
}
create table t1 (a int, b int, c int);
insert into t1 select a,a,a from t0;
explain format=json
select
a,
rank() over (order by sum(b))
from t1
group by a;
EXPLAIN
{
"query_block": {
"select_id": 1,
"filesort": {
"window_functions_computation": {
"temporary_table": {
"table": {
"table_name": "t1",
"access_type": "ALL",
"rows": 10,
"filtered": 100
}
}
}
}
}
}
explain format=json
select
a,
rank() over (order by sum(b))
from t1
group by a
order by null;
EXPLAIN
{
"query_block": {
"select_id": 1,
"window_functions_computation": {
"temporary_table": {
"table": {
"table_name": "t1",
"access_type": "ALL",
"rows": 10,
"filtered": 100
}
}
}
}
}
drop table t1;
drop table t0;
@@ -924,8 +924,33 @@ execute stmt;

drop table t0,t1;

--echo #
--echo # EXPLAIN FORMAT=JSON support for window functions
--echo #
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

explain format=json select rank() over (order by a) from t0;

create table t1 (a int, b int, c int);
insert into t1 select a,a,a from t0;

explain format=json
select
a,
rank() over (order by sum(b))
from t1
group by a;

explain format=json
select
a,
rank() over (order by sum(b))
from t1
group by a
order by null;

drop table t1;
drop table t0;


@@ -878,6 +878,9 @@ void Explain_select::print_explain_json(Explain_query *query,
case AGGR_OP_REMOVE_DUPLICATES:
writer->add_member("duplicate_removal").start_object();
break;
case AGGR_OP_WINDOW_FUNCS:
writer->add_member("window_functions_computation").start_object();
break;
default:
DBUG_ASSERT(0);
}
@@ -264,7 +264,8 @@ typedef enum
AGGR_OP_TEMP_TABLE,
AGGR_OP_FILESORT,
//AGGR_OP_READ_SORTED_FILE, // need this?
AGGR_OP_REMOVE_DUPLICATES
AGGR_OP_REMOVE_DUPLICATES,
AGGR_OP_WINDOW_FUNCS
//AGGR_OP_JOIN // Need this?
} enum_explain_aggr_node_type;

@@ -296,6 +297,11 @@ class Explain_aggr_remove_dups : public Explain_aggr_node
enum_explain_aggr_node_type get_type() { return AGGR_OP_REMOVE_DUPLICATES; }
};

class Explain_aggr_window_funcs : public Explain_aggr_node
{
public:
enum_explain_aggr_node_type get_type() { return AGGR_OP_WINDOW_FUNCS; }
};

/////////////////////////////////////////////////////////////////////////////

@@ -2135,7 +2135,6 @@ bool JOIN::make_aggr_tables_info()
All optimization is done. Check if we can use the storage engines
group by handler to evaluate the group by
*/
group_by_handler *gbh= NULL;
if (tables_list && (tmp_table_param.sum_func_count || group_list) &&
!procedure)
{
@@ -2337,8 +2336,8 @@ bool JOIN::make_aggr_tables_info()
// psergey-todo: this is probably an incorrect place:
if (select_lex->window_funcs.elements)
{
curr_tab->window_funcs= new Window_funcs_computation;
if (curr_tab->window_funcs->setup(thd, &select_lex->window_funcs))
curr_tab->window_funcs_step= new Window_funcs_computation;
if (curr_tab->window_funcs_step->setup(thd, &select_lex->window_funcs))
DBUG_RETURN(true);
}

@@ -19137,7 +19136,10 @@ bool test_if_use_dynamic_range_scan(JOIN_TAB *join_tab)
int join_init_read_record(JOIN_TAB *tab)
{
int error;

/*
Note: the query plan tree for the below operations is constructed in
save_agg_explain_data.
*/
if (tab->distinct && tab->remove_duplicates()) // Remove duplicates.
return 1;
if (tab->filesort && tab->sort_table()) // Sort table.
@@ -24158,6 +24160,14 @@ void save_agg_explain_data(JOIN *join, Explain_select *xpl_sel)
node= new Explain_aggr_tmp_table;
node->child= prev_node;

if (join_tab->window_funcs_step)
{
prev_node=node;
node= new Explain_aggr_window_funcs;
node->child= prev_node;
}

/* The below matches execution in join_init_read_record() */
if (join_tab->distinct)
{
prev_node= node;
@@ -25919,9 +25929,10 @@ AGGR_OP::end_send()

// Update ref array
join_tab->join->set_items_ref_array(*join_tab->ref_array);
if (join_tab->window_funcs)
if (join_tab->window_funcs_step)
{
join_tab->window_funcs->exec(join);
if (join_tab->window_funcs_step->exec(join))
return NESTED_LOOP_ERROR;
}

table->reginfo.lock_type= TL_UNLOCK;
@@ -428,7 +428,7 @@ typedef struct st_join_table {
Non-NULL value means this join_tab must do window function computation
before reading.
*/
Window_funcs_computation* window_funcs;
Window_funcs_computation* window_funcs_step;

/**
List of topmost expressions in the select list. The *next* JOIN TAB

0 comments on commit e887583

Please sign in to comment.
You can’t perform that action at this time.