Spracherkennung für: .test vermutete Sprache: SQL {SQL[80] Lisp[51] Masm[51]} [Methode: maximale Elemente, drei Dimensionen]
--echo #
--echo # MDEV-39518 Allow prepared statements in stored functions in assignment right hand
--echo #
# Call stack: PROCEDURE - FUNCTION - FUNCTION
--echo # P(none,default/set)-F(none,set)-F(immediate)
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f_immediate() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (10)';
RETURN ROW_COUNT();
END;
$$
CREATE FUNCTION f2_set() RETURNS INT
BEGIN
DECLARE nrows INT;
SET nrows= f_immediate();
RETURN nrows;
END;
$$
CREATE PROCEDURE p3_default()
BEGIN
DECLARE nrows INT DEFAULT f2_set();
END;
$$
CREATE PROCEDURE p3_set()
BEGIN
DECLARE nrows INT;
SET nrows= f2_set();
SELECT nrows;
END;
$$
CREATE PROCEDURE p3_select()
BEGIN
SELECT f2_set();
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p3_select();
CALL p3_default;
CALL p3_default;
SELECT * FROM t1;
TRUNCATE TABLE t1;
CALL p3_set;
CALL p3_set;
SELECT * FROM t1;
DROP PROCEDURE p3_select;
DROP PROCEDURE p3_default;
DROP PROCEDURE p3_set;
DROP FUNCTION f2_set;
DROP FUNCTION f_immediate;
DROP TABLE t1;
--echo # P(none,default/set)-F(none,default)-F(immediate)
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f_immediate() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (10)';
RETURN ROW_COUNT();
END;
$$
CREATE FUNCTION f2_default() RETURNS INT
BEGIN
DECLARE nrows INT DEFAULT f_immediate();
RETURN nrows;
END;
$$
CREATE PROCEDURE p3_default()
BEGIN
DECLARE nrows INT DEFAULT f2_default();
END;
$$
CREATE PROCEDURE p3_set()
BEGIN
DECLARE nrows INT;
SET nrows= f2_default();
SELECT nrows;
END;
$$
DELIMITER ;$$
CALL p3_default;
CALL p3_default;
SELECT * FROM t1;
TRUNCATE TABLE t1;
CALL p3_set;
CALL p3_set;
SELECT * FROM t1;
DROP PROCEDURE p3_default;
DROP PROCEDURE p3_set;
DROP FUNCTION f2_default;
DROP FUNCTION f_immediate;
DROP TABLE t1;
--echo # P(none,default/set)-F(none,default)-F(direct+immediate)
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f1_direct_immediate() RETURNS INT
BEGIN
DECLARE nrows INT;
INSERT INTO t1 VALUES (9);
SET nrows= ROW_COUNT();
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (10)';
RETURN nrows + ROW_COUNT();
END;
$$
CREATE FUNCTION f2_default() RETURNS INT
BEGIN
DECLARE nrows INT DEFAULT f1_direct_immediate();
RETURN nrows;
END;
$$
CREATE PROCEDURE p3_select()
BEGIN
SELECT f2_default();
END;
$$
CREATE PROCEDURE p3_default()
BEGIN
DECLARE nrows INT DEFAULT f2_default();
SELECT * FROM t1;
END;
$$
CREATE PROCEDURE p3_set()
BEGIN
DECLARE nrows INT;
SET nrows= f2_default();
SELECT nrows;
SELECT * FROM t1;
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p3_select();
CALL p3_default();
CALL p3_default();
TRUNCATE TABLE t1;
CALL p3_set();
CALL p3_set();
SELECT * FROM t1;
DROP FUNCTION f1_direct_immediate;
DROP FUNCTION f2_default;
DROP PROCEDURE p3_select;
DROP PROCEDURE p3_default;
DROP PROCEDURE p3_set;
DROP TABLE t1;
--echo # P(direct+immediate,default/set)-F(direct+immediate,set)-F(direct+immediate)
CREATE TABLE t1 (id SERIAL, a VARCHAR(100));
DELIMITER $$;
CREATE FUNCTION f1_direct_immediate() RETURNS INT
BEGIN
DECLARE nrows INT;
INSERT INTO t1 (a) VALUES ('f1_direct_immediate: direct');
SET nrows= ROW_COUNT();
EXECUTE IMMEDIATE 'INSERT INTO t1 (a) VALUES (?)' USING 'f1_direct_immediate: immediate';
RETURN nrows + ROW_COUNT();
END;
$$
CREATE FUNCTION f2_set() RETURNS INT
BEGIN
DECLARE nrows1, nrows2, nrows3 INT;
INSERT INTO t1 (a) VALUES ('f2_set: direct before f1_direct_immediate');
SET nrows1= ROW_COUNT();
SET nrows2= f1_direct_immediate();
EXECUTE IMMEDIATE 'INSERT INTO t1 (a) VALUES (?)'
USING 'f2_set: immediate after f1_direct_immediate';
SET nrows3= ROW_COUNT();
RETURN nrows1 + nrows2 + nrows3;
END;
$$
CREATE PROCEDURE p3_default()
BEGIN
DECLARE nrows1 INT DEFAULT f2_set();
DECLARE nrows2, nrows3 INT;
INSERT INTO t1 (a) VALUES('p3_default: direct after default f2_set');
SET nrows2= ROW_COUNT();
EXECUTE IMMEDIATE 'INSERT INTO t1 (a) VALUES (?)'
USING 'p3_default: immediate after default p2_set';
SET nrows3= ROW_COUNT();
SELECT nrows1, nrows2, nrows3;
SELECT * FROM t1;
END;
$$
CREATE PROCEDURE p3_set()
BEGIN
DECLARE nrows1, nrows2, nrows3 INT;
EXECUTE IMMEDIATE 'INSERT INTO t1 (a) VALUES (?)'
USING 'p3_set: immediate before f2_set';
SET nrows1= ROW_COUNT();
SET nrows2= f2_set();
INSERT INTO t1 (a) VALUES('p3_set: direct after p2_set');
SET nrows3= ROW_COUNT();
SELECT nrows1, nrows2, nrows3;
SELECT * FROM t1;
END;
$$
DELIMITER ;$$
CALL p3_default();
CALL p3_default();
TRUNCATE TABLE t1;
CALL p3_set();
CALL p3_set();
DROP FUNCTION f1_direct_immediate;
DROP FUNCTION f2_set;
DROP PROCEDURE p3_default;
DROP PROCEDURE p3_set;
DROP TABLE t1;
--echo # P(none,default/set)-F(none,default)-F(sys_refcursor)
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (9), (10);
SET sql_mode=ORACLE;
DELIMITER $$;
CREATE FUNCTION f1_sys_refcursor() RETURN INT AS
c0 SYS_REFCURSOR;
va INT;
BEGIN
PREPARE stmt FROM 'SELECT MAX(a) FROM t1';
OPEN c0 FOR PREPARE stmt;
FETCH c0 INTO va;
CLOSE c0;
RETURN va;
END;
$$
CREATE FUNCTION f2_default() RETURN INT AS
va INT := f1_sys_refcursor();
BEGIN
RETURN va;
END;
$$
CREATE PROCEDURE p3_select() AS
BEGIN
SELECT f2_default();
END;
$$
CREATE PROCEDURE p3_default() AS
va INT DEFAULT f2_default();
BEGIN
SELECT va;
END;
$$
CREATE PROCEDURE p3_set() AS
va INT;
BEGIN
va:= f2_default();
SELECT va;
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p3_select();
CALL p3_default();
CALL p3_default();
CALL p3_set();
CALL p3_set();
DROP FUNCTION f1_sys_refcursor;
DROP FUNCTION f2_default;
DROP PROCEDURE p3_select;
DROP PROCEDURE p3_default;
DROP PROCEDURE p3_set;
DROP TABLE t1;
SET sql_mode=DEFAULT;
--echo # P(none,default/set)-F(none,default)-F(direct+sys_refcursor)
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (9), (10);
SET sql_mode=ORACLE;
DELIMITER $$;
CREATE FUNCTION f1_sys_refcursor() RETURN INT AS
c0 SYS_REFCURSOR;
va INT;
BEGIN
va:= (SELECT MAX(a) FROM t1);
INSERT INTO t1 VALUES (va+1);
PREPARE stmt FROM 'SELECT MAX(a) FROM t1';
OPEN c0 FOR PREPARE stmt;
FETCH c0 INTO va;
CLOSE c0;
RETURN va;
END;
$$
CREATE FUNCTION f2_default() RETURN INT AS
va INT := f1_sys_refcursor();
BEGIN
RETURN va;
END;
$$
CREATE PROCEDURE p3_select() AS
BEGIN
SELECT f2_default();
END;
$$
CREATE PROCEDURE p3_default() AS
va INT DEFAULT f2_default();
BEGIN
SELECT va;
END;
$$
CREATE PROCEDURE p3_set() AS
va INT;
BEGIN
va:= f2_default();
SELECT va;
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p3_select();
CALL p3_default();
CALL p3_default();
CALL p3_set();
CALL p3_set();
DROP FUNCTION f1_sys_refcursor;
DROP FUNCTION f2_default;
DROP PROCEDURE p3_select;
DROP PROCEDURE p3_default;
DROP PROCEDURE p3_set;
DROP TABLE t1;
SET sql_mode=DEFAULT;
--echo #
--echo # MDEV-40240 Dynamic SQL must be rejected with ERROR 1336 when using non-safe context
--echo #
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f_leaf() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (777)';
RETURN 1;
END
$$
CREATE FUNCTION f_mid() RETURNS INT
BEGIN
DECLARE x INT;
SET x = 100 + f_leaf(); -- Not safe call
RETURN x;
END
$$
CREATE PROCEDURE p()
BEGIN
DECLARE r INT DEFAULT f_mid();
END
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p();
SELECT * FROM t1;
DROP PROCEDURE p;
DROP FUNCTION f_mid;
DROP FUNCTION f_leaf;
DROP TABLE t1;
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f_leaf() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (777)';
RETURN 1;
END
$$
CREATE FUNCTION f_mid() RETURNS INT
BEGIN
DECLARE x INT;
INSERT INTO t1 VALUES (f_leaf()); -- Not safe call
RETURN x;
END;
$$
CREATE PROCEDURE p()
BEGIN
DECLARE r INT DEFAULT f_mid();
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p();
DROP PROCEDURE p;
DROP FUNCTION f_mid;
DROP FUNCTION f_leaf;
DROP TABLE t1;
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f_leaf() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (777,777)'; -- Bad statement
RETURN 1;
END;
$$
CREATE FUNCTION f_mid() RETURNS INT
BEGIN
DECLARE x INT;
INSERT INTO t1 VALUES (f_leaf());
RETURN x;
END;
$$
CREATE PROCEDURE p()
BEGIN
DECLARE r INT DEFAULT f_mid();
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p();
DROP PROCEDURE p;
DROP FUNCTION f_mid;
DROP FUNCTION f_leaf;
DROP TABLE t1;
--echo #
--echo # MDEV-40913 Function with EXECUTE IMMEDIATE crashes on INSERT with an InnoDB table
--echo #
CREATE TABLE t1 (a VARCHAR(30));
DELIMITER $$;
CREATE FUNCTION f3() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (''f3-immediate'')';
RETURN 0;
END;
$$
CREATE FUNCTION f2() RETURNS INT
BEGIN
DECLARE v3 VARCHAR(10) DEFAULT f3();
INSERT INTO t1 VALUES ('f2-direct');
RETURN 0;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE v2 VARCHAR(10) DEFAULT f2();
END;
$$
DELIMITER ;$$
CALL p1;
SELECT * FROM t1 ORDER BY a DESC;
DROP PROCEDURE p1;
DROP FUNCTION f2;
DROP FUNCTION f3;
DROP TABLE t1;
--echo #
--echo # MDEV-40914 Function with direct INSERT into Aria table crashes
--echo #
CREATE TABLE t1 (a VARCHAR(30));
DELIMITER $$;
CREATE FUNCTION f3() RETURNS INT
BEGIN
INSERT INTO t1 VALUES ('f3-direct');
RETURN 0;
END;
$$
CREATE FUNCTION f2() RETURNS INT
BEGIN
DECLARE v3 VARCHAR(10) DEFAULT f3();
INSERT INTO t1 VALUES ('f2-direct');
RETURN 0;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE v2 VARCHAR(10) DEFAULT f2();
END;
$$
DELIMITER ;$$
CALL p1;
SELECT * FROM t1 ORDER BY a;
DROP PROCEDURE p1;
DROP FUNCTION f2;
DROP FUNCTION f3;
DROP TABLE t1;
--echo #
--echo # Various combinations
--echo #
let $i1= 0;
while ($i1 < 4)
{
let $part1=;
if ($i1 == 0) { let $part1=none; }
if ($i1 == 1) { let $part1=direct; }
if ($i1 == 2) { let $part1=immediate; }
if ($i1 == 3) { let $part1=direct_immediate; }
inc $i1;
echo #;
echo # $part1|*|*;
echo #;
let $i2= 0;
while ($i2 < 4)
{
let $part2=;
if ($i2 == 0) { let $part2=none; }
if ($i2 == 1) { let $part2=direct; }
if ($i2 == 2) { let $part2=immediate; }
if ($i2 == 3) { let $part2=direct_immediate; }
inc $i2;
let $param='$part1|$part2|none';
source ps_in_func-stack3-pff-01.inc;
let $param='$part1|$part2|direct';
source ps_in_func-stack3-pff-01.inc;
let $param='$part1|$part2|immediate';
source ps_in_func-stack3-pff-01.inc;
let $param='$part1|$part2|direct_immediate';
source ps_in_func-stack3-pff-01.inc;
}
}
--echo # End of 13.1 tests
[Dauer der Verarbeitung: 0.3 Sekunden, vorverarbeitet 2026-10-08]