Skip to content

Commit

Permalink
MDEV-16230: Server crashes when Analyze format=json is run with a win…
Browse files Browse the repository at this point in the history
…dow function with empty PARTITION BY and ORDER BY clauses

Currently when both PARTITION BY and ORDER BY clauses are empty then we create a Item
with the first field in the select list and sort with that field.
It should be created as an Item_temptable_field instead of Item_field because the
print() function continues to work even if the table has been dropped.
  • Loading branch information
Varun Gupta committed Jun 4, 2020
1 parent eba2d10 commit f69278b
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 1 deletion.
45 changes: 45 additions & 0 deletions mysql-test/r/win.result
Expand Up @@ -3743,5 +3743,50 @@ a ROW_NUMBER() OVER v2
1 1
drop table t0;
#
# MDEV-16230:Server crashes when Analyze format=json is run with a window function with
# empty PARTITION BY and ORDER BY clauses
#
CREATE TABLE t1(a INT, b INT);
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);
ANALYZE FORMAT=JSON SELECT row_number() OVER() FROM t1;
ANALYZE
{
"query_block": {
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"window_functions_computation": {
"sorts": {
"filesort": {
"sort_key": "`row_number() OVER()`",
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"r_used_priority_queue": false,
"r_output_rows": 3,
"r_buffer_size": "REPLACED"
}
},
"temporary_table": {
"table": {
"table_name": "t1",
"access_type": "ALL",
"r_loops": 1,
"rows": 3,
"r_rows": 3,
"r_total_time_ms": "REPLACED",
"filtered": 100,
"r_filtered": 100
}
}
}
}
}
SELECT row_number() OVER() FROM t1;
row_number() OVER()
1
2
3
DROP TABLE t1;
#
# End of 10.2 tests
#
13 changes: 13 additions & 0 deletions mysql-test/t/win.test
Expand Up @@ -2446,6 +2446,19 @@ WINDOW v2 AS ( PARTITION BY a ORDER BY a DESC );

drop table t0;

--echo #
--echo # MDEV-16230:Server crashes when Analyze format=json is run with a window function with
--echo # empty PARTITION BY and ORDER BY clauses
--echo #

CREATE TABLE t1(a INT, b INT);
INSERT INTO t1 VALUES (1,1),(2,2),(3,3);

--source include/analyze-format.inc
ANALYZE FORMAT=JSON SELECT row_number() OVER() FROM t1;
SELECT row_number() OVER() FROM t1;
DROP TABLE t1;

--echo #
--echo # End of 10.2 tests
--echo #
3 changes: 2 additions & 1 deletion sql/sql_window.cc
Expand Up @@ -2872,7 +2872,8 @@ bool Window_funcs_sort::setup(THD *thd, SQL_SELECT *sel,
*/
ORDER *order= (ORDER *)alloc_root(thd->mem_root, sizeof(ORDER));
memset(order, 0, sizeof(*order));
Item *item= new (thd->mem_root) Item_field(thd, join_tab->table->field[0]);
Item *item= new (thd->mem_root) Item_temptable_field(thd,
join_tab->table->field[0]);
order->item= (Item **)alloc_root(thd->mem_root, 2 * sizeof(Item *));
order->item[1]= NULL;
order->item[0]= item;
Expand Down

0 comments on commit f69278b

Please sign in to comment.