Skip to content

Commit a0db19b

Browse files
author
Alexander Barkov
committed
MDEV-10779 Failing assertion lex->proc_list.elements == 0 or syntax error on PROCEDURE ANALYSE in UNION
Reverting a part of the patch for "MDEV-8909union parser cleanup", as a parenthesized SELECT with PROCEDURE followed by UNION is not disallowed by the grammar (only a non-parenthesized SELECT with PROCEDURE followed by a UNION is disallowed grammatically).
1 parent 54b81ac commit a0db19b

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed

mysql-test/r/parser.result

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,3 +1239,44 @@ a
12391239
20
12401240
1
12411241
DROP TABLE t1;
1242+
#
1243+
# MDEV-10779 Failing assertion lex->proc_list.elements == 0 or syntax error on PROCEDURE ANALYSE in UNION
1244+
#
1245+
CREATE TABLE t1 (i INT);
1246+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1247+
UNION
1248+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10));
1249+
ERROR HY000: Incorrect usage of UNION and SELECT ... PROCEDURE ANALYSE()
1250+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1251+
UNION
1252+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10);
1253+
ERROR HY000: Incorrect usage of UNION and SELECT ... PROCEDURE ANALYSE()
1254+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1255+
UNION
1256+
(SELECT 1);
1257+
ERROR HY000: Incorrect usage of UNION and SELECT ... PROCEDURE ANALYSE()
1258+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1259+
UNION
1260+
SELECT 1;
1261+
ERROR HY000: Incorrect usage of UNION and SELECT ... PROCEDURE ANALYSE()
1262+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1263+
UNION
1264+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10));
1265+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION
1266+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))' at line 2
1267+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1268+
UNION
1269+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10);
1270+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION
1271+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)' at line 2
1272+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1273+
UNION
1274+
(SELECT 1);
1275+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION
1276+
(SELECT 1)' at line 2
1277+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1278+
UNION
1279+
SELECT 1;
1280+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION
1281+
SELECT 1' at line 2
1282+
DROP TABLE t1;

mysql-test/t/parser.test

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,3 +1263,51 @@ SELECT a FROM t1 GROUP BY a WITH ROLLUP UNION SELECT 1 ORDER BY a LIMIT 1;
12631263
SELECT 1 AS a UNION (SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2);
12641264
(SELECT a FROM t1 GROUP BY a WITH ROLLUP LIMIT 2) UNION SELECT 1;
12651265
DROP TABLE t1;
1266+
1267+
1268+
--echo #
1269+
--echo # MDEV-10779 Failing assertion lex->proc_list.elements == 0 or syntax error on PROCEDURE ANALYSE in UNION
1270+
--echo #
1271+
1272+
CREATE TABLE t1 (i INT);
1273+
--error ER_WRONG_USAGE
1274+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1275+
UNION
1276+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10));
1277+
1278+
--error ER_WRONG_USAGE
1279+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1280+
UNION
1281+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10);
1282+
1283+
--error ER_WRONG_USAGE
1284+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1285+
UNION
1286+
(SELECT 1);
1287+
1288+
--error ER_WRONG_USAGE
1289+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10))
1290+
UNION
1291+
SELECT 1;
1292+
1293+
--error ER_PARSE_ERROR
1294+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1295+
UNION
1296+
(SELECT * FROM t1 PROCEDURE ANALYSE(10, 10));
1297+
1298+
--error ER_PARSE_ERROR
1299+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1300+
UNION
1301+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10);
1302+
1303+
--error ER_PARSE_ERROR
1304+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1305+
UNION
1306+
(SELECT 1);
1307+
1308+
--error ER_PARSE_ERROR
1309+
SELECT * FROM t1 PROCEDURE ANALYSE(10, 10)
1310+
UNION
1311+
SELECT 1;
1312+
1313+
DROP TABLE t1;

sql/sql_parse.cc

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7485,8 +7485,22 @@ mysql_new_select(LEX *lex, bool move_down)
74857485
DBUG_RETURN(TRUE);
74867486
}
74877487

7488-
// SELECT 1 FROM t1 PROCEDURE ANALYSE() UNION ... -- not possible
7489-
DBUG_ASSERT(lex->proc_list.elements == 0);
7488+
/*
7489+
This type of query is not possible in the grammar:
7490+
SELECT 1 FROM t1 PROCEDURE ANALYSE() UNION ... ;
7491+
7492+
But this type of query is still possible:
7493+
(SELECT 1 FROM t1 PROCEDURE ANALYSE()) UNION ... ;
7494+
and it's not easy to disallow this grammatically,
7495+
because there can be any parenthesis nest level:
7496+
(((SELECT 1 FROM t1 PROCEDURE ANALYSE()))) UNION ... ;
7497+
*/
7498+
if (lex->proc_list.elements!=0)
7499+
{
7500+
my_error(ER_WRONG_USAGE, MYF(0), "UNION",
7501+
"SELECT ... PROCEDURE ANALYSE()");
7502+
DBUG_RETURN(TRUE);
7503+
}
74907504
// SELECT 1 FROM t1 ORDER BY 1 UNION SELECT 1 FROM t1 -- not possible
74917505
DBUG_ASSERT(!lex->current_select->order_list.first ||
74927506
lex->current_select->braces);

0 commit comments

Comments
 (0)