1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-20634 Report disallowed subquery errors as such (instead of parse error)

This commit is contained in:
Alexander Barkov
2019-09-20 10:36:20 +04:00
parent b9dea911bf
commit 2f88bd2da2
21 changed files with 133 additions and 136 deletions

View File

@ -4547,7 +4547,7 @@ DEALLOCATE PREPARE stmt;
# #
PREPARE stmt FROM 'SELECT ? FROM DUAL'; PREPARE stmt FROM 'SELECT ? FROM DUAL';
EXECUTE stmt USING (SELECT 1); EXECUTE stmt USING (SELECT 1);
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 'SELECT 1)' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
CREATE FUNCTION f1() RETURNS VARCHAR(10) RETURN 'test'; CREATE FUNCTION f1() RETURNS VARCHAR(10) RETURN 'test';
PREPARE stmt FROM 'SELECT ? FROM DUAL'; PREPARE stmt FROM 'SELECT ? FROM DUAL';
@ -4746,7 +4746,7 @@ ERROR 21000: Operand should contain 1 column(s)
# Testing disallowed expressions in USING # Testing disallowed expressions in USING
# #
EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING (SELECT 1); EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING (SELECT 1);
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 'SELECT 1)' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
CREATE FUNCTION f1() RETURNS VARCHAR(10) RETURN 'test'; CREATE FUNCTION f1() RETURNS VARCHAR(10) RETURN 'test';
EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING f1(); EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING f1();
ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
@ -4932,9 +4932,9 @@ ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2
PREPARE stmt FROM CONCAT(_latin1'SELECT 1 AS c FROM ', _latin2 'DUAL'); PREPARE stmt FROM CONCAT(_latin1'SELECT 1 AS c FROM ', _latin2 'DUAL');
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat' ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat'
EXECUTE IMMEDIATE (SELECT 'SELECT 1'); EXECUTE IMMEDIATE (SELECT 'SELECT 1');
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 'SELECT 'SELECT 1')' at line 1 ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
PREPARE stmt FROM (SELECT 'SELECT 1'); PREPARE stmt FROM (SELECT 'SELECT 1');
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 'SELECT 'SELECT 1')' at line 1 ERROR 42000: PREPARE..FROM does not support subqueries or stored functions
EXECUTE IMMEDIATE a; EXECUTE IMMEDIATE a;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
PREPARE stmt FROM a; PREPARE stmt FROM a;

View File

@ -4042,7 +4042,7 @@ DEALLOCATE PREPARE stmt;
--echo # --echo #
PREPARE stmt FROM 'SELECT ? FROM DUAL'; PREPARE stmt FROM 'SELECT ? FROM DUAL';
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE stmt USING (SELECT 1); EXECUTE stmt USING (SELECT 1);
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
@ -4221,7 +4221,7 @@ EXECUTE IMMEDIATE 'SELECT ?' USING ROW(1,2);
--echo # Testing disallowed expressions in USING --echo # Testing disallowed expressions in USING
--echo # --echo #
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING (SELECT 1); EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING (SELECT 1);
CREATE FUNCTION f1() RETURNS VARCHAR(10) RETURN 'test'; CREATE FUNCTION f1() RETURNS VARCHAR(10) RETURN 'test';
@ -4394,9 +4394,9 @@ EXECUTE IMMEDIATE CONCAT(_latin1'SELECT 1 AS c FROM ', _latin2 'DUAL');
--error ER_CANT_AGGREGATE_2COLLATIONS --error ER_CANT_AGGREGATE_2COLLATIONS
PREPARE stmt FROM CONCAT(_latin1'SELECT 1 AS c FROM ', _latin2 'DUAL'); PREPARE stmt FROM CONCAT(_latin1'SELECT 1 AS c FROM ', _latin2 'DUAL');
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE (SELECT 'SELECT 1'); EXECUTE IMMEDIATE (SELECT 'SELECT 1');
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PREPARE stmt FROM (SELECT 'SELECT 1'); PREPARE stmt FROM (SELECT 'SELECT 1');
--error ER_BAD_FIELD_ERROR --error ER_BAD_FIELD_ERROR

View File

@ -12,9 +12,9 @@ ROW(1, 7) IN (SELECT id, id1 FROM t1 WHERE id1= 8)
0 0
DROP TABLE t1; DROP TABLE t1;
EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1); EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1);
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 'SELECT * FROM t1)' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
CREATE TABLE t1 (id INT); CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (10); INSERT INTO t1 VALUES (10);
CREATE PROCEDURE p1(a INT) BEGIN END; CREATE PROCEDURE p1(a INT) BEGIN END;
@ -45,21 +45,21 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
SIGNAL SQLSTATE '01000'; SIGNAL SQLSTATE '01000';
END' at line 3 END' at line 3
PREPARE stmt FROM (1 IN (SELECT * FROM t1)); PREPARE stmt FROM (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: PREPARE..FROM does not support subqueries or stored functions
PREPARE stmt FROM EXISTS (SELECT * FROM t1); PREPARE stmt FROM EXISTS (SELECT * FROM t1);
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 '(SELECT * FROM t1)' at line 1 ERROR 42000: PREPARE..FROM does not support subqueries or stored functions
EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1); EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1);
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 '(SELECT * FROM t1)' at line 1 ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
GET DIAGNOSTICS CONDITION (1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO; GET DIAGNOSTICS CONDITION (1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO;
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 '(1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO' at line 1 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 '(1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO' at line 1
GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO; GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO;
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 'EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO' at line 1 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 'EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO' at line 1
PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1)); PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: PURGE..BEFORE does not support subqueries or stored functions
PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1); PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1);
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 '(SELECT * FROM t1)' at line 1 ERROR 42000: PURGE..BEFORE does not support subqueries or stored functions
CREATE TABLE t1 (a INT); CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t1 VALUES (1),(2),(3);
DO 1 IN (SELECT * FROM t1); DO 1 IN (SELECT * FROM t1);

View File

@ -15,9 +15,9 @@ SELECT ROW(1,7) IN (SELECT id, id1 FROM t1 WHERE id1= 8);
EXECUTE IMMEDIATE 'SELECT ROW(1, 7) IN (SELECT id, id1 FROM t1 WHERE id1= 8)'; EXECUTE IMMEDIATE 'SELECT ROW(1, 7) IN (SELECT id, id1 FROM t1 WHERE id1= 8)';
DROP TABLE t1; DROP TABLE t1;
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1); EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1);
@ -52,14 +52,14 @@ $$
DELIMITER ;$$ DELIMITER ;$$
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PREPARE stmt FROM (1 IN (SELECT * FROM t1)); PREPARE stmt FROM (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PREPARE stmt FROM EXISTS (SELECT * FROM t1); PREPARE stmt FROM EXISTS (SELECT * FROM t1);
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1); EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1);
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
@ -67,9 +67,9 @@ GET DIAGNOSTICS CONDITION (1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO;
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO; GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO;
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1)); PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1); PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1);
CREATE TABLE t1 (a INT); CREATE TABLE t1 (a INT);

View File

@ -83,7 +83,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
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 'PROCEDURE ANALYSE(1))' at line 1 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 'PROCEDURE ANALYSE(1))' at line 1
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: PROCEDURE does not support subqueries or stored functions
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
@ -1133,7 +1133,7 @@ ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: HANDLER..READ does not support subqueries or stored functions
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);

View File

@ -56,7 +56,7 @@ SELECT 1 IN (SELECT 1);
SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a)); SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
-- error ER_PARSE_ERROR -- error ER_PARSE_ERROR
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
-- error ER_PARSE_ERROR -- error ER_SUBQUERIES_NOT_SUPPORTED
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
-- error ER_BAD_FIELD_ERROR -- error ER_BAD_FIELD_ERROR
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
@ -623,7 +623,7 @@ set @a:=(SELECT a from t1);
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
-- error ER_PARSE_ERROR -- error ER_SUBQUERIES_NOT_SUPPORTED
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;

View File

@ -87,7 +87,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
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 'PROCEDURE ANALYSE(1))' at line 1 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 'PROCEDURE ANALYSE(1))' at line 1
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: PROCEDURE does not support subqueries or stored functions
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
@ -1137,7 +1137,7 @@ ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: HANDLER..READ does not support subqueries or stored functions
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);

View File

@ -90,7 +90,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
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 'PROCEDURE ANALYSE(1))' at line 1 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 'PROCEDURE ANALYSE(1))' at line 1
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: PROCEDURE does not support subqueries or stored functions
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
@ -1140,7 +1140,7 @@ ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: HANDLER..READ does not support subqueries or stored functions
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);

View File

@ -86,7 +86,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
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 'PROCEDURE ANALYSE(1))' at line 1 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 'PROCEDURE ANALYSE(1))' at line 1
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: PROCEDURE does not support subqueries or stored functions
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
@ -1136,7 +1136,7 @@ ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: HANDLER..READ does not support subqueries or stored functions
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);

View File

@ -89,7 +89,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
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 'PROCEDURE ANALYSE(1))' at line 1 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 'PROCEDURE ANALYSE(1))' at line 1
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: PROCEDURE does not support subqueries or stored functions
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
@ -1139,7 +1139,7 @@ ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: HANDLER..READ does not support subqueries or stored functions
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);

View File

@ -86,7 +86,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1)); select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
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 'PROCEDURE ANALYSE(1))' at line 1 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 'PROCEDURE ANALYSE(1))' at line 1
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1)); SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: PROCEDURE does not support subqueries or stored functions
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL; SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
@ -1136,7 +1136,7 @@ ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (a int, KEY(a)); CREATE TABLE t1 (a int, KEY(a));
HANDLER t1 OPEN; HANDLER t1 OPEN;
HANDLER t1 READ a=((SELECT 1)); HANDLER t1 READ a=((SELECT 1));
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 'SELECT 1))' at line 1 ERROR 42000: HANDLER..READ does not support subqueries or stored functions
HANDLER t1 CLOSE; HANDLER t1 CLOSE;
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);

View File

@ -1,5 +1,5 @@
purge master logs before (select adddate(current_timestamp(), interval -4 day)); purge master logs before (select adddate(current_timestamp(), interval -4 day));
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 'select adddate(current_timestamp(), interval -4 day))' at line 1 ERROR 42000: PURGE..BEFORE does not support subqueries or stored functions
purge master logs before adddate(current_timestamp(), interval -4 day); purge master logs before adddate(current_timestamp(), interval -4 day);
drop table if exists t1; drop table if exists t1;
create table t1(a int,b int,key(a),key(b)); create table t1(a int,b int,key(a),key(b));

View File

@ -4,7 +4,7 @@
# BUG#10308: purge log with subselect # BUG#10308: purge log with subselect
# Bug#28553: mysqld crash in "purge master log before(select time from information_schema)" # Bug#28553: mysqld crash in "purge master log before(select time from information_schema)"
# #
--error 1064 --error ER_SUBQUERIES_NOT_SUPPORTED
purge master logs before (select adddate(current_timestamp(), interval -4 day)); purge master logs before (select adddate(current_timestamp(), interval -4 day));
purge master logs before adddate(current_timestamp(), interval -4 day); purge master logs before adddate(current_timestamp(), interval -4 day);

View File

@ -47,7 +47,7 @@ EXECUTE stmt USING @a, @b;
# #
PREPARE stmt FROM 'SELECT :1 FROM DUAL'; PREPARE stmt FROM 'SELECT :1 FROM DUAL';
EXECUTE stmt USING (SELECT 1); EXECUTE stmt USING (SELECT 1);
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 'SELECT 1)' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
CREATE FUNCTION f1() RETURN VARCHAR CREATE FUNCTION f1() RETURN VARCHAR
AS AS
@ -155,7 +155,7 @@ DROP TABLE t1;
# Testing disallowed expressions in USING # Testing disallowed expressions in USING
# #
EXECUTE IMMEDIATE 'SELECT :1 FROM DUAL' USING (SELECT 1); EXECUTE IMMEDIATE 'SELECT :1 FROM DUAL' USING (SELECT 1);
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 'SELECT 1)' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
CREATE FUNCTION f1() RETURN VARCHAR CREATE FUNCTION f1() RETURN VARCHAR
AS AS
BEGIN BEGIN
@ -182,9 +182,9 @@ ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2
PREPARE stmt FROM _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL'; PREPARE stmt FROM _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL';
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat_operator_oracle' ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat_operator_oracle'
EXECUTE IMMEDIATE (SELECT 'SELECT 1'); EXECUTE IMMEDIATE (SELECT 'SELECT 1');
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 'SELECT 'SELECT 1')' at line 1 ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
PREPARE stmt FROM (SELECT 'SELECT 1'); PREPARE stmt FROM (SELECT 'SELECT 1');
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 'SELECT 'SELECT 1')' at line 1 ERROR 42000: PREPARE..FROM does not support subqueries or stored functions
EXECUTE IMMEDIATE a; EXECUTE IMMEDIATE a;
ERROR 42S22: Unknown column 'a' in 'field list' ERROR 42S22: Unknown column 'a' in 'field list'
PREPARE stmt FROM a; PREPARE stmt FROM a;

View File

@ -13,9 +13,9 @@ ROW(1, 7) IN (SELECT id, id1 FROM t1 WHERE id1= 8)
0 0
DROP TABLE t1; DROP TABLE t1;
EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1); EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1);
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 'SELECT * FROM t1)' at line 1 ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
CREATE TABLE t1 (id INT); CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (10); INSERT INTO t1 VALUES (10);
CREATE PROCEDURE p1(a INT) AS BEGIN NULL; END; CREATE PROCEDURE p1(a INT) AS BEGIN NULL; END;
@ -47,21 +47,21 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
SIGNAL SQLSTATE '01000'; SIGNAL SQLSTATE '01000';
END' at line 3 END' at line 3
PREPARE stmt FROM (1 IN (SELECT * FROM t1)); PREPARE stmt FROM (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: PREPARE..FROM does not support subqueries or stored functions
PREPARE stmt FROM EXISTS (SELECT * FROM t1); PREPARE stmt FROM EXISTS (SELECT * FROM t1);
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 '(SELECT * FROM t1)' at line 1 ERROR 42000: PREPARE..FROM does not support subqueries or stored functions
EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1); EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1);
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 '(SELECT * FROM t1)' at line 1 ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions
GET DIAGNOSTICS CONDITION (1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO; GET DIAGNOSTICS CONDITION (1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO;
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 '(1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO' at line 1 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 '(1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO' at line 1
GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO; GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO;
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 'EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO' at line 1 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 'EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO' at line 1
PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1)); PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1));
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 'SELECT * FROM t1))' at line 1 ERROR 42000: PURGE..BEFORE does not support subqueries or stored functions
PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1); PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1);
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 '(SELECT * FROM t1)' at line 1 ERROR 42000: PURGE..BEFORE does not support subqueries or stored functions
CREATE TABLE t1 (a INT); CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t1 VALUES (1),(2),(3);
DO 1 IN (SELECT * FROM t1); DO 1 IN (SELECT * FROM t1);

View File

@ -33,7 +33,7 @@ EXECUTE stmt USING @a, @b;
--echo # --echo #
PREPARE stmt FROM 'SELECT :1 FROM DUAL'; PREPARE stmt FROM 'SELECT :1 FROM DUAL';
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE stmt USING (SELECT 1); EXECUTE stmt USING (SELECT 1);
DEALLOCATE PREPARE stmt; DEALLOCATE PREPARE stmt;
@ -153,7 +153,7 @@ DROP TABLE t1;
--echo # Testing disallowed expressions in USING --echo # Testing disallowed expressions in USING
--echo # --echo #
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE 'SELECT :1 FROM DUAL' USING (SELECT 1); EXECUTE IMMEDIATE 'SELECT :1 FROM DUAL' USING (SELECT 1);
DELIMITER $$; DELIMITER $$;
@ -189,9 +189,9 @@ EXECUTE IMMEDIATE _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL';
--error ER_CANT_AGGREGATE_2COLLATIONS --error ER_CANT_AGGREGATE_2COLLATIONS
PREPARE stmt FROM _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL'; PREPARE stmt FROM _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL';
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE (SELECT 'SELECT 1'); EXECUTE IMMEDIATE (SELECT 'SELECT 1');
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PREPARE stmt FROM (SELECT 'SELECT 1'); PREPARE stmt FROM (SELECT 'SELECT 1');
--error ER_BAD_FIELD_ERROR --error ER_BAD_FIELD_ERROR

View File

@ -17,9 +17,9 @@ SELECT ROW(1,7) IN (SELECT id, id1 FROM t1 WHERE id1= 8);
EXECUTE IMMEDIATE 'SELECT ROW(1, 7) IN (SELECT id, id1 FROM t1 WHERE id1= 8)'; EXECUTE IMMEDIATE 'SELECT ROW(1, 7) IN (SELECT id, id1 FROM t1 WHERE id1= 8)';
DROP TABLE t1; DROP TABLE t1;
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE 'SELECT ?' USING (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1); EXECUTE IMMEDIATE 'SELECT ?' USING (SELECT * FROM t1);
@ -57,14 +57,14 @@ $$
DELIMITER ;$$ DELIMITER ;$$
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PREPARE stmt FROM (1 IN (SELECT * FROM t1)); PREPARE stmt FROM (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PREPARE stmt FROM EXISTS (SELECT * FROM t1); PREPARE stmt FROM EXISTS (SELECT * FROM t1);
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1)); EXECUTE IMMEDIATE (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1); EXECUTE IMMEDIATE EXISTS (SELECT * FROM t1);
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
@ -72,9 +72,9 @@ GET DIAGNOSTICS CONDITION (1 IN (SELECT * FROM t1)) @errno=MYSQL_ERRNO;
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO; GET DIAGNOSTICS CONDITION EXISTS (SELECT * FROM t1) @errno=MYSQL_ERRNO;
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1)); PURGE BINARY LOGS BEFORE (1 IN (SELECT * FROM t1));
--error ER_PARSE_ERROR --error ER_SUBQUERIES_NOT_SUPPORTED
PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1); PURGE BINARY LOGS BEFORE EXISTS (SELECT * FROM t1);
CREATE TABLE t1 (a INT); CREATE TABLE t1 (a INT);

View File

@ -733,7 +733,7 @@ void LEX::start(THD *thd_arg)
default_used= FALSE; default_used= FALSE;
query_tables= 0; query_tables= 0;
reset_query_tables_list(FALSE); reset_query_tables_list(FALSE);
expr_allows_subselect= TRUE; clause_that_disallows_subselect= NULL;
selects_allow_into= FALSE; selects_allow_into= FALSE;
selects_allow_procedure= FALSE; selects_allow_procedure= FALSE;
use_only_table_context= FALSE; use_only_table_context= FALSE;
@ -9049,12 +9049,12 @@ bool LEX::insert_select_hack(SELECT_LEX *sel)
Create an Item_singlerow_subselect for a query expression. Create an Item_singlerow_subselect for a query expression.
*/ */
Item *LEX::create_item_query_expression(THD *thd, Item *LEX::create_item_query_expression(THD *thd,
const char *tok_start,
st_select_lex_unit *unit) st_select_lex_unit *unit)
{ {
if (!expr_allows_subselect) if (clause_that_disallows_subselect)
{ {
thd->parse_error(ER_SYNTAX_ERROR, tok_start); my_error(ER_SUBQUERIES_NOT_SUPPORTED, MYF(0),
clause_that_disallows_subselect);
return NULL; return NULL;
} }
@ -9323,11 +9323,12 @@ SELECT_LEX_UNIT *LEX::parsed_body_unit_tail(SELECT_LEX_UNIT *unit,
Process subselect parsing Process subselect parsing
*/ */
SELECT_LEX *LEX::parsed_subselect(SELECT_LEX_UNIT *unit, char *place) SELECT_LEX *LEX::parsed_subselect(SELECT_LEX_UNIT *unit)
{ {
if (!expr_allows_subselect) if (clause_that_disallows_subselect)
{ {
thd->parse_error(ER_SYNTAX_ERROR, place); my_error(ER_SUBQUERIES_NOT_SUPPORTED, MYF(0),
clause_that_disallows_subselect);
return NULL; return NULL;
} }

View File

@ -3267,10 +3267,10 @@ public:
/* /*
Usually `expr` rule of yacc is quite reused but some commands better Usually `expr` rule of yacc is quite reused but some commands better
not support subqueries which comes standard with this rule, like not support subqueries which comes standard with this rule, like
KILL, HA_READ, CREATE/ALTER EVENT etc. Set this to `false` to get KILL, HA_READ, CREATE/ALTER EVENT etc. Set this to a non-NULL
syntax error back. clause name to get an error.
*/ */
bool expr_allows_subselect; const char *clause_that_disallows_subselect;
bool selects_allow_into; bool selects_allow_into;
bool selects_allow_procedure; bool selects_allow_procedure;
/* /*
@ -3988,9 +3988,7 @@ public:
const Lex_ident_cli_st *var_name, const Lex_ident_cli_st *var_name,
const Lex_ident_cli_st *field_name); const Lex_ident_cli_st *field_name);
Item *create_item_query_expression(THD *thd, Item *create_item_query_expression(THD *thd, st_select_lex_unit *unit);
const char *tok_start,
st_select_lex_unit *unit);
Item *make_item_func_replace(THD *thd, Item *org, Item *find, Item *replace); Item *make_item_func_replace(THD *thd, Item *org, Item *find, Item *replace);
Item *make_item_func_substr(THD *thd, Item *a, Item *b, Item *c); Item *make_item_func_substr(THD *thd, Item *a, Item *b, Item *c);
@ -4460,7 +4458,7 @@ public:
bool parsed_body_unit(SELECT_LEX_UNIT *unit); bool parsed_body_unit(SELECT_LEX_UNIT *unit);
SELECT_LEX_UNIT *parsed_body_unit_tail(SELECT_LEX_UNIT *unit, SELECT_LEX_UNIT *parsed_body_unit_tail(SELECT_LEX_UNIT *unit,
Lex_order_limit_lock * l); Lex_order_limit_lock * l);
SELECT_LEX *parsed_subselect(SELECT_LEX_UNIT *unit, char *place); SELECT_LEX *parsed_subselect(SELECT_LEX_UNIT *unit);
bool parsed_insert_select(SELECT_LEX *firs_select); bool parsed_insert_select(SELECT_LEX *firs_select);
bool parsed_TVC_start(); bool parsed_TVC_start();
SELECT_LEX *parsed_TVC_end(); SELECT_LEX *parsed_TVC_end();

View File

@ -1873,7 +1873,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%type <item> %type <item>
literal insert_ident order_ident temporal_literal literal insert_ident order_ident temporal_literal
simple_ident expr expr_no_subselect sum_expr in_sum_expr simple_ident expr sum_expr in_sum_expr
variable variable_aux bool_pri variable variable_aux bool_pri
predicate bit_expr parenthesized_expr predicate bit_expr parenthesized_expr
table_wild simple_expr column_default_non_parenthesized_expr udf_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr
@ -2340,19 +2340,13 @@ deallocate_or_drop:
; ;
prepare: prepare:
PREPARE_SYM ident FROM expr_no_subselect PREPARE_SYM ident FROM
{ { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; }
if (Lex->stmt_prepare($2, $4))
MYSQL_YYABORT;
}
;
expr_no_subselect:
{ Lex->expr_allows_subselect= false; }
expr expr
{ {
Lex->expr_allows_subselect= true; Lex->clause_that_disallows_subselect= NULL;
$$= $2; if (Lex->stmt_prepare($2, $5))
MYSQL_YYABORT;
} }
; ;
@ -2362,20 +2356,25 @@ execute:
if (Lex->stmt_execute($2, $3)) if (Lex->stmt_execute($2, $3))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| EXECUTE_SYM IMMEDIATE_SYM expr_no_subselect execute_using | EXECUTE_SYM IMMEDIATE_SYM
{ Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; }
expr
{ Lex->clause_that_disallows_subselect= NULL; }
execute_using
{ {
if (Lex->stmt_execute_immediate($3, $4)) if (Lex->stmt_execute_immediate($4, $6))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
execute_using: execute_using:
/* nothing */ { $$= NULL; } /* nothing */ { $$= NULL; }
| USING { Lex->expr_allows_subselect= false; } | USING
{ Lex->clause_that_disallows_subselect= "EXECUTE..USING"; }
execute_params execute_params
{ {
$$= $3; $$= $3;
Lex->expr_allows_subselect= true; Lex->clause_that_disallows_subselect= NULL;
} }
; ;
@ -6776,10 +6775,9 @@ parse_vcol_expr:
; ;
parenthesized_expr: parenthesized_expr:
remember_tok_start
query_expression query_expression
{ {
if (!($$= Lex->create_item_query_expression(thd, $1, $2))) if (!($$= Lex->create_item_query_expression(thd, $1)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| expr | expr
@ -9358,10 +9356,9 @@ query_expression:
; ;
subselect: subselect:
remember_tok_start
query_expression query_expression
{ {
if (!($$= Lex->parsed_subselect($2, $1))) if (!($$= Lex->parsed_subselect($1)))
YYABORT; YYABORT;
} }
; ;
@ -12944,17 +12941,16 @@ procedure_clause:
/* /*
PROCEDURE CLAUSE cannot handle subquery as one of its parameter, PROCEDURE CLAUSE cannot handle subquery as one of its parameter,
so set expr_allows_subselect as false to disallow any subqueries so disallow any subqueries further.
further. Reset expr_allows_subselect back to true once the Alow subqueries back once the parameters are reduced.
parameters are reduced.
*/ */
Lex->expr_allows_subselect= false; Lex->clause_that_disallows_subselect= "PROCEDURE";
Select->options|= OPTION_PROCEDURE_CLAUSE; Select->options|= OPTION_PROCEDURE_CLAUSE;
} }
'(' procedure_list ')' '(' procedure_list ')'
{ {
/* Subqueries are allowed from now.*/ /* Subqueries are allowed from now.*/
Lex->expr_allows_subselect= true; Lex->clause_that_disallows_subselect= NULL;
} }
; ;
@ -14701,9 +14697,12 @@ purge:
{ {
Lex->stmt_purge_to($5); Lex->stmt_purge_to($5);
} }
| PURGE master_or_binary LOGS_SYM BEFORE_SYM expr_no_subselect | PURGE master_or_binary LOGS_SYM BEFORE_SYM
{ Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; }
expr
{ {
if (Lex->stmt_purge_before($5)) Lex->clause_that_disallows_subselect= NULL;
if (Lex->stmt_purge_before($6))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
@ -16797,7 +16796,7 @@ handler_tail:
LEX *lex=Lex; LEX *lex=Lex;
if (unlikely(lex->sphead)) if (unlikely(lex->sphead))
my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER"));
lex->expr_allows_subselect= FALSE; lex->clause_that_disallows_subselect= "HANDLER..READ";
lex->sql_command = SQLCOM_HA_READ; lex->sql_command = SQLCOM_HA_READ;
lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */
Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); Item *one= new (thd->mem_root) Item_int(thd, (int32) 1);
@ -16812,7 +16811,7 @@ handler_tail:
handler_read_or_scan opt_where_clause opt_global_limit_clause handler_read_or_scan opt_where_clause opt_global_limit_clause
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->expr_allows_subselect= TRUE; lex->clause_that_disallows_subselect= NULL;
if (!lex->current_select->explicit_limit) if (!lex->current_select->explicit_limit)
{ {
Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); Item *one= new (thd->mem_root) Item_int(thd, (int32) 1);

View File

@ -1358,7 +1358,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%type <item> %type <item>
literal insert_ident order_ident temporal_literal literal insert_ident order_ident temporal_literal
simple_ident expr expr_no_subselect sum_expr in_sum_expr simple_ident expr sum_expr in_sum_expr
variable variable_aux bool_pri variable variable_aux bool_pri
predicate bit_expr parenthesized_expr predicate bit_expr parenthesized_expr
table_wild simple_expr column_default_non_parenthesized_expr udf_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr
@ -1844,19 +1844,13 @@ deallocate_or_drop:
; ;
prepare: prepare:
PREPARE_SYM ident FROM expr_no_subselect PREPARE_SYM ident FROM
{ { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; }
if (Lex->stmt_prepare($2, $4))
MYSQL_YYABORT;
}
;
expr_no_subselect:
{ Lex->expr_allows_subselect= false; }
expr expr
{ {
Lex->expr_allows_subselect= true; Lex->clause_that_disallows_subselect= NULL;
$$= $2; if (Lex->stmt_prepare($2, $5))
MYSQL_YYABORT;
} }
; ;
@ -1866,20 +1860,25 @@ execute:
if (Lex->stmt_execute($2, $3)) if (Lex->stmt_execute($2, $3))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| EXECUTE_SYM IMMEDIATE_SYM expr_no_subselect execute_using | EXECUTE_SYM IMMEDIATE_SYM
{ Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; }
expr
{ Lex->clause_that_disallows_subselect= NULL; }
execute_using
{ {
if (Lex->stmt_execute_immediate($3, $4)) if (Lex->stmt_execute_immediate($4, $6))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
execute_using: execute_using:
/* nothing */ { $$= NULL; } /* nothing */ { $$= NULL; }
| USING { Lex->expr_allows_subselect= false; } | USING
{ Lex->clause_that_disallows_subselect= "EXECUTE..USING"; }
execute_params execute_params
{ {
$$= $3; $$= $3;
Lex->expr_allows_subselect= true; Lex->clause_that_disallows_subselect= NULL;
} }
; ;
@ -6785,10 +6784,9 @@ parse_vcol_expr:
; ;
parenthesized_expr: parenthesized_expr:
remember_tok_start
query_expression query_expression
{ {
if (!($$= Lex->create_item_query_expression(thd, $1, $2))) if (!($$= Lex->create_item_query_expression(thd, $1)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| expr | expr
@ -9459,10 +9457,9 @@ query_expression:
; ;
subselect: subselect:
remember_tok_start
query_expression query_expression
{ {
if (!($$= Lex->parsed_subselect($2, $1))) if (!($$= Lex->parsed_subselect($1)))
YYABORT; YYABORT;
} }
; ;
@ -13054,17 +13051,16 @@ procedure_clause:
/* /*
PROCEDURE CLAUSE cannot handle subquery as one of its parameter, PROCEDURE CLAUSE cannot handle subquery as one of its parameter,
so set expr_allows_subselect as false to disallow any subqueries so disallow any subqueries further.
further. Reset expr_allows_subselect back to true once the Alow subqueries back once the parameters are reduced.
parameters are reduced.
*/ */
Lex->expr_allows_subselect= false; Lex->clause_that_disallows_subselect= "PROCEDURE";
Select->options|= OPTION_PROCEDURE_CLAUSE; Select->options|= OPTION_PROCEDURE_CLAUSE;
} }
'(' procedure_list ')' '(' procedure_list ')'
{ {
/* Subqueries are allowed from now.*/ /* Subqueries are allowed from now.*/
Lex->expr_allows_subselect= true; Lex->clause_that_disallows_subselect= NULL;
} }
; ;
@ -14834,9 +14830,12 @@ purge:
{ {
Lex->stmt_purge_to($5); Lex->stmt_purge_to($5);
} }
| PURGE master_or_binary LOGS_SYM BEFORE_SYM expr_no_subselect | PURGE master_or_binary LOGS_SYM BEFORE_SYM
{ Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; }
expr
{ {
if (Lex->stmt_purge_before($5)) Lex->clause_that_disallows_subselect= NULL;
if (Lex->stmt_purge_before($6))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
@ -17016,7 +17015,7 @@ handler_tail:
LEX *lex=Lex; LEX *lex=Lex;
if (unlikely(lex->sphead)) if (unlikely(lex->sphead))
my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER"));
lex->expr_allows_subselect= FALSE; lex->clause_that_disallows_subselect= "HANDLER..READ";
lex->sql_command = SQLCOM_HA_READ; lex->sql_command = SQLCOM_HA_READ;
lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */
Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); Item *one= new (thd->mem_root) Item_int(thd, (int32) 1);
@ -17031,7 +17030,7 @@ handler_tail:
handler_read_or_scan opt_where_clause opt_global_limit_clause handler_read_or_scan opt_where_clause opt_global_limit_clause
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->expr_allows_subselect= TRUE; lex->clause_that_disallows_subselect= NULL;
if (!lex->current_select->explicit_limit) if (!lex->current_select->explicit_limit)
{ {
Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); Item *one= new (thd->mem_root) Item_int(thd, (int32) 1);