mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +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:
@@ -347,6 +347,8 @@ CALL h1();
|
||||
-7- 1 1 1 1 1 1
|
||||
END x1 x2 x3 x4 x5 x6
|
||||
END 1 1 1 1 1 1
|
||||
Warnings:
|
||||
Error 1062 Duplicate entry 'a' for key 'w'
|
||||
DROP TABLE IF EXISTS tnull;
|
||||
DROP PROCEDURE IF EXISTS sp1;
|
||||
CREATE TABLE tnull(f1 int);
|
||||
@@ -445,6 +447,8 @@ END//
|
||||
CALL h2();
|
||||
x1 x2 x3 x4 x5 x6
|
||||
1 1 1 1 1 1
|
||||
Warnings:
|
||||
Error 1062 Duplicate entry 'a' for key 'w'
|
||||
SELECT * FROM res_t1;
|
||||
w x
|
||||
a b
|
||||
@@ -550,6 +554,8 @@ exit handler 2
|
||||
exit handler 2
|
||||
exit handler 1
|
||||
exit handler 1
|
||||
Warnings:
|
||||
Error 1146 Table 'db_storedproc.tqq' doesn't exist
|
||||
create table res_t1(w char unique, x char);
|
||||
insert into res_t1 values ('a', 'b');
|
||||
CREATE PROCEDURE h1 ()
|
||||
@@ -580,6 +586,8 @@ END//
|
||||
CALL h1();
|
||||
x1 x2 x3 x4 x5 x6
|
||||
1 1 1 1 1 1
|
||||
Warnings:
|
||||
Error 1062 Duplicate entry 'a' for key 'w'
|
||||
This will fail, SQLSTATE 00000 is not allowed
|
||||
CREATE PROCEDURE sp1()
|
||||
begin1_label:BEGIN
|
||||
@@ -623,6 +631,8 @@ CALL sp2();
|
||||
NULL
|
||||
@x2 @x
|
||||
1 2
|
||||
Warnings:
|
||||
Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
|
||||
DROP PROCEDURE sp1;
|
||||
DROP PROCEDURE sp2;
|
||||
|
||||
@@ -654,6 +664,8 @@ ERROR 42000: Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expe
|
||||
CALL sp2();
|
||||
-1- @x2 @x
|
||||
-1- 0 1
|
||||
Warnings:
|
||||
Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
|
||||
SELECT '-3-', @x2, @x;
|
||||
-3- @x2 @x
|
||||
-3- 1 1
|
||||
@@ -696,6 +708,8 @@ CALL sp2();
|
||||
-2- 1 20
|
||||
-4- @x2 @x
|
||||
-4- 11 22
|
||||
Warnings:
|
||||
Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1
|
||||
DROP PROCEDURE sp1;
|
||||
DROP PROCEDURE sp2;
|
||||
|
||||
@@ -762,21 +776,33 @@ SELECT @done, @x;
|
||||
0 1
|
||||
INSERT INTO temp VALUES('1', NULL);
|
||||
CALL sp1();
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'f1' at row 1
|
||||
Warning 1265 Data truncated for column 'f2' at row 1
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 1
|
||||
INSERT INTO temp VALUES('2', NULL);
|
||||
CALL sp2();
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'f1' at row 1
|
||||
Warning 1265 Data truncated for column 'f2' at row 1
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 1
|
||||
INSERT INTO temp VALUES('3', NULL);
|
||||
CALL sp3();
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'f1' at row 1
|
||||
Warning 1265 Data truncated for column 'f2' at row 1
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 0
|
||||
INSERT INTO temp VALUES('4', NULL);
|
||||
CALL sp4();
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'f1' at row 1
|
||||
Warning 1265 Data truncated for column 'f2' at row 1
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 0
|
||||
@@ -885,18 +911,26 @@ SELECT @done, @x;
|
||||
@done @x
|
||||
0 1
|
||||
CALL sp1();
|
||||
Warnings:
|
||||
Error 1329 No data - zero rows fetched, selected, or processed
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 2
|
||||
CALL sp2();
|
||||
Warnings:
|
||||
Error 1329 No data - zero rows fetched, selected, or processed
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 2
|
||||
CALL sp3();
|
||||
Warnings:
|
||||
Error 1329 No data - zero rows fetched, selected, or processed
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 1
|
||||
CALL sp4();
|
||||
Warnings:
|
||||
Error 1329 No data - zero rows fetched, selected, or processed
|
||||
SELECT @done, @x;
|
||||
@done @x
|
||||
1 1
|
||||
@@ -1031,6 +1065,8 @@ SQLSTATE
|
||||
21000
|
||||
SQLSTATE
|
||||
24000
|
||||
Warnings:
|
||||
Error 1326 Cursor is not open
|
||||
SELECT '-1-', @x;
|
||||
-1- @x
|
||||
-1- 6
|
||||
@@ -1041,18 +1077,24 @@ SQLSTATE
|
||||
SQLEXCEPTION
|
||||
SQLSTATE
|
||||
24000
|
||||
Warnings:
|
||||
Error 1326 Cursor is not open
|
||||
SELECT '-2-', @x;
|
||||
-2- @x
|
||||
-2- 6
|
||||
CALL sp3();
|
||||
SQLSTATE
|
||||
20000
|
||||
Warnings:
|
||||
Error 1339 Case not found for CASE statement
|
||||
SELECT '-3-', @x;
|
||||
-3- @x
|
||||
-3- 1
|
||||
CALL sp4();
|
||||
SQLSTATE
|
||||
SQLEXCEPTION
|
||||
Warnings:
|
||||
Error 1339 Case not found for CASE statement
|
||||
SELECT '-4-', @x;
|
||||
-4- @x
|
||||
-4- 1
|
||||
@@ -1335,6 +1377,8 @@ CLOSE cur1;
|
||||
CLOSE cur2;
|
||||
END//
|
||||
CALL sp_outer();
|
||||
Warnings:
|
||||
Error 1329 No data - zero rows fetched, selected, or processed
|
||||
SELECT * FROM temp1;
|
||||
f0 cnt f1 f2 f3 f4
|
||||
_sp_out_ 1 a` a` 1000-01-01 -5000
|
||||
|
||||
Reference in New Issue
Block a user