mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Auto-merge from mysql-trunk-bugfixing.
****** This patch fixes the following bugs: - Bug#5889: Exit handler for a warning doesn't hide the warning in trigger - Bug#9857: Stored procedures: handler for sqlwarning ignored - Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP - Bug#36185: Incorrect precedence for warning and exception handlers The problem was in the way warnings/errors during stored routine execution were handled. Prior to this patch the logic was as follows: - when a warning/an error happens: if we're executing a stored routine, and there is a handler for that warning/error, remember the handler, ignore the warning/error and continue execution. - after a stored routine instruction is executed: check for a remembered handler and activate one (if any). This logic caused several problems: - if one instruction generates several warnings (errors) it's impossible to choose the right handler -- a handler for the first generated condition was chosen and remembered for activation. - mess with handling conditions in scopes different from the current one. - not putting generated warnings/errors into Warning Info (Diagnostic Area) is against The Standard. The patch changes the logic as follows: - Diagnostic Area is cleared on the beginning of each statement that either is able to generate warnings, or is able to work with tables. - at the end of a stored routine instruction, Diagnostic Area is left intact. - Diagnostic Area is checked after each stored routine instruction. If an instruction generates several condition, it's now possible to take a look at all of them and determine an appropriate handler.
This commit is contained in:
@ -711,6 +711,8 @@ looping i
|
||||
looping 1
|
||||
looping i
|
||||
looping 0
|
||||
Warnings:
|
||||
Error 1062 Duplicate entry '1' for key 'a'
|
||||
call proc_26977_works(2);
|
||||
do something
|
||||
do something
|
||||
@ -730,6 +732,8 @@ looping i
|
||||
looping 0
|
||||
optimizer: keep hreturn
|
||||
optimizer: keep hreturn
|
||||
Warnings:
|
||||
Error 1062 Duplicate entry '2' for key 'a'
|
||||
drop table t1;
|
||||
drop procedure proc_26977_broken;
|
||||
drop procedure proc_26977_works;
|
||||
@ -888,3 +892,56 @@ Pos Instruction
|
||||
4 jump 6
|
||||
5 error 1339
|
||||
DROP PROCEDURE p1;
|
||||
#
|
||||
# Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
|
||||
#
|
||||
|
||||
# - Case 4: check that "No Data trumps Warning".
|
||||
|
||||
CREATE TABLE t1(a INT);
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE c CURSOR FOR SELECT a FROM t1;
|
||||
OPEN c;
|
||||
BEGIN
|
||||
DECLARE v INT;
|
||||
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
||||
BEGIN
|
||||
SELECT "Warning found!";
|
||||
SHOW WARNINGS;
|
||||
END;
|
||||
DECLARE EXIT HANDLER FOR NOT FOUND
|
||||
BEGIN
|
||||
SELECT "End of Result Set found!";
|
||||
SHOW WARNINGS;
|
||||
END;
|
||||
WHILE TRUE DO
|
||||
FETCH c INTO v;
|
||||
END WHILE;
|
||||
END;
|
||||
CLOSE c;
|
||||
SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
|
||||
END|
|
||||
SET SESSION debug="+d,bug23032_emit_warning";
|
||||
CALL p1();
|
||||
Warning found!
|
||||
Warning found!
|
||||
Level Code Message
|
||||
Warning 1105 Unknown error
|
||||
Warning found!
|
||||
Warning found!
|
||||
Level Code Message
|
||||
Warning 1105 Unknown error
|
||||
Warning found!
|
||||
Warning found!
|
||||
Level Code Message
|
||||
Warning 1105 Unknown error
|
||||
End of Result Set found!
|
||||
End of Result Set found!
|
||||
Level Code Message
|
||||
Warning 1105 Unknown error
|
||||
Error 1329 No data - zero rows fetched, selected, or processed
|
||||
SET SESSION debug="-d,bug23032_emit_warning";
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
|
Reference in New Issue
Block a user