Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  ps_in_func-stack3-pff.test  Sprache: unbekannt

 
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]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1126438
#Domains=1867298