Spracherkennung für: .test vermutete Sprache: SQL {SQL[90] Lisp[59] Masm[59]} [Methode: maximale Elemente, drei Dimensionen]
--echo #
--echo # MDEV-39518 Allow prepared statements in stored functions in assignment right hand
--echo #
--echo # CONTINUE handler inside a PS safe function
CREATE TABLE t1 (a TINYINT);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '22003' /*Numeric value out of range*/
BEGIN
SET @error='Error caught';
END;
INSERT INTO t1 VALUES (1000);
RETURN 0;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT;
INSERT INTO t1 VALUES (10);
SET a= f1();
INSERT INTO t1 VALUES (20);
END;
$$
DELIMITER ;$$
SET @error=NULL;
START TRANSACTION;
CALL p1;
COMMIT;
SELECT * FROM t1;
SELECT @error;
TRUNCATE TABLE t1;
SET @error=NULL;
START TRANSACTION;
CALL p1;
ROLLBACK;
SELECT * FROM t1;
SELECT @error;
SET @error=NULL;
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
--echo # CONTINUE handler inside a procedure calling a PS safe function
CREATE TABLE t1 (a TINYINT);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
INSERT INTO t1 VALUES (1000);
RETURN 0;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT;
DECLARE CONTINUE HANDLER FOR SQLSTATE '22003' /*Numeric value out of range*/
BEGIN
SET @error='Error caught';
END;
INSERT INTO t1 VALUES (10);
SET a= f1();
INSERT INTO t1 VALUES (20);
END;
$$
DELIMITER ;$$
SET @error=NULL;
START TRANSACTION;
CALL p1;
COMMIT;
SELECT * FROM t1;
SELECT @error;
TRUNCATE TABLE t1;
SET @error=NULL;
START TRANSACTION;
CALL p1;
ROLLBACK;
SELECT * FROM t1;
SELECT @error;
SET @error=NULL;
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
--echo # EXIT handler inside a PS-safe function
CREATE TABLE t1 (a TINYINT);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '22003' /*Numeric value out of range*/
BEGIN
SET @error='Error caught';
RESIGNAL;
END;
INSERT INTO t1 VALUES (1000);
RETURN 0;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT;
INSERT INTO t1 VALUES (10);
SET a= f1();
INSERT INTO t1 VALUES (20);
END;
$$
DELIMITER ;$$
SET @error=NULL;
START TRANSACTION;
--error ER_WARN_DATA_OUT_OF_RANGE
CALL p1;
COMMIT;
SELECT * FROM t1;
SELECT @error;
TRUNCATE TABLE t1;
SET @error=NULL;
START TRANSACTION;
--error ER_WARN_DATA_OUT_OF_RANGE
CALL p1;
ROLLBACK;
SELECT * FROM t1;
SELECT @error;
SET @error=NULL;
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
--echo # EXIT handler inside a procedure calling a PS-safe function
CREATE TABLE t1 (a TINYINT);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
INSERT INTO t1 VALUES (1000);
RETURN 0;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT;
DECLARE EXIT HANDLER FOR SQLSTATE '22003' /*Numeric value out of range*/
BEGIN
SET @error='Error caught';
RESIGNAL;
END;
INSERT INTO t1 VALUES (10);
SET a= f1();
INSERT INTO t1 VALUES (20);
END;
$$
DELIMITER ;$$
SET @error=NULL;
START TRANSACTION;
--error ER_WARN_DATA_OUT_OF_RANGE
CALL p1;
COMMIT;
SELECT * FROM t1;
SELECT @error;
TRUNCATE TABLE t1;
SET @error=NULL;
START TRANSACTION;
--error ER_WARN_DATA_OUT_OF_RANGE
CALL p1;
ROLLBACK;
SELECT * FROM t1;
SELECT @error;
SET @error=NULL;
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
--echo #
--echo # EXECUTE IMMEDIATE 'SELECT' + CONTINUE HANDLER in the caller
--echo #
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES (1),(2),(3);
DELIMITER $$;
CREATE FUNCTION f_sel() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'SELECT a FROM t1 ORDER BY a';
RETURN 1;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE v INT DEFAULT 0;
DECLARE done INT DEFAULT 0;
DECLARE c CURSOR FOR SELECT a FROM t1 ORDER BY a;
DECLARE CONTINUE HANDLER FOR 1415 /*ER_SP_NO_RETSET*/ SET done= done+1;
OPEN c;
FETCH c INTO v;
SELECT v AS v_after_first_fetch;
SET v= f_sel();
SELECT v AS v_after_error, done;
FETCH c INTO v;
SELECT v AS v_after_second_fetch;
SET v= f_sel();
SET v= f_sel();
SELECT v AS v_end, done AS done_end;
CLOSE c;
END;
$$
DELIMITER ;$$
CALL p1();
CALL p1();
DROP PROCEDURE p1;
DROP FUNCTION f_sel;
DROP TABLE t1;
--echo #
--echo # Reuse the same PS at top level after the failure
--echo #
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES (1),(2),(3);
PREPARE stmt FROM 'SELECT a FROM t1 WHERE a>? ORDER BY a';
DELIMITER $$;
CREATE FUNCTION f1_ps_select() RETURNS INT
BEGIN
EXECUTE stmt USING 1;
RETURN 2;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE v INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR 1415 /*ER_SP_NO_RETSET*/ BEGIN END;
SET v= f1_ps_select();
SELECT v AS v_p2;
END;
$$
DELIMITER ;$$
CALL p2();
EXECUTE stmt USING 1;
CALL p2();
EXECUTE stmt USING 2;
DROP PROCEDURE p2;
DROP FUNCTION f1_ps_select;
DEALLOCATE PREPARE stmt;
DROP TABLE t1;
--echo #
--echo # SET STATEMENT ... FOR EXECUTE for 'SELECT..' inside the function
--echo # Handling ER_SP_NO_RETSET
--echo #
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES (1),(2),(3);
PREPARE stmt FROM 'SELECT a FROM t1 WHERE a>? ORDER BY a';
DELIMITER $$;
CREATE FUNCTION f1_ss() RETURNS INT
BEGIN
SET STATEMENT max_sort_length=2048 FOR EXECUTE stmt USING CONCAT('1');
RETURN 3;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE v INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR 1415 /*ER_SP_NO_RETSET*/ BEGIN END;
SET v= f1_ss();
SET v= f1_ss();
SELECT v AS v_p2;
END;
$$
DELIMITER ;$$
CALL p2();
EXECUTE stmt USING 1;
DROP PROCEDURE p2;
DROP FUNCTION f1_ss;
DEALLOCATE PREPARE stmt;
DROP TABLE t1;
--echo #
--echo # SET STATEMENT ... FOR EXECUTE for 'INSERT..' inside the function
--echo # Handling ER_DUP_ENTRY
--echo #
SET @@max_sort_length=1024;
CREATE TABLE t1(a INT PRIMARY KEY);
INSERT INTO t1 VALUES (2048);
PREPARE stmt FROM 'INSERT INTO t1 VALUES (?)';
DELIMITER $$;
CREATE FUNCTION f1_ss(msl INT) RETURNS INT
BEGIN
SET STATEMENT max_sort_length=msl FOR EXECUTE stmt USING @@max_sort_length;
RETURN 3;
END;
$$
CREATE PROCEDURE p2()
BEGIN
DECLARE v INT DEFAULT 0;
DECLARE raised INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR 1062 /*ER_DUP_ENTRY*/
BEGIN SET raised= raised+1; END;
SET v= f1_ss(2049); -- This insert with no errors
SET v= f1_ss(2048); -- This fires the handler on "duplicate key" error
SET v= f1_ss(2048); -- This fires the handler on "duplicate key" error
SELECT v, raised;
END;
$$
DELIMITER ;$$
CALL p2();
SELECT * FROM t1 ORDER BY a;
EXECUTE stmt USING 1;
DROP PROCEDURE p2;
DROP FUNCTION f1_ss;
DEALLOCATE PREPARE stmt;
DROP TABLE t1;
SET @@max_sort_length=DEFAULT;
--echo #
--echo # EXECUTE for 'SELECT..' with nested functions
--echo #
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1),(2);
DELIMITER $$;
CREATE FUNCTION f1_sel() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'SELECT a FROM t1';
RETURN 1;
END;
$$
CREATE FUNCTION f2_outer() RETURNS INT
BEGIN
DECLARE x INT DEFAULT f1_sel();
RETURN x+100;
END;
$$
CREATE PROCEDURE p3()
BEGIN
DECLARE v INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR 1415 /*ER_SP_NO_RETSET*/ BEGIN END;
SET v= f2_outer();
SELECT v;
END;
$$
DELIMITER ;$$
CALL p3();
CALL p3();
DROP PROCEDURE p3;
DROP FUNCTION f2_outer;
DROP FUNCTION f1_sel;
DROP TABLE t1;
--echo # End of 13.1 tests
[Dauer der Verarbeitung: 0.14 Sekunden, vorverarbeitet 2026-10-08]