mirror of
https://github.com/MariaDB/server.git
synced 2025-08-20 05:03:09 +03:00
174 lines
3.3 KiB
Plaintext
174 lines
3.3 KiB
Plaintext
SET sql_mode=ORACLE;
|
|
#
|
|
# MDEV-10801 sql_mode: dynamic SQL placeholders
|
|
#
|
|
SET @a=10, @b=20;
|
|
PREPARE stmt FROM 'SELECT ?,?';
|
|
EXECUTE stmt USING @a, @b;
|
|
? ?
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :a,:b';
|
|
EXECUTE stmt USING @a, @b;
|
|
:a :b
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :aaa,:bbb';
|
|
EXECUTE stmt USING @a, @b;
|
|
:aaa :bbb
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :"a",:"b"';
|
|
EXECUTE stmt USING @a, @b;
|
|
:"a" :"b"
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :"aaa",:"bbb"';
|
|
EXECUTE stmt USING @a, @b;
|
|
:"aaa" :"bbb"
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :1,:2';
|
|
EXECUTE stmt USING @a, @b;
|
|
:1 :2
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :222,:111';
|
|
EXECUTE stmt USING @a, @b;
|
|
:222 :111
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :0,:65535';
|
|
EXECUTE stmt USING @a, @b;
|
|
:0 :65535
|
|
10 20
|
|
PREPARE stmt FROM 'SELECT :65535,:0';
|
|
EXECUTE stmt USING @a, @b;
|
|
:65535 :0
|
|
10 20
|
|
#
|
|
# MDEV-10709 Expressions as parameters to Dynamic SQL
|
|
#
|
|
#
|
|
# Testing disallowed expressions in USING
|
|
#
|
|
PREPARE stmt FROM 'SELECT :1 FROM DUAL';
|
|
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
|
|
DEALLOCATE PREPARE stmt;
|
|
CREATE FUNCTION f1() RETURN VARCHAR
|
|
AS
|
|
BEGIN
|
|
RETURN 'test';
|
|
END;
|
|
$$
|
|
PREPARE stmt FROM 'SELECT ? FROM DUAL';
|
|
EXECUTE stmt USING f1();
|
|
ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
|
|
DEALLOCATE PREPARE stmt;
|
|
DROP FUNCTION f1;
|
|
#
|
|
# Using a user variable as a EXECUTE..USING out parameter
|
|
#
|
|
CREATE PROCEDURE p1(a OUT INT)
|
|
AS
|
|
BEGIN
|
|
a:= 10;
|
|
END;
|
|
/
|
|
SET @a=1;
|
|
CALL p1(@a);
|
|
SELECT @a;
|
|
@a
|
|
10
|
|
SET @a=2;
|
|
PREPARE stmt FROM 'CALL p1(?)';
|
|
EXECUTE stmt USING @a;
|
|
SELECT @a;
|
|
@a
|
|
10
|
|
DROP PROCEDURE p1;
|
|
#
|
|
# Using an SP variable as a EXECUTE..USING out parameter
|
|
#
|
|
CREATE PROCEDURE p1 (a OUT INT)
|
|
AS
|
|
BEGIN
|
|
a:=10;
|
|
END;
|
|
/
|
|
CREATE PROCEDURE p2 (a OUT INT)
|
|
AS
|
|
BEGIN
|
|
PREPARE stmt FROM 'CALL p1(?)';
|
|
EXECUTE stmt USING a;
|
|
END;
|
|
/
|
|
SET @a= 1;
|
|
CALL p2(@a);
|
|
SELECT @a;
|
|
@a
|
|
10
|
|
DROP PROCEDURE p2;
|
|
DROP PROCEDURE p1;
|
|
#
|
|
# Using a trigger field as a EXECUTE..USING out parameter
|
|
#
|
|
CREATE PROCEDURE p1 (a OUT INT)
|
|
AS
|
|
BEGIN
|
|
a:= 10;
|
|
END;
|
|
/
|
|
CREATE TABLE t1 (a INT);
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW CALL p1(:NEW.a);
|
|
INSERT INTO t1 VALUES (1);
|
|
SELECT * FROM t1;
|
|
a
|
|
10
|
|
DROP TABLE t1;
|
|
DROP PROCEDURE p1;
|
|
#
|
|
# Testing re-prepare on a table metadata update between PREPARE and EXECUTE
|
|
#
|
|
CREATE TABLE t1 (a INT);
|
|
CREATE PROCEDURE p1(a IN INT)
|
|
AS
|
|
BEGIN
|
|
INSERT INTO t1 VALUES (a);
|
|
END;
|
|
/
|
|
PREPARE stmt FROM 'CALL p1(?)';
|
|
EXECUTE stmt USING 10;
|
|
SELECT * FROM t1;
|
|
a
|
|
10
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW NEW.a:=NEW.a+1;
|
|
EXECUTE stmt USING 20;
|
|
SELECT * FROM t1;
|
|
a
|
|
10
|
|
21
|
|
DEALLOCATE PREPARE stmt;
|
|
DROP PROCEDURE p1;
|
|
DROP TABLE t1;
|
|
#
|
|
# End of MDEV-10709 Expressions as parameters to Dynamic SQL
|
|
#
|
|
#
|
|
# MDEV-10585 EXECUTE IMMEDIATE statement
|
|
#
|
|
#
|
|
# Testing disallowed expressions in USING
|
|
#
|
|
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
|
|
CREATE FUNCTION f1() RETURN VARCHAR
|
|
AS
|
|
BEGIN
|
|
RETURN 'test';
|
|
END;
|
|
$$
|
|
EXECUTE IMMEDIATE 'SELECT ? FROM DUAL' USING f1();
|
|
ERROR 42000: EXECUTE..USING does not support subqueries or stored functions
|
|
DROP FUNCTION f1;
|
|
#
|
|
# Testing simple expressions
|
|
#
|
|
EXECUTE IMMEDIATE 'SELECT :1 FROM DUAL' USING 10;
|
|
:1
|
|
10
|