summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Gupta <varun.gupta@mariadb.com>2020-12-14 14:34:14 +0530
committerSergei Petrunia <sergey@mariadb.com>2022-02-21 19:19:04 +0300
commit942a9791b2231273ba20649a658c856641268fae (patch)
treeb3adbc6aad7ace2385b76f91513d5c7a10d5c3ea
parentd140d276244508d7f2e69a3c1a23e0b09201f71a (diff)
downloadmariadb-git-942a9791b2231273ba20649a658c856641268fae.tar.gz
MDEV-15208: server crashed, when using ORDER BY with window function and UNION
SELECTs inside a UNION can have window function but not the global ORDER BY clause of the UNION.
-rw-r--r--mysql-test/r/win.result8
-rw-r--r--mysql-test/t/win.test10
-rw-r--r--sql/sql_select.cc4
3 files changed, 21 insertions, 1 deletions
diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result
index 30650f29555..1ddafbd4f8f 100644
--- a/mysql-test/r/win.result
+++ b/mysql-test/r/win.result
@@ -4230,5 +4230,13 @@ i LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j)
4 2
DROP TABLE t1;
#
+# MDEV-15208: server crashed, when using ORDER BY with window function and UNION
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (1),(1),(1),(1),(1),(2),(2),(2),(2),(2),(2);
+SELECT 1 UNION SELECT a FROM t1 ORDER BY (row_number() over ());
+ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION
+DROP TABLE t1;
+#
# End of 10.2 tests
#
diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test
index 126ed735c88..37f09a6e850 100644
--- a/mysql-test/t/win.test
+++ b/mysql-test/t/win.test
@@ -2731,5 +2731,15 @@ SELECT i, LAST_VALUE(COUNT(i)) OVER (PARTITION BY i ORDER BY j) FROM t1 GROUP BY
DROP TABLE t1;
--echo #
+--echo # MDEV-15208: server crashed, when using ORDER BY with window function and UNION
+--echo #
+
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (1),(1),(1),(1),(1),(2),(2),(2),(2),(2),(2);
+--error ER_AGGREGATE_ORDER_FOR_UNION
+SELECT 1 UNION SELECT a FROM t1 ORDER BY (row_number() over ());
+DROP TABLE t1;
+
+--echo #
--echo # End of 10.2 tests
--echo #
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index db8a63eeb48..a3e8b453897 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -22796,7 +22796,9 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables,
an ORDER BY clause
*/
- if (for_union && (*order->item)->with_sum_func)
+ if (for_union &&
+ ((*order->item)->with_sum_func ||
+ (*order->item)->with_window_func))
{
my_error(ER_AGGREGATE_ORDER_FOR_UNION, MYF(0), number);
return 1;