Spracherkennung für: .test vermutete Sprache: SQL {SQL[90] Masm[88] Lisp[44]} [Methode: maximale Elemente, drei Dimensionen]
--source include/have_innodb.inc
--echo #
--echo # MDEV-39518 Allow prepared statements in stored functions in assignment right hand
--echo #
# Statements causing implicit or explicit commit are not allowed in functions
# - DDL statements
# - COMMIT
--echo #
--echo # PREPARE/EXECUTE/DEALLOCATE
--echo #
DELIMITER $$;
CREATE FUNCTION f1(query TEXT) RETURNS INT
BEGIN
DECLARE nrows INT;
PREPARE stmt FROM query;
EXECUTE stmt;
SET nrows= ROW_COUNT();
DEALLOCATE PREPARE stmt;
RETURN nrows;
END;
$$
CREATE PROCEDURE p1(query TEXT)
BEGIN
DECLARE nrows INT;
SET nrows= f1(query);
SELECT nrows;
SELECT * FROM t1;
END;
$$
DELIMITER ;$$
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('CREATE TABLE t1 (a INT)');
CREATE TABLE t1 (a INT);
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('ALTER TABLE t1 MODIFY a BIGINT');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('DROP TABLE t1');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('START TRANSACTION');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('COMMIT');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('ROLLBACK');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('LOCK TABLES t1 READ');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('LOCK TABLES t1 WRITE');
DROP TABLE t1;
DROP PROCEDURE p1;
DROP FUNCTION f1;
--echo #
--echo # Same as above but with EXECUTE IMMEDIATE
--echo # Statements causing implicit or explicit commit are not allowed, e.g:
--echo # - DDL statements
--echo # - COMMIT
--echo # Even in assignment context
--echo #
DELIMITER $$;
CREATE FUNCTION f1(query TEXT) RETURNS INT
BEGIN
DECLARE nrows INT;
EXECUTE IMMEDIATE query;
SET nrows= ROW_COUNT();
RETURN nrows;
END;
$$
CREATE PROCEDURE p1(query TEXT)
BEGIN
DECLARE nrows INT;
SET nrows= f1(query);
SELECT nrows;
SELECT * FROM t1;
END;
$$
DELIMITER ;$$
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('CREATE TABLE t1 (a INT)');
CREATE TABLE t1 (a INT);
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('ALTER TABLE t1 MODIFY a BIGINT');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('DROP TABLE t1');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('START TRANSACTION');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('COMMIT');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('ROLLBACK');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('LOCK TABLES t1 READ');
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p1('LOCK TABLES t1 WRITE');
DROP TABLE t1;
DROP PROCEDURE p1;
DROP FUNCTION f1;
--echo #
--echo # MDEV-40225 Assertion `!thd->in_sub_stmt && !(thd->state_flags & Open_tables_state::BACKUPS_AVAIL)' failed in int Locked_tables_list::unlock_locked_tables(THD *)
--echo #
CREATE TABLE t1(a INT);
DELIMITER $$;
CREATE FUNCTION f() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'LOCK TABLES t1 WRITE';
RETURN 1;
END;
$$
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT f();
END;
$$
DELIMITER ;$$
--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CALL p();
DROP PROCEDURE p;
DROP FUNCTION f;
DROP TABLE t1;
--echo #
--echo # MDEV-40890 ROLLBACK TO SAVEPOINT crashes the server
--echo #
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (10);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
SAVEPOINT s;
UPDATE t1 SET a=11;
ROLLBACK TO SAVEPOINT s;
RETURN 1;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT DEFAULT f1();
END;
$$
DELIMITER ;$$
START TRANSACTION;
CALL p1;
COMMIT;
SELECT * FROM t1;
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (10);
DELIMITER $$;
CREATE FUNCTION f1() RETURNS INT
BEGIN
EXECUTE IMMEDIATE 'SAVEPOINT s';
UPDATE t1 SET a=11;
EXECUTE IMMEDIATE 'ROLLBACK TO SAVEPOINT s';
RETURN 1;
END;
$$
CREATE PROCEDURE p1()
BEGIN
DECLARE a INT DEFAULT f1();
END;
$$
DELIMITER ;$$
START TRANSACTION;
CALL p1;
COMMIT;
SELECT * FROM t1;
DROP PROCEDURE p1;
DROP FUNCTION f1;
DROP TABLE t1;
--echo # End of 13.1 tests
[Dauer der Verarbeitung: 0.13 Sekunden, vorverarbeitet 2026-10-08]