# Test file for stored procedure bugfixes --echo # --echo # Bug #47412: Valgrind warnings / user can read uninitalized 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#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; --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 End of 5.1 tests --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 # Bug#19418619 : SELECT QUERY WITH INVALID TIME WORKS FINE BUT SP FAILS UNDER STRICT MODE --echo # SET sql_mode='NO_ENGINE_SUBSTITUTION'; # Create SF without STRICT mode delimiter |; CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT BEGIN RETURN abs('1abcd'); END| delimiter ;| SELECT f1(-25); SELECT f1(25); SET sql_mode=default; # Passing invalid argument from STRICT mode gives error. --error ER_WARN_DATA_OUT_OF_RANGE SELECT f1(-25); SELECT f1(10); DROP FUNCTION f1; SET sql_mode='NO_ENGINE_SUBSTITUTION'; # Create SP without STRICT mode delimiter |; CREATE PROCEDURE f1(IN arg TINYINT UNSIGNED) BEGIN DECLARE arg1 TINYINT; select abs('1abcd') into arg; END| delimiter ;| CALL f1(-25); CALL f1(25); SET sql_mode=default; # Passing invalid argument from STRICT mode gives error. --error ER_WARN_DATA_OUT_OF_RANGE CALL f1(-25); CALL f1(10); DROP PROCEDURE f1; # Select does not give error in STRICT mode SELECT SUBTIME('2006-07-16' , '05:05:02.040778'); SELECT abs('1bcd'); # Create Stored Procedure in STRICT mode. delimiter |; CREATE PROCEDURE sp1() BEGIN SELECT SUBTIME('2006-07-16' , '05:05:02.040778'); END| CREATE PROCEDURE sp2() BEGIN DECLARE v1 TINYINT DEFAULT 450000; END| delimiter ;| CALL sp1(); --error ER_WARN_DATA_OUT_OF_RANGE CALL sp2(); DROP PROCEDURE sp1; DROP PROCEDURE sp2; # Create Stored Function in STRICT mode CREATE FUNCTION fn1(arg TINYINT UNSIGNED) RETURNS float deterministic RETURN abs('1abcd'); delimiter |; CREATE FUNCTION fn2() RETURNS tinyint BEGIN DECLARE v1 TINYINT DEFAULT 450000; RETURN v1; END| delimiter ;| # On passing valid argument function execution fails as it was created in STRICT mode. --error ER_TRUNCATED_WRONG_VALUE SELECT fn1(25); # Passing invalid argument from STRICT mode gives error for parameter evaluation. --error ER_WARN_DATA_OUT_OF_RANGE SELECT fn1(-25); --error ER_WARN_DATA_OUT_OF_RANGE SELECT fn2(); SET sql_mode='NO_ENGINE_SUBSTITUTION'; --error ER_TRUNCATED_WRONG_VALUE SELECT fn1(-25); DROP FUNCTION fn1; DROP FUNCTION fn2; #Create a function without STRICT mode CREATE FUNCTION fn1() RETURNS float deterministic RETURN floor('1.1a'); # Create a function and Trigger in STRICT mode SET sql_mode=default; CREATE TABLE t1(a INT); CREATE FUNCTION fn2() RETURNS float deterministic RETURN floor('1.1a'); CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @a=fn2(); #Error expected as function call returns error --error ER_TRUNCATED_WRONG_VALUE INSERT INTO t1 VALUES(1); DROP TRIGGER tr1; CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @a=fn1(); #No error as function call will not give error INSERT INTO t1 VALUES(1); DROP FUNCTION fn1; DROP FUNCTION fn2; DROP TRIGGER tr1; DROP TABLE t1; # Test for 'division by zero' SET sql_mode=traditional; # select passes SELECT 1/0; SET sql_mode=''; delimiter |; CREATE PROCEDURE proc_c() BEGIN DECLARE div_zero INTEGER; SET SQL_MODE='TRADITIONAL'; SELECT 1/0; END| delimiter ;| # Procedure call passes. CALL proc_c(); DROP PROCEDURE proc_c; #check for SET command inside SF in TRADITIONAL mode SET sql_mode=traditional; delimiter |; CREATE FUNCTION fn1() RETURNS TINYINT BEGIN SET @x=floor('1a'); RETURN 1; END| delimiter ;| SELECT fn1(); DROP FUNCTION fn1; SET sql_mode= default; --echo # --echo # Bug#24401273: PROBLEM WITH STORED FUNCTION WHICH GENERATES --echo # BIGINT UNSIGNED USED IN WHERE CLAUSE --echo # --echo # Note: The AND TRUE is to work around Bug #24457368. --echo # CREATE FUNCTION crc(_text TEXT) RETURNS BIGINT(20) UNSIGNED DETERMINISTIC RETURN CONV(LEFT(MD5(_text),16),16,10); CREATE TABLE t1 ( id bigint(20) UNSIGNED NOT NULL ); INSERT INTO t1 (id) VALUES (crc('photos')); INSERT INTO t1 (id) VALUES (crc('photos1')); ALTER TABLE t1 ADD INDEX idx (id); SELECT * FROM t1 FORCE INDEX (idx) WHERE (id = crc('photos')) AND TRUE; SELECT * FROM t1 IGNORE INDEX (idx) WHERE (id = crc('photos')) AND TRUE; DROP FUNCTION crc; DROP TABLE t1; --echo # Bug#25398451: Segmentation fault in prepare_inner() at sql_call.cc CREATE TABLE t1(a INTEGER, b INTEGER); DELIMITER |; CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW BEGIN CALL proc(NEW.a,NEW.b); END | CREATE PROCEDURE proc(IN aa INTEGER) BEGIN END | DELIMITER ;| --error ER_SP_WRONG_NO_OF_ARGS INSERT INTO t1 VALUES (1,10); DROP PROCEDURE proc; DROP TABLE t1; --echo # --echo # Bug#28122841 - CREATE EVENT/PROCEDURE/FUNCTION CRASHES WITH ACCENT INSENSITIVE NAMES. --echo # SET NAMES utf8; --echo # --echo # Test case to verify stored procedure with case and accent insensitive names. --echo # CREATE PROCEDURE cafe() BEGIN END; --echo # Stored procedure names are case and accent insensitive. So from the --echo # data-dictionary "cafe" is obtained for the following statement. Since --echo # MDL key comparison is case and accent sensitive, assert condition to verify --echo # expected lock with name "test.cafe" fails (lock is obtained on the --echo # test.café). --error ER_SP_ALREADY_EXISTS CREATE PROCEDURE café() BEGIN END; --echo # Following statement is to verify operation with the upper case name. --error ER_SP_ALREADY_EXISTS CREATE PROCEDURE CAFE() BEGIN END; DROP PROCEDURE CaFé; --echo # Procedure with NAME_LEN size name. CREATE PROCEDURE очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_e() BEGIN END; --error ER_SP_ALREADY_EXISTS CREATE PROCEDURE очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é() BEGIN END; --error ER_SP_ALREADY_EXISTS CREATE PROCEDURE очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_E() BEGIN END; SHOW CREATE PROCEDURE очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é; DROP PROCEDURE очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é; --echo # --echo # Test case to verify stored function with case and accent insensitive names. --echo # CREATE FUNCTION cafe() RETURNS INT return 15081947; --echo # Stored function names are case and accent insensitive. So from the --echo # data-dictionary "cafe" is obtained for the following statement. Since --echo # MDL key comparison is case and accent sensitive, assert condition to verify --echo # expected lock with name "test.cafe" fails (lock is obtained on the --echo # test.café). --error ER_SP_ALREADY_EXISTS CREATE FUNCTION café() RETURNS INT return 15081947; --echo # Following statement is to verify operation with the upper case name. --error ER_SP_ALREADY_EXISTS CREATE FUNCTION CAFE() RETURNS INT return 15081947; --replace_column 2 # 3 # 4 # 5 # 6 # SHOW CREATE FUNCTION CaFé; DROP FUNCTION CaFé; --echo # Function with NAME_LEN size name. CREATE FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_e() RETURNS INT return 15081947; --error ER_SP_ALREADY_EXISTS CREATE FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é() RETURNS INT return 15081947; --error ER_SP_ALREADY_EXISTS CREATE FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_E() RETURNS INT return 15081947; --replace_column 2 # 3 # 4 # 5 # 6 # SHOW CREATE FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é; DROP FUNCTION очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_é; SET NAMES default;