mirror of
https://github.com/MariaDB/server.git
synced 2025-02-16 02:15:33 +01:00
![Dmitry Shulga](/assets/img/avatar_default.png)
Calling a stored routine that executes a join on three or more tables and referencing not-existent column name in the USING clause resulted in a crash on its second invocation. Server crash taken place by the reason of dereferencing null pointer in condition of DBUG_ASSERT inside the method Field_iterator_natural_join::next() There the data member cur_column_ref->table_field->field has the nullptr value that was reset at the end of first execution of a stored routine when the standalone procedure cleanup_items() called by the method sp_head::execute. Later this data member is not re-initialized and never referenced in any place except the DBUG_ASSERT on second and later invocations of the stored routine. To fix the issue, the assert's condition should be augmented by a condition '|| !cur_column_ref->table_field' before dereferencing cur_column_ref->table_field. Such extra checking is aligned with conditions used by DBUG_ASSERT macros used by implementation of the class Field_iterator_table_ref that aggregated the class Field_iterator_natural_join.
419 lines
9.1 KiB
Text
419 lines
9.1 KiB
Text
# Test file for stored procedure bugfixes
|
|
|
|
--echo #
|
|
--echo # Bug #47412: Valgrind warnings / user can read uninitialized memory
|
|
--echo # using SP variables
|
|
--echo #
|
|
|
|
CREATE SCHEMA testdb;
|
|
USE testdb;
|
|
DELIMITER |;
|
|
CREATE FUNCTION f2 () RETURNS INTEGER
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
|
RETURN f_not_exists () ;
|
|
END|
|
|
CREATE PROCEDURE p3 ( arg1 VARCHAR(32) )
|
|
BEGIN
|
|
CALL p_not_exists ( );
|
|
END|
|
|
DELIMITER ;|
|
|
--echo # should not return valgrind warnings
|
|
--error ER_SP_DOES_NOT_EXIST
|
|
CALL p3 ( f2 () );
|
|
|
|
DROP SCHEMA testdb;
|
|
|
|
CREATE SCHEMA testdb;
|
|
USE testdb;
|
|
DELIMITER |;
|
|
CREATE FUNCTION f2 () RETURNS INTEGER
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
|
RETURN f_not_exists () ;
|
|
END|
|
|
CREATE PROCEDURE p3 ( arg2 INTEGER )
|
|
BEGIN
|
|
CALL p_not_exists ( );
|
|
END|
|
|
DELIMITER ;|
|
|
--echo # should not return valgrind warnings
|
|
--error ER_SP_DOES_NOT_EXIST
|
|
CALL p3 ( f2 () );
|
|
|
|
DROP SCHEMA testdb;
|
|
|
|
CREATE SCHEMA testdb;
|
|
USE testdb;
|
|
DELIMITER |;
|
|
CREATE FUNCTION f2 () RETURNS INTEGER
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
|
RETURN f_not_exists () ;
|
|
END|
|
|
DELIMITER ;|
|
|
--echo # should not return valgrind warnings
|
|
SELECT f2 ();
|
|
|
|
DROP SCHEMA testdb;
|
|
|
|
USE test;
|
|
|
|
--echo #
|
|
--echo # Bug#50423: Crash on second call of a procedure dropping a trigger
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
DROP TRIGGER IF EXISTS tr1;
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
--enable_warnings
|
|
|
|
CREATE TABLE t1 (f1 INTEGER);
|
|
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1;
|
|
CREATE PROCEDURE p1 () DROP TRIGGER tr1;
|
|
|
|
CALL p1 ();
|
|
--error ER_TRG_DOES_NOT_EXIST
|
|
CALL p1 ();
|
|
|
|
DROP TABLE t1;
|
|
DROP PROCEDURE p1;
|
|
|
|
--echo #
|
|
--echo # Bug#54375: Error in stored procedure leaves connection
|
|
--echo # in different default schema
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
SET @@SQL_MODE = 'STRICT_ALL_TABLES';
|
|
DROP DATABASE IF EXISTS db1;
|
|
CREATE DATABASE db1;
|
|
USE db1;
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TABLE t1 (c1 int NOT NULL PRIMARY KEY);
|
|
INSERT INTO t1 VALUES (1);
|
|
DELIMITER $$;
|
|
CREATE FUNCTION f1 (
|
|
some_value int
|
|
)
|
|
RETURNS smallint
|
|
DETERMINISTIC
|
|
BEGIN
|
|
INSERT INTO t1 SET c1 = some_value;
|
|
RETURN(LAST_INSERT_ID());
|
|
END$$
|
|
DELIMITER ;$$
|
|
DROP DATABASE IF EXISTS db2;
|
|
CREATE DATABASE db2;
|
|
--enable_warnings
|
|
USE db2;
|
|
SELECT DATABASE();
|
|
--error ER_DUP_ENTRY
|
|
SELECT db1.f1(1);
|
|
SELECT DATABASE();
|
|
USE test;
|
|
DROP FUNCTION db1.f1;
|
|
DROP TABLE db1.t1;
|
|
DROP DATABASE db1;
|
|
DROP DATABASE db2;
|
|
USE test;
|
|
|
|
--echo #
|
|
--echo # Bug#13105873:valgrind warning:possible crash in foreign
|
|
--echo # key handling on subsequent create table if not exists
|
|
--echo #
|
|
|
|
--disable_warnings
|
|
DROP DATABASE IF EXISTS testdb;
|
|
--enable_warnings
|
|
CREATE DATABASE testdb;
|
|
USE testdb;
|
|
CREATE TABLE t1 (id1 INT PRIMARY KEY);
|
|
DELIMITER $;
|
|
CREATE PROCEDURE `p1`()
|
|
BEGIN
|
|
CREATE TABLE IF NOT EXISTS t2(id INT PRIMARY KEY,
|
|
CONSTRAINT FK FOREIGN KEY (id) REFERENCES t1( id1 ));
|
|
END$
|
|
DELIMITER ;$
|
|
CALL p1();
|
|
--echo # below stmt should not return valgrind warnings
|
|
CALL p1();
|
|
DROP DATABASE testdb;
|
|
USE test;
|
|
|
|
--echo #
|
|
--echo # End of 5.1 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # BUG#13489996 valgrind:conditional jump or move depends on
|
|
--echo # uninitialised values-field_blob
|
|
--echo #
|
|
|
|
CREATE FUNCTION sf() RETURNS BLOB RETURN "";
|
|
SELECT sf();
|
|
DROP FUNCTION sf;
|
|
|
|
--echo #
|
|
--echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
|
--echo #
|
|
SET @@SQL_MODE = '';
|
|
DELIMITER $;
|
|
CREATE FUNCTION testf_bug11763507() RETURNS INT
|
|
BEGIN
|
|
RETURN 0;
|
|
END
|
|
$
|
|
|
|
CREATE PROCEDURE testp_bug11763507()
|
|
BEGIN
|
|
SELECT "PROCEDURE testp_bug11763507";
|
|
END
|
|
$
|
|
|
|
DELIMITER ;$
|
|
|
|
# STORED FUNCTIONS
|
|
SELECT testf_bug11763507();
|
|
SELECT TESTF_bug11763507();
|
|
|
|
--replace_column 5 # 6 #
|
|
SHOW FUNCTION STATUS LIKE 'testf_bug11763507';
|
|
--replace_column 5 # 6 #
|
|
SHOW FUNCTION STATUS WHERE NAME='testf_bug11763507';
|
|
--replace_column 5 # 6 #
|
|
SHOW FUNCTION STATUS LIKE 'TESTF_bug11763507';
|
|
--replace_column 5 # 6 #
|
|
SHOW FUNCTION STATUS WHERE NAME='TESTF_bug11763507';
|
|
|
|
SHOW CREATE FUNCTION testf_bug11763507;
|
|
SHOW CREATE FUNCTION TESTF_bug11763507;
|
|
|
|
# STORED PROCEDURE
|
|
CALL testp_bug11763507();
|
|
CALL TESTP_bug11763507();
|
|
|
|
--replace_column 5 # 6 #
|
|
SHOW PROCEDURE STATUS LIKE 'testp_bug11763507';
|
|
--replace_column 5 # 6 #
|
|
SHOW PROCEDURE STATUS WHERE NAME='testp_bug11763507';
|
|
--replace_column 5 # 6 #
|
|
SHOW PROCEDURE STATUS LIKE 'TESTP_bug11763507';
|
|
--replace_column 5 # 6 #
|
|
SHOW PROCEDURE STATUS WHERE NAME='TESTP_bug11763507';
|
|
|
|
SHOW CREATE PROCEDURE testp_bug11763507;
|
|
SHOW CREATE PROCEDURE TESTP_bug11763507;
|
|
|
|
# INFORMATION SCHEMA
|
|
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'testf_bug11763507';
|
|
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'TESTF_bug11763507';
|
|
|
|
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='testf_bug11763507';
|
|
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='TESTF_bug11763507';
|
|
|
|
DROP PROCEDURE testp_bug11763507;
|
|
DROP FUNCTION testf_bug11763507;
|
|
|
|
--echo #END OF BUG#11763507 test.
|
|
|
|
--echo #
|
|
--echo # MDEV-5531 double call procedure in one session
|
|
--echo #
|
|
|
|
CREATE TABLE `t1` (
|
|
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
|
`create_ts` int(10) unsigned DEFAULT '0',
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
|
|
|
|
DELIMITER $$;
|
|
|
|
CREATE PROCEDURE test_5531 (IN step TINYINT(1))
|
|
BEGIN
|
|
DECLARE counts INT DEFAULT 0;
|
|
DECLARE cur1 CURSOR FOR
|
|
|
|
SELECT ct.id
|
|
FROM (SELECT NULL) AS z
|
|
JOIN (
|
|
SELECT id
|
|
FROM `t1`
|
|
LIMIT 10
|
|
) AS ct
|
|
JOIN (SELECT NULL) AS x ON(
|
|
EXISTS(
|
|
SELECT 1
|
|
FROM `t1`
|
|
WHERE id=ct.id
|
|
LIMIT 1
|
|
)
|
|
);
|
|
|
|
IF step=1 THEN
|
|
TRUNCATE t1;
|
|
REPEAT
|
|
INSERT INTO `t1`
|
|
(create_ts) VALUES
|
|
(UNIX_TIMESTAMP());
|
|
|
|
SET counts=counts+1;
|
|
UNTIL counts>150 END REPEAT;
|
|
|
|
SET max_sp_recursion_depth=1;
|
|
|
|
CALL test_5531(2);
|
|
SET max_sp_recursion_depth=2;
|
|
CALL test_5531(2);
|
|
ELSEIF step=2 THEN
|
|
OPEN cur1; CLOSE cur1;
|
|
END IF;
|
|
END $$
|
|
DELIMITER ;$$
|
|
CALL test_5531(1);
|
|
DROP PROCEDURE test_5531;
|
|
DROP TABLE t1;
|
|
|
|
#
|
|
# MDEV-6601 Assertion `!thd->in_active_multi_stmt_transa ction() || thd->in_multi_stmt_transaction_mode()' failed on executing a stored procedure with commit
|
|
#
|
|
delimiter |;
|
|
create procedure sp() begin
|
|
commit;
|
|
end|
|
|
delimiter ;|
|
|
start transaction;
|
|
call sp();
|
|
drop procedure sp;
|
|
|
|
--echo #
|
|
--echo # MDEV-11146 SP variables of the SET data type erroneously allow values with comma
|
|
--echo #
|
|
|
|
DELIMITER $$;
|
|
--error ER_ILLEGAL_VALUE_FOR_TYPE
|
|
CREATE PROCEDURE p1()
|
|
BEGIN
|
|
DECLARE a SET('a','b','c','a,b');
|
|
SET a='a,b';
|
|
SELECT a, a+0;
|
|
END;
|
|
$$
|
|
DELIMITER ;$$
|
|
|
|
|
|
--echo #
|
|
--echo # Start of 10.3 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # MDEV-16117 SP with a single FOR statement creates but further fails to load
|
|
--echo #
|
|
|
|
DELIMITER $$;
|
|
CREATE PROCEDURE p1()
|
|
FOR i IN 1..10 DO
|
|
set @x = 5;
|
|
END FOR;
|
|
$$
|
|
DELIMITER ;$$
|
|
CALL p1;
|
|
SELECT body FROM mysql.proc WHERE db='test' AND specific_name='p1';
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER $$;
|
|
CREATE PROCEDURE p1() WITH t1 AS (SELECT 1) SELECT 1;
|
|
$$
|
|
DELIMITER ;$$
|
|
CALL p1;
|
|
SELECT body FROM mysql.proc WHERE db='test' AND specific_name='p1';
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER $$;
|
|
CREATE PROCEDURE p1() VALUES (1);
|
|
$$
|
|
DELIMITER ;$$
|
|
CALL p1;
|
|
SELECT body FROM mysql.proc WHERE db='test' AND specific_name='p1';
|
|
DROP PROCEDURE p1;
|
|
|
|
|
|
DELIMITER $$;
|
|
CREATE FUNCTION f1() RETURNS INT
|
|
FOR i IN 1..10 DO
|
|
RETURN 1;
|
|
END FOR;
|
|
$$
|
|
DELIMITER ;$$
|
|
SELECT f1();
|
|
SELECT body FROM mysql.proc WHERE db='test' AND specific_name='f1';
|
|
DROP FUNCTION f1;
|
|
|
|
--echo #
|
|
--echo # End of 10.2 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # MDEV-25501 routine_definition in information_schema.routines loses tablename if it starts with an _ and is not backticked
|
|
--echo #
|
|
create table _t1 (a int);
|
|
create procedure p1() select * from _t1;
|
|
show create procedure p1;
|
|
select routine_definition from information_schema.routines where routine_schema=database() and specific_name='p1';
|
|
select body, body_utf8 from mysql.proc where name='p1';
|
|
drop procedure p1;
|
|
drop table _t1;
|
|
|
|
--echo #
|
|
--echo # End of 10.3 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # MDEV-22001: Server crashes in st_select_lex_unit::exclude_level upon execution of SP
|
|
--echo #
|
|
--delimiter $
|
|
BEGIN NOT ATOMIC DECLARE a INT DEFAULT 0 IN ( SELECT 1 ) OR 2 ; END $
|
|
BEGIN NOT ATOMIC DECLARE a INT DEFAULT 0 IN ( SELECT 1 ) OR (SELECT 2) ; END $
|
|
--delimiter ;
|
|
|
|
--error ER_NO_SUCH_THREAD
|
|
KILL (('x' IN ( SELECT 1)) MOD 44);
|
|
|
|
--echo #
|
|
--echo # End of 10.4 tests
|
|
--echo #
|
|
|
|
--echo #
|
|
--echo # MDEV-24935: Server crashes in Field_iterator_natural_join::next or Field_iterator_table_ref::set_field_iterator upon 2nd execution of SP
|
|
--echo #
|
|
CREATE TABLE t1 (a INT);
|
|
CREATE TABLE t2 (b INT, c INT);
|
|
CREATE TABLE t3 (d INT);
|
|
CREATE PROCEDURE sp() SELECT * FROM t1 JOIN t2 JOIN t3 USING (x);
|
|
--error ER_BAD_FIELD_ERROR
|
|
CALL sp;
|
|
--error ER_BAD_FIELD_ERROR
|
|
CALL sp;
|
|
--echo # Clean up
|
|
DROP PROCEDURE sp;
|
|
DROP TABLE t1, t2, t3;
|
|
|
|
CREATE TABLE t1 (c1 INT,c2 INT);
|
|
CREATE TABLE t2 (c INT,c2 INT);
|
|
CREATE PROCEDURE p2 (OUT i INT,OUT o INT) READS SQL DATA DELETE a2,a3 FROM t1 AS a1 JOIN t2 AS a2 NATURAL JOIN t2 AS a3;
|
|
|
|
--error ER_NON_UNIQ_ERROR
|
|
CALL p2 (@c,@a);
|
|
--error ER_NON_UNIQ_ERROR
|
|
CALL p2 (@a,@c);
|
|
--echo # Clean up
|
|
DROP PROCEDURE p2;
|
|
DROP TABLE t1, t2;
|
|
|
|
--echo #
|
|
--echo # End of 10.5 tests
|
|
--echo #
|