summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Gupta <varun.gupta@mariadb.com>2020-06-02 16:31:53 +0530
committerVarun Gupta <varun.gupta@mariadb.com>2020-06-04 17:03:03 +0530
commitf69278bcd0a1ffba767918b040f6e8465c37397b (patch)
tree9486596502cf0ef3c773983a9d0461a856a79da1
parenteba2d10ac53d1d2f975027ba2b2ca39d9c9b98ad (diff)
downloadmariadb-git-f69278bcd0a1ffba767918b040f6e8465c37397b.tar.gz
MDEV-16230: Server crashes when Analyze format=json is run with a window 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.
-rw-r--r--mysql-test/r/win.result45
-rw-r--r--mysql-test/t/win.test13
-rw-r--r--sql/sql_window.cc3
3 files changed, 60 insertions, 1 deletions
diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result
index 35371f49a50..c73f9f8ce6b 100644
--- a/mysql-test/r/win.result
+++ b/mysql-test/r/win.result
@@ -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
#
diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test
index e3025a400d7..37c107633d9 100644
--- a/mysql-test/t/win.test
+++ b/mysql-test/t/win.test
@@ -2447,5 +2447,18 @@ 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 #
diff --git a/sql/sql_window.cc b/sql/sql_window.cc
index b258b8f56c9..18075d179d5 100644
--- a/sql/sql_window.cc
+++ b/sql/sql_window.cc
@@ -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;