summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/order_by-mdev-10122.result127
-rw-r--r--mysql-test/r/parser.result18
-rw-r--r--mysql-test/t/order_by-mdev-10122.test39
-rw-r--r--mysql-test/t/parser.test4
-rw-r--r--sql/sql_select.cc3
5 files changed, 183 insertions, 8 deletions
diff --git a/mysql-test/r/order_by-mdev-10122.result b/mysql-test/r/order_by-mdev-10122.result
new file mode 100644
index 00000000000..57c0ecdd970
--- /dev/null
+++ b/mysql-test/r/order_by-mdev-10122.result
@@ -0,0 +1,127 @@
+#
+# MariaDB does not support group functions in some contexts where MySQL does
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (10),(20),(30);
+# All these queries must pass, not returning "Invalid use of group function".
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a));
+a
+10
+20
+30
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) LIMIT 1;
+a
+10
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a));
+a
+10
+20
+30
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) LIMIT 1;
+a
+10
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a;
+a
+10
+20
+30
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+a
+10
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a;
+a
+10
+20
+30
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+a
+10
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a));
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) LIMIT 1;
+a
+1
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a;
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+a
+1
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a));
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) LIMIT 1;
+a
+1
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a;
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+a
+1
+(SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a;
+a
+10
+20
+30
+(SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a LIMIT 1;
+a
+10
+(SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a;
+a
+10
+20
+30
+(SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a LIMIT 1;
+a
+10
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a));
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) LIMIT 1;
+a
+1
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a;
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a LIMIT 1;
+a
+1
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a));
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) LIMIT 1;
+a
+1
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a;
+a
+1
+10
+20
+30
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a LIMIT 1;
+a
+1
+drop table t1;
diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result
index cfca156f3d6..6029a976ba3 100644
--- a/mysql-test/r/parser.result
+++ b/mysql-test/r/parser.result
@@ -951,13 +951,23 @@ a
10
20
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a));
-ERROR HY000: Invalid use of group function
+a
+1
+10
+20
+30
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) LIMIT 1;
-ERROR HY000: Invalid use of group function
+a
+1
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a;
-ERROR HY000: Invalid use of group function
+a
+1
+10
+20
+30
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
-ERROR HY000: Invalid use of group function
+a
+1
DROP TABLE t1;
# UNION with a parenthesized term with ROLLUP
CREATE TABLE t1 (a INT);
diff --git a/mysql-test/t/order_by-mdev-10122.test b/mysql-test/t/order_by-mdev-10122.test
new file mode 100644
index 00000000000..2520e6487ac
--- /dev/null
+++ b/mysql-test/t/order_by-mdev-10122.test
@@ -0,0 +1,39 @@
+--echo #
+--echo # MariaDB does not support group functions in some contexts where MySQL does
+--echo #
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (10),(20),(30);
+
+--echo # All these queries must pass, not returning "Invalid use of group function".
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a));
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) LIMIT 1;
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a));
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) LIMIT 1;
+
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a;
+(SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a;
+(SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a));
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a));
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
+
+(SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a;
+(SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a LIMIT 1;
+(SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a;
+(SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a));
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY MAX(a)) ORDER BY a LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a));
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) LIMIT 1;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a;
+SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY a,MAX(a)) ORDER BY a LIMIT 1;
+
+drop table t1;
diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test
index 4bd594bdf8e..a29a2f14d25 100644
--- a/mysql-test/t/parser.test
+++ b/mysql-test/t/parser.test
@@ -1091,13 +1091,9 @@ INSERT INTO t1 VALUES (10),(20),(30);
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a ORDER BY a) LIMIT 2);
---error ER_INVALID_GROUP_FUNC_USE
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a));
---error ER_INVALID_GROUP_FUNC_USE
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) LIMIT 1;
---error ER_INVALID_GROUP_FUNC_USE
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a;
---error ER_INVALID_GROUP_FUNC_USE
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER BY a LIMIT 1;
DROP TABLE t1;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index efdbed93802..5c7ae1e88c1 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -820,9 +820,12 @@ JOIN::prepare(TABLE_LIST *tables_init,
if (skip_order_by && select_lex !=
select_lex->master_unit()->global_parameters())
{
+ nesting_map save_allow_sum_func= thd->lex->allow_sum_func;
+ thd->lex->allow_sum_func|= (nesting_map)1 << select_lex->nest_level;
if (setup_order(thd, ref_ptrs, tables_list, fields_list,
all_fields, select_lex->order_list.first))
DBUG_RETURN(-1);
+ thd->lex->allow_sum_func= save_allow_sum_func;
select_lex->order_list.empty();
}