1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Backport from mysql-trunk of:

------------------------------------------------------------
revno: 3258
committer: Jon Olav Hauglid <jon.hauglid@oracle.com>
branch nick: mysql-trunk-bug12663165
timestamp: Thu 2011-07-14 10:05:12 +0200
message:
  Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
  
  When stored routines are loaded, a simple optimizer tries to locate
  and remove dead code. The problem was that this dead code removal
  did not work correctly with CONTINUE handlers.
  
  If a statement triggers a CONTINUE handler, the following statement
  will be executed after the handler statement has completed. This
  means that the following statement is not dead code even if the
  previous statement unconditionally alters control flow. This fact
  was lost on the dead code removal routine, which ended up with
  removing instructions that could have been executed. This could
  then lead to assertions, crashes and generally bad behavior when
  the stored routine was executed.
  
  This patch fixes the problem by marking as live code all stored
  routine instructions that are in the same scope as a CONTINUE handler.
  
  Test case added to sp.test.
This commit is contained in:
Jon Olav Hauglid
2012-01-09 11:28:02 +01:00
parent 86505c3c54
commit b8291e2b60
5 changed files with 86 additions and 4 deletions

View File

@ -8397,6 +8397,35 @@ DROP FUNCTION f1;
DROP TABLE t1, t2;
--echo #
--echo # Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
--echo #
--disable_warnings
DROP FUNCTION IF EXISTS f1;
--enable_warnings
delimiter $;
CREATE FUNCTION f1() RETURNS INT
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RETURN f1();
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RETURN f1();
RETURN f1();
END;
END;
RETURN 1;
END $
delimiter ;$
# This used to cause an assertion.
SELECT f1();
DROP FUNCTION f1;
--echo # ------------------------------------------------------------------
--echo # -- End of 5.1 tests
--echo # ------------------------------------------------------------------