diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result index 920fdfedb80..a35109dbec3 100644 --- a/mysql-test/r/parser.result +++ b/mysql-test/r/parser.result @@ -930,17 +930,27 @@ ERROR HY000: Invalid use of group function 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 DROP TABLE t1; -# UNION with a parethesized term with ROLLUP +# UNION with a parenthesized term with ROLLUP CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP); -ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY +a +1 +10 +20 +30 +NULL SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) LIMIT 1; -ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY +a +1 SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) ORDER BY a LIMIT 1; -ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY +a +NULL SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2); -ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY +a +1 +10 +20 SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY a); ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a)); @@ -1154,3 +1164,58 @@ ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP ORDER BY a LIMIT 1) AS a FROM t1; ERROR HY000: Incorrect usage of CUBE/ROLLUP and ORDER BY DROP TABLE t1; + +MDEV-10101 Wrong error message of SELECT 1 UNION (SELECT 1 FROM t1 GROUP BY 1 WITH ROLLUP) + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20),(30); +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP); +a +1 +10 +20 +30 +NULL +(SELECT a FROM t1 GROUP BY a WITH ROLLUP) UNION SELECT 1; +a +10 +20 +30 +NULL +1 +SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1; +a +10 +20 +30 +NULL +1 +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) LIMIT 1; +a +1 +(SELECT a FROM t1 GROUP BY a WITH ROLLUP) UNION SELECT 1 LIMIT 1; +a +10 +SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1 LIMIT 1; +a +10 +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) ORDER BY a LIMIT 1; +a +NULL +(SELECT a FROM t1 GROUP BY a WITH ROLLUP) UNION SELECT 1 ORDER BY a LIMIT 1; +a +NULL +SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1 ORDER BY a LIMIT 1; +a +NULL +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2); +a +1 +10 +20 +(SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2) UNION SELECT 1; +a +10 +20 +1 +DROP TABLE t1; diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test index b24ab1cb34c..c9f54e94073 100644 --- a/mysql-test/t/parser.test +++ b/mysql-test/t/parser.test @@ -1075,18 +1075,16 @@ SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a)) ORDER 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; ---echo # UNION with a parethesized term with ROLLUP +--echo # UNION with a parenthesized term with ROLLUP CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); ---error ER_WRONG_USAGE SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP); ---error ER_WRONG_USAGE SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) LIMIT 1; ---error ER_WRONG_USAGE SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) ORDER BY a LIMIT 1; ---error ER_WRONG_USAGE SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2); + + --error ER_WRONG_USAGE SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY a); --error ER_WRONG_USAGE @@ -1225,3 +1223,27 @@ SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a)) FROM t SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP ORDER BY a LIMIT 1) AS a FROM t1; DROP TABLE t1; + + +--echo +--echo MDEV-10101 Wrong error message of SELECT 1 UNION (SELECT 1 FROM t1 GROUP BY 1 WITH ROLLUP) +--echo + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20),(30); + +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP); +(SELECT a FROM t1 GROUP BY a WITH ROLLUP) UNION SELECT 1; +SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1; + +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) LIMIT 1; +(SELECT a FROM t1 GROUP BY a WITH ROLLUP) UNION SELECT 1 LIMIT 1; +SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1 LIMIT 1; + +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP) ORDER BY a LIMIT 1; +(SELECT a FROM t1 GROUP BY a WITH ROLLUP) UNION SELECT 1 ORDER BY a LIMIT 1; +SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1 ORDER BY a LIMIT 1; + +SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2); +(SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2) UNION SELECT 1; +DROP TABLE t1; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 5c7fafeef1c..be426ad7c43 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -737,13 +737,6 @@ bool setup_select_in_parentheses(LEX *lex) my_parse_error(lex->thd, ER_SYNTAX_ERROR); return TRUE; } - if (sel->linkage == UNION_TYPE && - sel->olap != UNSPECIFIED_OLAP_TYPE && - sel->master_unit()->fake_select_lex) - { - my_error(ER_WRONG_USAGE, MYF(0), "CUBE/ROLLUP", "ORDER BY"); - return TRUE; - } return FALSE; }