Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/MariaDB/mysql-test/main/   (MariaDB Server Version 8.1-8.4©)  Datei vom 1.9.2026 mit Größe 6 kB image not shown  

Quelle  ps_in_func-condition-handler.test  Sprache: unbekannt

 
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]