Spracherkennung für: .test vermutete Sprache: SQL {SQL[90] ADA[54] VHDL[54]} [Methode: maximale Elemente, drei Dimensionen]
--echo #
--echo # MDEV-39518 Allow prepared statements in stored functions in assignment right hand
--echo #
--echo #
--echo # ROW variables
--echo #
CREATE TABLE t1 (a INT,b VARCHAR(10));
INSERT INTO t1 VALUES (10,'b10');
DELIMITER $$;
CREATE FUNCTION f1() RETURNS ROW(a INT, b VARCHAR(10))
BEGIN
EXECUTE IMMEDIATE 'UPDATE t1 SET a=a+11';
RETURN ROW(100,'b100');
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE r ROW(a INT,b VARCHAR(10)) DEFAULT f1();
SELECT r.a, r.b;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE r ROW(a INT,b VARCHAR(10));
SET r= f1();
SELECT r.a, r.b;
END;
$$
DELIMITER ;$$
--error ER_OPERAND_COLUMNS
SELECT f1();
CALL p1;
CALL p2;
DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP FUNCTION f1;
DROP TABLE t1;
--echo #
--echo # ROW variables initialized from a nested ROW value
--echo # This produces ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
--echo # The test just makes sure Item_row::set_in_ps_safe_context() works fine
--echo #
CREATE TABLE t1 (a INT,b VARCHAR(10));
INSERT INTO t1 VALUES (10,'b10');
DELIMITER $$;
CREATE FUNCTION f1() RETURNS ROW(a INT, b VARCHAR(10))
BEGIN
EXECUTE IMMEDIATE 'UPDATE t1 SET a=a+11';
RETURN ROW(100,'b100');
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE r ROW(a INT,b VARCHAR(10)) DEFAULT ROW(f1(),100);
SELECT r.a, r.b;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE r ROW(a INT,b VARCHAR(10));
SET r= ROW(f1(),100);
SELECT r.a, r.b;
END;
$$
DELIMITER ;$$
--error ER_OPERAND_COLUMNS
SELECT f1();
--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p1;
--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
CALL p2;
DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP FUNCTION f1;
DROP TABLE t1;
--echo #
--echo # ROW fields
--echo #
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (10);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'UPDATE t1 SET a=a+1';
RETURN 100;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE r ROW (a INT, b VARCHAR(10)) DEFAULT ROW(f1(),'b100');
SELECT r.a, r.b;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE r ROW (a INT, b VARCHAR(10));
SET r.a= f1();
SET r.b= 'b100';
SELECT r.a, r.b;
END;
$$
DELIMITER ;$$
--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG
SELECT f1();
CALL p1;
CALL p2;
SELECT * FROM t1;
DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP FUNCTION f1;
DROP TABLE t1;
--echo #
--echo # A ROW value naming two functions, only the first one has PS.
--echo #
--echo # The statement is not pre-locked, so no MDL is taken on its routines
--echo # and their tables are not collected. The routines still have to be
--echo # put into the sp cache, all of them: Item_func_sp::fix_fields()
--echo # resolves them from the cache only, so a routine which is missing
--echo # there is reported as non existing.
--echo #
CREATE TABLE t1 (a INT);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO t1 VALUES (10)';
RETURN 10;
END;
$$
CREATE FUNCTION f2() RETURNS INT
BEGIN
RETURN 20;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE r ROW(a INT, b INT);
SET r= ROW(f1(), f2());
SELECT r.a, r.b;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE r ROW(a INT, b INT) DEFAULT ROW(f1(), f2());
SELECT r.a, r.b;
END;
$$
DELIMITER ;$$
CALL p1;
CALL p2;
SELECT * FROM t1;
DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP TABLE t1;
--echo # End of 13.1 tests
[Dauer der Verarbeitung: 0.15 Sekunden, vorverarbeitet 2026-10-08]