diff options
-rw-r--r-- | mysql-test/r/order_by-mdev-10122.result | 127 | ||||
-rw-r--r-- | mysql-test/r/parser.result | 18 | ||||
-rw-r--r-- | mysql-test/t/order_by-mdev-10122.test | 39 | ||||
-rw-r--r-- | mysql-test/t/parser.test | 4 | ||||
-rw-r--r-- | sql/sql_select.cc | 3 |
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(); } |