From: Alexander Nozdrin Date: July 30 2010 3:28pm Subject: bzr commit into mysql-trunk-bugfixing branch (alik:3158) Bug#5889 Bug#9857 Bug#23032 Bug#36185 List-Archive: http://lists.mysql.com/commits/114769 X-Bug: 5889,9857,23032,36185 Message-Id: <20100730152854.BA6F340C72@quad> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_MNh8ag6FKwTIvdVMHI6COQ)" --Boundary_(ID_MNh8ag6FKwTIvdVMHI6COQ) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///mnt/raid/alik/MySQL/bzr/00/bug23032/mysql-trunk-bugfixing-bug23032/ based on revid:alik@stripped 3158 Alexander Nozdrin 2010-07-30 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. @ mysql-test/r/signal.result Update result file: 1. handled conditions are not cleared any more; 2. reflect changes in signal.test @ mysql-test/r/signal_demo3.result Update result file: handled conditions are not cleared any more. Due to playing with max_error_count, resulting warning lists have changed. @ mysql-test/r/sp-big.result Update result file: handled conditions are not cleared any more. @ mysql-test/r/sp-bugs.result Update result file: handled conditions are not cleared any more. @ mysql-test/r/sp-code.result Update result file: 1. handled conditions are not cleared any more. 2. add result for a new test case in sp-code.test. @ mysql-test/r/sp-error.result Update result file: 1. handled conditions are not cleared any more. 2. add result for a new test case in sp-error.test. @ mysql-test/r/sp.result Update result file: handled conditions are not cleared any more. @ mysql-test/r/sp_trans.result Update result file: handled conditions are not cleared any more. @ mysql-test/r/strict.result Update result file: handled conditions are not cleared any more. @ mysql-test/r/view.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/funcs_1/r/innodb_storedproc_02.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/funcs_1/r/memory_storedproc_02.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/funcs_1/r/myisam_storedproc_02.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/funcs_1/r/storedproc.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/rpl/r/rpl_row_sp005.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result Update result file: handled conditions are not cleared any more. @ mysql-test/suite/rpl/r/rpl_row_trig003.result Update result file: handled conditions are not cleared any more. @ mysql-test/t/signal.test Make a test case more readable in the result file. @ mysql-test/t/sp-code.test Add a test case for Bug#23032 checking that No Data takes precedence on Warning. @ mysql-test/t/sp-error.test Adding test cases for: - Bug#23032 - Bug#36185 - Bug#5889 - Bug#9857 @ mysql-test/t/sp.test Fixing test case to reflect behavioral changes made by the patch. @ sql/sp_head.cc Reset the per-statement warning count before executing a stored procedure instruction. Move to a separate function code which checks the completion status of the executed statement and searches for a handler. Remove redundant code now that search for a handler is done after execution, errors are always pushed. @ sql/sp_pcontext.h Remove unused code. @ sql/sp_rcontext.cc - Polish sp_rcontext::find_handler(): use sp_rcontext::m_hfound instead of an extra local variable; - Remove sp_rcontext::handle_condition(); - Introduce sp_rcontext::activate_handler(), which prepares previously found handler for execution. - Move sp_rcontext::enter_handler() code into activate_handler(), because enter_handler() is used only from there; - Cleanups; - Introduce DBUG_EXECUTE_IF() for a test case in sp-code.test @ sql/sp_rcontext.h - Remove unused code - Cleanups @ sql/sql_class.cc Merge THD::raise_condition_no_handler() into THD::raise_condition(). After the patch raise_condition_no_handler() was called in raise_condition() only. @ sql/sql_class.h Remove raise_condition_no_handler(). @ sql/sql_error.cc Remove Warning_info::reserve_space() -- handled conditions are not cleared any more, so there is no need for RESIGNAL to re-push them. @ sql/sql_error.h Remove Warning_info::reserve_space(). @ sql/sql_signal.cc Handled conditions are not cleared any more, so there is no need for RESIGNAL to re-push them. modified: mysql-test/r/signal.result mysql-test/r/signal_demo3.result mysql-test/r/sp-big.result mysql-test/r/sp-bugs.result mysql-test/r/sp-code.result mysql-test/r/sp-error.result mysql-test/r/sp.result mysql-test/r/sp_trans.result mysql-test/r/strict.result mysql-test/r/view.result mysql-test/suite/funcs_1/r/innodb_storedproc_02.result mysql-test/suite/funcs_1/r/memory_storedproc_02.result mysql-test/suite/funcs_1/r/myisam_storedproc_02.result mysql-test/suite/funcs_1/r/storedproc.result mysql-test/suite/rpl/r/rpl_row_sp005.result mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result mysql-test/suite/rpl/r/rpl_row_trig003.result mysql-test/t/signal.test mysql-test/t/sp-code.test mysql-test/t/sp-error.test mysql-test/t/sp.test sql/sp_head.cc sql/sp_pcontext.h sql/sp_rcontext.cc sql/sp_rcontext.h sql/sql_class.cc sql/sql_class.h sql/sql_error.cc sql/sql_error.h sql/sql_signal.cc === modified file 'mysql-test/r/signal.result' --- a/mysql-test/r/signal.result 2010-02-23 18:43:26 +0000 +++ b/mysql-test/r/signal.result 2010-07-30 15:28:36 +0000 @@ -1189,6 +1189,8 @@ end $$ call test_signal() $$ Caught by SQLSTATE Caught by SQLSTATE +Warnings: +Warning 1012 Raising a warning drop procedure test_signal $$ create procedure test_signal() begin @@ -1204,6 +1206,8 @@ end $$ call test_signal() $$ Caught by number Caught by number +Warnings: +Warning 1012 Raising a warning drop procedure test_signal $$ create procedure test_signal() begin @@ -1219,6 +1223,8 @@ end $$ call test_signal() $$ Caught by SQLWARNING Caught by SQLWARNING +Warnings: +Warning 1012 Raising a warning drop procedure test_signal $$ create procedure test_signal() begin @@ -1234,6 +1240,8 @@ end $$ call test_signal() $$ Caught by SQLSTATE Caught by SQLSTATE +Warnings: +Error 1012 Raising a not found drop procedure test_signal $$ create procedure test_signal() begin @@ -1249,6 +1257,8 @@ end $$ call test_signal() $$ Caught by number Caught by number +Warnings: +Error 1012 Raising a not found drop procedure test_signal $$ create procedure test_signal() begin @@ -1264,6 +1274,8 @@ end $$ call test_signal() $$ Caught by NOT FOUND Caught by NOT FOUND +Warnings: +Error 1012 Raising a not found drop procedure test_signal $$ create procedure test_signal() begin @@ -1279,6 +1291,8 @@ end $$ call test_signal() $$ Caught by SQLSTATE Caught by SQLSTATE +Warnings: +Error 1012 Raising an error drop procedure test_signal $$ create procedure test_signal() begin @@ -1294,6 +1308,8 @@ end $$ call test_signal() $$ Caught by number Caught by number +Warnings: +Error 1012 Raising an error drop procedure test_signal $$ create procedure test_signal() begin @@ -1309,6 +1325,8 @@ end $$ call test_signal() $$ Caught by SQLEXCEPTION Caught by SQLEXCEPTION +Warnings: +Error 1012 Raising an error drop procedure test_signal $$ # # Test where SIGNAL can be used @@ -1455,6 +1473,7 @@ after RESIGNAL after RESIGNAL Warnings: Warning 1012 Raising a warning +Warning 1012 Raising a warning drop procedure test_resignal $$ create procedure test_resignal() begin @@ -1509,6 +1528,7 @@ after RESIGNAL after RESIGNAL Warnings: Warning 1264 Out of range value for column 'a' at row 1 +Warning 1264 Out of range value for column 'a' at row 1 drop procedure test_resignal $$ create procedure test_resignal() begin @@ -1565,6 +1585,7 @@ before RESIGNAL after RESIGNAL after RESIGNAL Warnings: +Warning 1012 Raising a warning Warning 5555 RESIGNAL of a warning drop procedure test_resignal $$ create procedure test_resignal() @@ -1625,6 +1646,7 @@ before RESIGNAL after RESIGNAL after RESIGNAL Warnings: +Warning 1264 Out of range value for column 'a' at row 1 Warning 5555 RESIGNAL of a warning drop procedure test_resignal $$ create procedure test_resignal() @@ -2126,6 +2148,9 @@ CALL peter_p2() $$ ERROR 42000: Hi, I am a useless error message show warnings $$ Level Code Message +Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' +Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' +Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL' Error 9999 Hi, I am a useless error message drop procedure peter_p1 $$ drop procedure peter_p2 $$ @@ -2135,15 +2160,17 @@ DECLARE x CONDITION FOR SQLSTATE '42000' DECLARE EXIT HANDLER FOR x BEGIN SELECT '2'; +SHOW WARNINGS; RESIGNAL x SET MYSQL_ERRNO = 9999; END; BEGIN DECLARE EXIT HANDLER FOR x BEGIN SELECT '1'; +SHOW WARNINGS; RESIGNAL x SET SCHEMA_NAME = 'test', -MYSQL_ERRNO= 1231; +MYSQL_ERRNO= 1232; END; /* Raises ER_WRONG_VALUE_FOR_VAR : 1231, SQLSTATE 42000 */ SET @@sql_mode=NULL; @@ -2156,6 +2183,7 @@ DECLARE x CONDITION for SQLSTATE '42000' DECLARE EXIT HANDLER FOR x BEGIN SELECT '3'; +SHOW WARNINGS; RESIGNAL x SET MESSAGE_TEXT = 'Hi, I am a useless error message', MYSQL_ERRNO = 9999; @@ -2166,15 +2194,24 @@ $$ CALL peter_p2() $$ 1 1 +Level Code Message +Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' 2 2 +Level Code Message +Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' +Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL' 3 3 +Level Code Message +Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' +Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL' +Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL' ERROR 42000: Hi, I am a useless error message show warnings $$ Level Code Message Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' -Error 1231 Variable 'sql_mode' can't be set to the value of 'NULL' +Error 1232 Variable 'sql_mode' can't be set to the value of 'NULL' Error 9999 Variable 'sql_mode' can't be set to the value of 'NULL' Error 9999 Hi, I am a useless error message drop procedure peter_p1 $$ === modified file 'mysql-test/r/signal_demo3.result' --- a/mysql-test/r/signal_demo3.result 2009-10-14 11:36:55 +0000 +++ b/mysql-test/r/signal_demo3.result 2010-07-30 15:28:36 +0000 @@ -95,11 +95,11 @@ call proc_1(); ERROR 45000: Oops in proc_1 show warnings; Level Code Message -Error 1644 Oops in proc_5 -Error 1644 Oops in proc_4 -Error 1644 Oops in proc_3 -Error 1644 Oops in proc_2 -Error 1644 Oops in proc_1 +Error 1051 Unknown table 'oops_it_is_not_here' +Error 1644 Oops in proc_9 +Error 1644 Oops in proc_8 +Error 1644 Oops in proc_7 +Error 1644 Oops in proc_6 SET @@session.max_error_count = 7; SELECT @@session.max_error_count; @@session.max_error_count @@ -108,13 +108,13 @@ call proc_1(); ERROR 45000: Oops in proc_1 show warnings; Level Code Message +Error 1051 Unknown table 'oops_it_is_not_here' +Error 1644 Oops in proc_9 +Error 1644 Oops in proc_8 Error 1644 Oops in proc_7 Error 1644 Oops in proc_6 Error 1644 Oops in proc_5 Error 1644 Oops in proc_4 -Error 1644 Oops in proc_3 -Error 1644 Oops in proc_2 -Error 1644 Oops in proc_1 SET @@session.max_error_count = 9; SELECT @@session.max_error_count; @@session.max_error_count @@ -123,6 +123,7 @@ call proc_1(); ERROR 45000: Oops in proc_1 show warnings; Level Code Message +Error 1051 Unknown table 'oops_it_is_not_here' Error 1644 Oops in proc_9 Error 1644 Oops in proc_8 Error 1644 Oops in proc_7 @@ -131,7 +132,6 @@ Error 1644 Oops in proc_5 Error 1644 Oops in proc_4 Error 1644 Oops in proc_3 Error 1644 Oops in proc_2 -Error 1644 Oops in proc_1 drop database demo; SET @@global.max_error_count = @start_global_value; SELECT @@global.max_error_count; === modified file 'mysql-test/r/sp-big.result' --- a/mysql-test/r/sp-big.result 2005-12-07 14:01:17 +0000 +++ b/mysql-test/r/sp-big.result 2010-07-30 15:28:36 +0000 @@ -46,6 +46,8 @@ end while; close cur1; end| call p1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select count(*) from t1; count(*) 256 === modified file 'mysql-test/r/sp-bugs.result' --- a/mysql-test/r/sp-bugs.result 2010-02-13 10:35:14 +0000 +++ b/mysql-test/r/sp-bugs.result 2010-07-30 15:28:36 +0000 @@ -43,6 +43,8 @@ END| SELECT f2 (); f2 () NULL +Warnings: +Error 1305 FUNCTION testdb.f_not_exists does not exist DROP SCHEMA testdb; USE test; # === modified file 'mysql-test/r/sp-code.result' --- a/mysql-test/r/sp-code.result 2009-12-01 19:07:18 +0000 +++ b/mysql-test/r/sp-code.result 2010-07-30 15:28:36 +0000 @@ -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; === modified file 'mysql-test/r/sp-error.result' --- a/mysql-test/r/sp-error.result 2010-02-24 13:52:27 +0000 +++ b/mysql-test/r/sp-error.result 2010-07-30 15:28:36 +0000 @@ -1344,6 +1344,8 @@ set @in_func := 0; select func_20713_a(); func_20713_a() NULL +Warnings: +Error 1146 Table 'test.bogus_table_20713' doesn't exist select @in_func; @in_func 2 @@ -1351,6 +1353,8 @@ set @in_func := 0; select func_20713_b(); func_20713_b() NULL +Warnings: +Error 1146 Table 'test.bogus_table_20713' doesn't exist select @in_func; @in_func 2 @@ -1714,3 +1718,246 @@ DROP PROCEDURE p1; DROP VIEW v1; DROP TABLE t1; End of 5.1 tests +# +# Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP +# + +# - Case 1 + +DROP PROCEDURE IF EXISTS p1; +DROP PROCEDURE IF EXISTS p2; +DROP PROCEDURE IF EXISTS p3; +DROP PROCEDURE IF EXISTS p4; +DROP PROCEDURE IF EXISTS p5; +DROP PROCEDURE IF EXISTS p6; +CREATE PROCEDURE p1() +BEGIN +SELECT CAST('10 ' as unsigned integer); +SELECT 1; +CALL p2(); +END| +CREATE PROCEDURE p2() +BEGIN +SELECT CAST('10 ' as unsigned integer); +END| +CALL p1(); +CAST('10 ' as unsigned integer) +10 +1 +1 +CAST('10 ' as unsigned integer) +10 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '10 ' +DROP PROCEDURE p1; +DROP PROCEDURE p2; + +# - Case 2 + +CREATE PROCEDURE p1() +BEGIN +DECLARE c INT DEFAULT 0; +DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1; +CALL p2(); +CALL p3(); +CALL p4(); +SELECT c; +SELECT @@warning_count; +SHOW WARNINGS; +END| +CREATE PROCEDURE p2() +BEGIN +SELECT CAST('10 ' as unsigned integer); +END| +CREATE PROCEDURE p3() +BEGIN +SELECT CAST('10 ' as unsigned integer); +SELECT 1; +END| +CREATE PROCEDURE p4() +BEGIN +SELECT CAST('10 ' as unsigned integer); +CALL p2(); +END| +CREATE PROCEDURE p5() +BEGIN +SELECT CAST('10 ' as unsigned integer); +SHOW WARNINGS; +END| +CREATE PROCEDURE P6() +BEGIN +DECLARE c INT DEFAULT 0; +DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1; +CALL p5(); +SELECT c; +END| +CALL p1(); +CAST('10 ' as unsigned integer) +10 +CAST('10 ' as unsigned integer) +10 +1 +1 +CAST('10 ' as unsigned integer) +10 +CAST('10 ' as unsigned integer) +10 +c +3 +@@warning_count +1 +Level Code Message +Warning 1292 Truncated incorrect INTEGER value: '10 ' +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '10 ' +CALL p6(); +CAST('10 ' as unsigned integer) +10 +Level Code Message +Warning 1292 Truncated incorrect INTEGER value: '10 ' +c +1 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '10 ' +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; +DROP PROCEDURE p4; +DROP PROCEDURE p5; +DROP PROCEDURE p6; + +# - Case 3: check that "Exception trumps No Data". + +DROP TABLE IF EXISTS t1; +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 v1 INT; +DECLARE v2 INT; +DECLARE EXIT HANDLER FOR SQLEXCEPTION +SELECT "Error caught (expected)"; +DECLARE EXIT HANDLER FOR NOT FOUND +SELECT "End of Result Set found!"; +WHILE TRUE DO +FETCH c INTO v1, v2; +END WHILE; +END; +CLOSE c; +SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack +END| +CALL p1(); +Error caught (expected) +Error caught (expected) +DROP PROCEDURE p1; +DROP TABLE t1; +# +# Bug#36185: Incorrect precedence for warning and exception handlers +# +DROP TABLE IF EXISTS t1; +DROP PROCEDURE IF EXISTS p1; +CREATE TABLE t1 (a INT, b INT NOT NULL); +CREATE PROCEDURE p1() +BEGIN +DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning'; +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception'; +INSERT INTO t1 VALUES (CAST('10 ' AS SIGNED), NULL); +END| +CALL p1(); +exception +exception +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '10 ' +Error 1048 Column 'b' cannot be null +DROP TABLE t1; +DROP PROCEDURE p1; +# +# Bug#5889: Exit handler for a warning doesn't hide the warning in trigger +# + +# - Case 1 + +CREATE TABLE t1(a INT, b INT); +INSERT INTO t1 VALUES (1, 2); +CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW +BEGIN +DECLARE EXIT HANDLER FOR SQLWARNING +SET NEW.a = 10; +SET NEW.a = 99999999999; +END| +UPDATE t1 SET b = 20; +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +SHOW WARNINGS; +Level Code Message +Warning 1264 Out of range value for column 'a' at row 1 +SELECT * FROM t1; +a b +10 20 +DROP TRIGGER t1_bu; +DROP TABLE t1; + +# - Case 2 + +CREATE TABLE t1(a INT); +CREATE TABLE t2(b CHAR(1)); +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +BEGIN +INSERT INTO t2 VALUES('ab'); # Produces a warning. +INSERT INTO t2 VALUES('b'); # Does not produce a warning, +# previous warning should be cleared. +END| +INSERT INTO t1 VALUES(0); +SHOW WARNINGS; +Level Code Message +SELECT * FROM t1; +a +0 +SELECT * FROM t2; +b +a +b +DROP TRIGGER t1_bi; +DROP TABLE t1; +DROP TABLE t2; +# +# Bug#9857: Stored procedures: handler for sqlwarning ignored +# +SET @sql_mode_saved = @@sql_mode; +SET sql_mode = traditional; +CREATE PROCEDURE p1() +BEGIN +DECLARE CONTINUE HANDLER FOR SQLWARNING +SELECT 'warning caught (expected)'; +SELECT 5 / 0; +END| +CREATE PROCEDURE p2() +BEGIN +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION +SELECT 'error caught (unexpected)'; +SELECT 5 / 0; +END| +CALL p1(); +5 / 0 +NULL +warning caught (expected) +warning caught (expected) +Warnings: +Warning 1365 Division by 0 +SHOW WARNINGS; +Level Code Message +Warning 1365 Division by 0 +CALL p2(); +5 / 0 +NULL +Warnings: +Warning 1365 Division by 0 +SHOW WARNINGS; +Level Code Message +Warning 1365 Division by 0 +DROP PROCEDURE p1; +DROP PROCEDURE p2; +SET sql_mode = @sql_mode_saved; === modified file 'mysql-test/r/sp.result' --- a/mysql-test/r/sp.result 2010-05-14 05:28:51 +0000 +++ b/mysql-test/r/sp.result 2010-07-30 15:28:36 +0000 @@ -737,6 +737,8 @@ close c; end| insert into t2 values ("foo", 42, -1.9), ("bar", 3, 12.1), ("zap", 666, -3.14)| call cur1()| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select * from t1| id data foo 40 @@ -772,6 +774,8 @@ close c1; close c2; end| call cur2()| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select * from t3 order by i,s| s i bar 3 @@ -861,6 +865,8 @@ end$ set @@sql_mode = ''| set sql_select_limit = 1| call modes(@c1, @c2)| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed set sql_select_limit = default| select @c1, @c2| @c1 @c2 @@ -1682,42 +1688,64 @@ end| call h_ee()| h_ee Inner (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_es()| h_es Outer (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_en()| h_en Outer (good) +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed call h_ew()| h_ew Outer (good) call h_ex()| h_ex Outer (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_se()| h_se Inner (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_ss()| h_ss Inner (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_sn()| h_sn Outer (good) +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed call h_sw()| h_sw Outer (good) call h_sx()| h_sx Outer (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_ne()| h_ne Inner (good) +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed call h_ns()| h_ns Inner (good) +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed call h_nn()| h_nn Inner (good) +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed call h_we()| h_we Inner (good) @@ -1730,12 +1758,18 @@ Inner (good) call h_xe()| h_xe Inner (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_xs()| h_xs Inner (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' call h_xx()| h_xx Inner (good) +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' drop table t3| drop procedure h_ee| drop procedure h_es| @@ -1884,6 +1918,8 @@ set @x2 = 2; close c1; end| call bug2260()| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select @x2| @x2 2 @@ -2027,6 +2063,8 @@ insert into t3 values (123456789012); insert into t3 values (0); end| call bug2780()| +Warnings: +Warning 1264 Out of range value for column 's1' at row 1 select @x| @x 1 @@ -2449,6 +2487,8 @@ declare continue handler for sqlstate 'H select s1 from t3 union select s2 from t3; end| call bug4904()| +Warnings: +Error 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (latin2_general_ci,IMPLICIT) for operation 'UNION' drop procedure bug4904| drop table t3| drop procedure if exists bug336| @@ -2588,13 +2628,17 @@ select row_count()| row_count() 1 call bug4905()| +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' select row_count()| row_count() -0 +-1 call bug4905()| +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' select row_count()| row_count() -0 +-1 select * from t3| s1 1 @@ -2615,10 +2659,14 @@ insert into t3 values (1)| call bug6029()| sqlstate 23000 sqlstate 23000 +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' delete from t3| call bug6029()| 1136 1136 +Warnings: +Error 1136 Column count doesn't match value count at row 1 drop procedure bug6029| drop table t3| drop procedure if exists bug8540| @@ -2910,15 +2958,23 @@ end| call bug6900()| 2 2 +Warnings: +Error 1136 Column count doesn't match value count at row 1 call bug9074()| x1 x2 x3 x4 x5 x6 1 1 1 1 1 1 +Warnings: +Error 1062 Duplicate entry 'a' for key 'w' call bug6900_9074(0)| sqlexception sqlexception +Warnings: +Error 1136 Column count doesn't match value count at row 1 call bug6900_9074(1)| 23000 23000 +Warnings: +Error 1062 Duplicate entry 'a' for key 'w' drop procedure bug6900| drop procedure bug9074| drop procedure bug6900_9074| @@ -2961,9 +3017,13 @@ delete from t1| call bug9856()| 16 16 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed call bug9856()| 16 16 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed drop procedure bug9856| drop procedure if exists bug9674_1| drop procedure if exists bug9674_2| @@ -3194,6 +3254,8 @@ x 2 x 3 +Warnings: +Error 1326 Cursor is not open call bug10961()| x 1 @@ -3201,6 +3263,8 @@ x 2 x 3 +Warnings: +Error 1326 Cursor is not open drop procedure bug10961| DROP PROCEDURE IF EXISTS bug6866| DROP VIEW IF EXISTS tv| @@ -3316,7 +3380,11 @@ insert into t1 values ('Name4', 13), ('Name5', 14)| call bug11529()| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed call bug11529()| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed delete from t1| drop procedure bug11529| set character set utf8| @@ -3490,24 +3558,32 @@ end; end if; end| call bug12168('a')| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select * from t4| a 1 3 truncate t4| call bug12168('b')| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select * from t4| a 2 4 truncate t4| call bug12168('a')| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select * from t4| a 1 3 truncate t4| call bug12168('b')| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select * from t4| a 2 @@ -3807,6 +3883,8 @@ end| call bug7049_2()| Result Caught it +Warnings: +Error 1062 Duplicate entry '42' for key 'x' select * from t3| x 42 @@ -3814,12 +3892,16 @@ delete from t3| call bug7049_4()| Result Caught it +Warnings: +Error 1062 Duplicate entry '42' for key 'x' select * from t3| x 42 select bug7049_2()| bug7049_2() 1 +Warnings: +Error 1062 Duplicate entry '42' for key 'x' drop table t3| drop procedure bug7049_1| drop procedure bug7049_2| @@ -3947,6 +4029,8 @@ end| call bug14845()| a 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed drop procedure bug14845| drop procedure if exists bug13549_1| drop procedure if exists bug13549_2| @@ -4150,6 +4234,8 @@ end| call bug13729()| 55 55 +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' select * from t3| s1 1 @@ -4186,11 +4272,15 @@ Handler boo v isnull(v) NULL 1 +Warnings: +Error 1054 Unknown column 'undefined_var' in 'field list' call bug14643_2()| Handler boo Handler boo +Warnings: +Error 1054 Unknown column 'undefined_var' in 'field list' drop procedure bug14643_1| drop procedure bug14643_2| drop procedure if exists bug14304| @@ -4514,11 +4604,15 @@ Handler error End done +Warnings: +Error 1054 Unknown column 'v' in 'field list' call bug14498_2()| Handler error End done +Warnings: +Error 1054 Unknown column 'v' in 'field list' call bug14498_3()| v maybe @@ -4526,16 +4620,22 @@ Handler error End done +Warnings: +Error 1054 Unknown column 'v' in 'field list' call bug14498_4()| Handler error End done +Warnings: +Error 1054 Unknown column 'v' in 'field list' call bug14498_5()| Handler error End done +Warnings: +Error 1054 Unknown column 'v' in 'field list' drop procedure bug14498_1| drop procedure bug14498_2| drop procedure bug14498_3| @@ -4546,6 +4646,8 @@ drop procedure if exists bug15231_1| drop procedure if exists bug15231_2| drop procedure if exists bug15231_3| drop procedure if exists bug15231_4| +drop procedure if exists bug15231_5| +drop procedure if exists bug15231_6| create table t3 (id int not null)| create procedure bug15231_1() begin @@ -4568,7 +4670,7 @@ end| create procedure bug15231_3() begin declare exit handler for sqlwarning -select 'Caught it (wrong)' as 'Result'; +select 'Caught it (correct)' as 'Result'; call bug15231_4(); end| create procedure bug15231_4() @@ -4576,6 +4678,20 @@ begin declare x decimal(2,1); set x = 'zap'; select 'Missed it (correct)' as 'Result'; +show warnings; +end| +create procedure bug15231_5() +begin +declare exit handler for sqlwarning +select 'Caught it (wrong)' as 'Result'; +call bug15231_6(); +end| +create procedure bug15231_6() +begin +declare x decimal(2,1); +set x = 'zap'; +select 'Missed it (correct)' as 'Result'; +select id from t3; end| call bug15231_1()| 1 @@ -4583,19 +4699,29 @@ Before NOT FOUND condition is triggered 2 After NOT FOUND condtition is triggered xid xdone -1 0 +1 1 Warnings: Warning 1329 No data - zero rows fetched, selected, or processed call bug15231_3()| Result Missed it (correct) +Level Code Message +Warning 1366 Incorrect decimal value: 'zap' for column 'x' at row 1 +Result +Caught it (correct) Warnings: Warning 1366 Incorrect decimal value: 'zap' for column 'x' at row 1 -drop table if exists t3| -drop procedure if exists bug15231_1| -drop procedure if exists bug15231_2| -drop procedure if exists bug15231_3| -drop procedure if exists bug15231_4| +call bug15231_5()| +Result +Missed it (correct) +id +drop table t3| +drop procedure bug15231_1| +drop procedure bug15231_2| +drop procedure bug15231_3| +drop procedure bug15231_4| +drop procedure bug15231_5| +drop procedure bug15231_6| drop procedure if exists bug15011| create table t3 (c1 int primary key)| insert into t3 values (1)| @@ -4613,6 +4739,8 @@ end| call bug15011()| Handler Inner +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' drop procedure bug15011| drop table t3| drop procedure if exists bug17476| @@ -4688,6 +4816,8 @@ i 1 i 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed drop table t3| drop procedure bug16887| drop procedure if exists bug16474_1| @@ -4760,6 +4890,8 @@ declare continue handler for sqlexceptio select no_such_function(); end| call bug18787()| +Warnings: +Error 1305 FUNCTION test.no_such_function does not exist drop procedure bug18787| create database bug18344_012345678901| use bug18344_012345678901| @@ -5133,6 +5265,8 @@ statement failed statement failed statement after update statement after update +Warnings: +Error 1242 Subquery returns more than 1 row select * from t3| a 1 @@ -5144,6 +5278,8 @@ statement failed statement failed statement after update statement after update +Warnings: +Error 1242 Subquery returns more than 1 row select * from t3| a 1 @@ -5176,6 +5312,8 @@ in continue handler in continue handler reachable code a2 reachable code a2 +Warnings: +Error 1242 Subquery returns more than 1 row select * from t3| a 1 @@ -5191,6 +5329,8 @@ in continue handler in continue handler reachable code a2 reachable code a2 +Warnings: +Error 1242 Subquery returns more than 1 row select * from t3| a 1 @@ -5224,6 +5364,8 @@ in continue handler in continue handler reachable code a2 reachable code a2 +Warnings: +Error 1305 FUNCTION test.no_such_function does not exist drop procedure bug8153_proc_a| drop procedure bug8153_proc_b| drop table t3| @@ -5792,9 +5934,13 @@ end| select func_8407_a()| func_8407_a() NULL +Warnings: +Error 1146 Table 'test.no_such_view' doesn't exist select func_8407_b()| func_8407_b() 1500 +Warnings: +Error 1146 Table 'test.no_such_view' doesn't exist drop function func_8407_a| drop function func_8407_b| drop table if exists table_26503| @@ -5916,6 +6062,8 @@ looping i looping 0 leaving handler leaving handler +Warnings: +Error 1062 Duplicate entry '1' for key 'a' call proc_26503_ok_2(2)| do something do something @@ -5927,6 +6075,8 @@ looping i looping 4 leaving handler leaving handler +Warnings: +Error 1062 Duplicate entry '2' for key 'a' call proc_26503_ok_3(3)| do something do something @@ -5946,6 +6096,8 @@ looping i looping 0 leaving handler leaving handler +Warnings: +Error 1062 Duplicate entry '3' for key 'a' call proc_26503_ok_4(4)| do something do something @@ -5957,6 +6109,8 @@ looping i looping 4 leaving handler leaving handler +Warnings: +Error 1062 Duplicate entry '4' for key 'a' drop table table_26503| drop procedure proc_26503_ok_1| drop procedure proc_26503_ok_2| @@ -6670,6 +6824,8 @@ DECLARE CONTINUE HANDLER FOR SQLEXCEPTIO SELECT x FROM t1; END| CALL bug29770(); +Warnings: +Error 1054 Unknown column 'x' in 'field list' SELECT @state, @exception; @state @exception run NULL @@ -6708,6 +6864,8 @@ end; end while; end// call proc_33618(20); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed drop table t_33618; drop procedure proc_33618; # === modified file 'mysql-test/r/sp_trans.result' --- a/mysql-test/r/sp_trans.result 2010-02-24 13:52:27 +0000 +++ b/mysql-test/r/sp_trans.result 2010-07-30 15:28:36 +0000 @@ -99,6 +99,8 @@ return i; end| set @error_in_func:= 0| insert into t1 values (bug10015_6(5)), (bug10015_6(6))| +Warnings: +Error 1062 Duplicate entry '1' for key 'PRIMARY' select @error_in_func| @error_in_func 1 @@ -524,6 +526,8 @@ until done end repeat; close c; end| call bug14210()| +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed select count(*) from t4| count(*) 256 === modified file 'mysql-test/r/strict.result' --- a/mysql-test/r/strict.result 2010-04-11 06:52:42 +0000 +++ b/mysql-test/r/strict.result 2010-07-30 15:28:36 +0000 @@ -1190,6 +1190,8 @@ select'a'; insert into t1 values (200); call t1(); a a +Warnings: +Error 1264 Out of range value for column 'col1' at row 1 select * from t1; col1 drop procedure t1; === modified file 'mysql-test/r/view.result' --- a/mysql-test/r/view.result 2010-07-27 10:25:53 +0000 +++ b/mysql-test/r/view.result 2010-07-30 15:28:36 +0000 @@ -3946,6 +3946,8 @@ create view a as select 1; end| call p(); call p(); +Warnings: +Error 1050 Table 'a' already exists drop view a; drop procedure p; # === modified file 'mysql-test/suite/funcs_1/r/innodb_storedproc_02.result' --- a/mysql-test/suite/funcs_1/r/innodb_storedproc_02.result 2009-09-11 07:15:41 +0000 +++ b/mysql-test/suite/funcs_1/r/innodb_storedproc_02.result 2010-07-30 15:28:36 +0000 @@ -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 argumen 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 === modified file 'mysql-test/suite/funcs_1/r/memory_storedproc_02.result' --- a/mysql-test/suite/funcs_1/r/memory_storedproc_02.result 2009-09-11 07:15:41 +0000 +++ b/mysql-test/suite/funcs_1/r/memory_storedproc_02.result 2010-07-30 15:28:36 +0000 @@ -348,6 +348,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); @@ -446,6 +448,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 @@ -551,6 +555,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 () @@ -581,6 +587,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 @@ -624,6 +632,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; @@ -655,6 +665,8 @@ ERROR 42000: Incorrect number of argumen 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 @@ -697,6 +709,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; @@ -763,21 +777,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 @@ -886,18 +912,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 @@ -1032,6 +1066,8 @@ SQLSTATE 21000 SQLSTATE 24000 +Warnings: +Error 1326 Cursor is not open SELECT '-1-', @x; -1- @x -1- 6 @@ -1042,18 +1078,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 @@ -1336,6 +1378,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 === modified file 'mysql-test/suite/funcs_1/r/myisam_storedproc_02.result' --- a/mysql-test/suite/funcs_1/r/myisam_storedproc_02.result 2009-09-11 07:15:41 +0000 +++ b/mysql-test/suite/funcs_1/r/myisam_storedproc_02.result 2010-07-30 15:28:36 +0000 @@ -348,6 +348,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); @@ -446,6 +448,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 @@ -551,6 +555,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 () @@ -581,6 +587,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 @@ -624,6 +632,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; @@ -655,6 +665,8 @@ ERROR 42000: Incorrect number of argumen 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 @@ -697,6 +709,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; @@ -763,21 +777,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 @@ -886,18 +912,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 @@ -1032,6 +1066,8 @@ SQLSTATE 21000 SQLSTATE 24000 +Warnings: +Error 1326 Cursor is not open SELECT '-1-', @x; -1- @x -1- 6 @@ -1042,18 +1078,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 @@ -1336,6 +1378,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 === modified file 'mysql-test/suite/funcs_1/r/storedproc.result' --- a/mysql-test/suite/funcs_1/r/storedproc.result 2010-03-20 18:34:51 +0000 +++ b/mysql-test/suite/funcs_1/r/storedproc.result 2010-07-30 15:28:36 +0000 @@ -9325,6 +9325,8 @@ insert into t2 values (1); set @x = 3; END// CALL sp1(); +Warnings: +Error 1136 Column count doesn't match value count at row 1 DROP PROCEDURE sp1; DROP PROCEDURE IF EXISTS sp1; Warnings: @@ -13754,6 +13756,8 @@ END// CALL sp1(); x y @x NULL a 3 +Warnings: +Error 1305 PROCEDURE db_storedproc.nonsexist does not exist SELECT @v1, @v2; @v1 @v2 4 a @@ -14938,6 +14942,8 @@ NULL NULL NULL NULL @x @y NULL NULL +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP PROCEDURE sp1; Testcase 4.2.63: @@ -15097,6 +15103,8 @@ END; fetch cur1 into newf1, newf2, newf4, newf3; END// CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP PROCEDURE sp1; Testcase 4.2.70: @@ -22447,6 +22455,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 DROP PROCEDURE h1; DROP PROCEDURE sp1; @@ -22464,6 +22474,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1305 PROCEDURE db_storedproc.sp1 does not exist DROP PROCEDURE h1; Testcase 4.11.3: @@ -22483,6 +22495,8 @@ CALL sp1 (1); set @x=0; END// CALL h1(); +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 SELECT @x, @x2; @x @x2 1 1 @@ -22501,6 +22515,8 @@ CALL sp1 (1); set @x=0; END// CALL h1 (); +Warnings: +Error 1305 PROCEDURE db_storedproc.sp1 does not exist SELECT @x, @x2; @x @x2 1 1 @@ -22525,6 +22541,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 DROP PROCEDURE h1; DROP PROCEDURE sp1; @@ -22547,6 +22565,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 DROP PROCEDURE h1; DROP PROCEDURE sp1; @@ -22569,6 +22589,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 DROP PROCEDURE h1; DROP PROCEDURE sp1; @@ -22586,6 +22608,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1305 PROCEDURE db_storedproc.sp1 does not exist DROP PROCEDURE h1; Testcase 4.11.9: @@ -22605,6 +22629,8 @@ CALL sp1 (1); set @x=0; END// CALL h1(); +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 SELECT @x, @x2; @x @x2 1 1 @@ -22623,6 +22649,8 @@ CALL sp1 (1); set @x=0; END// CALL h1 (); +Warnings: +Error 1305 PROCEDURE db_storedproc.sp1 does not exist SELECT @x, @x2; @x @x2 1 1 @@ -22647,6 +22675,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 DROP PROCEDURE h1; DROP PROCEDURE sp1; @@ -22669,6 +22699,8 @@ END// CALL h1 (); @x @x2 1 1 +Warnings: +Error 1318 Incorrect number of arguments for PROCEDURE db_storedproc.sp1; expected 2, got 1 DROP PROCEDURE h1; DROP PROCEDURE sp1; @@ -22704,6 +22736,8 @@ done 1 done 1 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22777,6 +22811,8 @@ done 0 done 1 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22814,6 +22850,8 @@ done 0 done 1 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22844,6 +22882,8 @@ done 0 done 1 +Warnings: +Error 1328 Incorrect number of FETCH variables DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22874,6 +22914,8 @@ done 0 done 1 +Warnings: +Error 1328 Incorrect number of FETCH variables DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22904,6 +22946,8 @@ END// CALL h1(); done 0 +Warnings: +Error 1328 Incorrect number of FETCH variables DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22934,6 +22978,8 @@ END// CALL h1(); done 0 +Warnings: +Error 1328 Incorrect number of FETCH variables DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22964,6 +23010,8 @@ done 0 done 1 +Warnings: +Error 1325 Cursor is already open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -22995,6 +23043,8 @@ done 0 done @x 1 1 +Warnings: +Error 1325 Cursor is already open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23025,6 +23075,8 @@ END// CALL h1(); done 0 +Warnings: +Error 1325 Cursor is already open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23055,6 +23107,8 @@ END// CALL h1(); done 0 +Warnings: +Error 1325 Cursor is already open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23082,6 +23136,8 @@ END// CALL h1(); done @x 1 1 +Warnings: +Error 1326 Cursor is not open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23109,6 +23165,8 @@ END// CALL h1(); done @x 1 1 +Warnings: +Error 1326 Cursor is not open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23134,6 +23192,8 @@ set @x=1; SELECT done, @x; END// CALL h1(); +Warnings: +Error 1326 Cursor is not open DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23159,6 +23219,8 @@ set @x=1; SELECT done, @x; END// CALL h1(); +Warnings: +Error 1326 Cursor is not open DROP PROCEDURE IF EXISTS h1; drop table IF EXISTS res_t1; drop table IF EXISTS res_t2; @@ -23189,6 +23251,8 @@ END// CALL h1(); done @x 1 1 +Warnings: +Error 1339 Case not found for CASE statement DROP PROCEDURE IF EXISTS h1; drop table IF EXISTS res_t1; drop table IF EXISTS res_t2; @@ -23219,6 +23283,8 @@ END// CALL h1(); done @x 1 1 +Warnings: +Error 1339 Case not found for CASE statement DROP PROCEDURE IF EXISTS h1; drop table IF EXISTS res_t1; drop table IF EXISTS res_t2; @@ -23247,6 +23313,8 @@ set @x=1; SELECT done, @x; END// CALL h1(); +Warnings: +Error 1339 Case not found for CASE statement DROP PROCEDURE IF EXISTS h1; drop table IF EXISTS res_t1; drop table IF EXISTS res_t2; @@ -23275,6 +23343,8 @@ set @x=1; SELECT done, @x; END// CALL h1(); +Warnings: +Error 1339 Case not found for CASE statement DROP PROCEDURE IF EXISTS h1; DROP TABLE IF EXISTS res_t1; DROP TABLE IF EXISTS res_t2; @@ -23423,6 +23493,9 @@ CREATE TABLE res_t1(w CHAR, x CHAR); INSERT INTO res_t1 VALUES('a', 'b'); INSERT INTO res_t1 VALUES('c', 'd'); CALL h1(); +Warnings: +Warning 1265 Data truncated for column 'w' at row 1 +Warning 1265 Data truncated for column 'x' at row 1 SELECT @done, @x; @done @x 1 1 @@ -23445,6 +23518,9 @@ CREATE TABLE res_t1(w CHAR, x CHAR); INSERT INTO res_t1 VALUES('a', 'b'); INSERT INTO res_t1 VALUES('c', 'd'); CALL h1(); +Warnings: +Warning 1265 Data truncated for column 'w' at row 1 +Warning 1265 Data truncated for column 'x' at row 1 SELECT @done, @x; @done @x 1 1 === modified file 'mysql-test/suite/rpl/r/rpl_row_sp005.result' --- a/mysql-test/suite/rpl/r/rpl_row_sp005.result 2007-06-27 12:28:02 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_sp005.result 2010-07-30 15:28:36 +0000 @@ -77,6 +77,8 @@ id2 < ---- Master selects-- > ------------------------- CALL test.p1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM test.t3 ORDER BY id3; id3 c 1 MySQL === modified file 'mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result' --- a/mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result 2009-12-01 19:07:18 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_sp006_InnoDB.result 2010-07-30 15:28:36 +0000 @@ -38,6 +38,8 @@ INSERT INTO t1 VALUES ('MySQL','1993-02- END| CALL p2(); CALL p1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP TABLE t1; DROP TABLE t2; DROP PROCEDURE p1; === modified file 'mysql-test/suite/rpl/r/rpl_row_trig003.result' --- a/mysql-test/suite/rpl/r/rpl_row_trig003.result 2007-06-27 12:28:02 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_trig003.result 2010-07-30 15:28:36 +0000 @@ -69,9 +69,15 @@ INSERT INTO test.t2 VALUES(NULL,0,'Testi UPDATE test.t1 SET b1 = 0 WHERE b1 = 1; INSERT INTO test.t2 VALUES(NULL,1,'This is an after update test.', 'If this works, total will not be zero on the master or slave',1.4321,5.221,0,YEAR(NOW()),NOW()); UPDATE test.t2 SET b1 = 0 WHERE b1 = 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed INSERT INTO test.t1 VALUES(NULL,1,'add some more test data test.', 'and hope for the best', 3.321,5.221,0,YEAR(NOW()),NOW()); DELETE FROM test.t1 WHERE id = 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DELETE FROM test.t2 WHERE id = 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP TRIGGER test.t1_bi; DROP TRIGGER test.t2_ai; DROP TRIGGER test.t1_bu; === modified file 'mysql-test/t/signal.test' --- a/mysql-test/t/signal.test 2009-09-10 09:18:29 +0000 +++ b/mysql-test/t/signal.test 2010-07-30 15:28:36 +0000 @@ -2408,6 +2408,7 @@ BEGIN DECLARE EXIT HANDLER FOR x BEGIN SELECT '2'; + SHOW WARNINGS; RESIGNAL x SET MYSQL_ERRNO = 9999; END; @@ -2415,9 +2416,10 @@ BEGIN DECLARE EXIT HANDLER FOR x BEGIN SELECT '1'; + SHOW WARNINGS; RESIGNAL x SET SCHEMA_NAME = 'test', - MYSQL_ERRNO= 1231; + MYSQL_ERRNO= 1232; END; /* Raises ER_WRONG_VALUE_FOR_VAR : 1231, SQLSTATE 42000 */ SET @@sql_mode=NULL; @@ -2431,6 +2433,7 @@ BEGIN DECLARE EXIT HANDLER FOR x BEGIN SELECT '3'; + SHOW WARNINGS; RESIGNAL x SET MESSAGE_TEXT = 'Hi, I am a useless error message', MYSQL_ERRNO = 9999; === modified file 'mysql-test/t/sp-code.test' --- a/mysql-test/t/sp-code.test 2008-03-25 23:35:34 +0000 +++ b/mysql-test/t/sp-code.test 2010-07-30 15:28:36 +0000 @@ -649,3 +649,56 @@ END// DELIMITER ;// SHOW PROCEDURE CODE p1; DROP PROCEDURE p1; + +--echo # +--echo # Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP +--echo # + +--echo +--echo # - Case 4: check that "No Data trumps Warning". +--echo + +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES (1), (2), (3); + +delimiter |; + +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| + +delimiter ;| + +SET SESSION debug="+d,bug23032_emit_warning"; +CALL p1(); +SET SESSION debug="-d,bug23032_emit_warning"; + +DROP PROCEDURE p1; +DROP TABLE t1; === modified file 'mysql-test/t/sp-error.test' --- a/mysql-test/t/sp-error.test 2010-02-04 22:08:08 +0000 +++ b/mysql-test/t/sp-error.test 2010-07-30 15:28:36 +0000 @@ -2543,3 +2543,273 @@ DROP TABLE t1; --echo End of 5.1 tests +--echo # +--echo # Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP +--echo # + +--echo +--echo # - Case 1 +--echo + +--disable_warnings +DROP PROCEDURE IF EXISTS p1; +DROP PROCEDURE IF EXISTS p2; +DROP PROCEDURE IF EXISTS p3; +DROP PROCEDURE IF EXISTS p4; +DROP PROCEDURE IF EXISTS p5; +DROP PROCEDURE IF EXISTS p6; +--enable_warnings + +delimiter |; + +CREATE PROCEDURE p1() + BEGIN + SELECT CAST('10 ' as unsigned integer); + SELECT 1; + CALL p2(); + END| + +CREATE PROCEDURE p2() + BEGIN + SELECT CAST('10 ' as unsigned integer); + END| + +delimiter ;| + +CALL p1(); + +DROP PROCEDURE p1; +DROP PROCEDURE p2; + +--echo +--echo # - Case 2 +--echo + +delimiter |; + +CREATE PROCEDURE p1() + BEGIN + DECLARE c INT DEFAULT 0; + DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1; + CALL p2(); + CALL p3(); + CALL p4(); + SELECT c; + SELECT @@warning_count; + SHOW WARNINGS; + END| + +CREATE PROCEDURE p2() + BEGIN + SELECT CAST('10 ' as unsigned integer); + END| + +CREATE PROCEDURE p3() + BEGIN + SELECT CAST('10 ' as unsigned integer); + SELECT 1; + END| + +CREATE PROCEDURE p4() + BEGIN + SELECT CAST('10 ' as unsigned integer); + CALL p2(); + END| + +CREATE PROCEDURE p5() + BEGIN + SELECT CAST('10 ' as unsigned integer); + SHOW WARNINGS; + END| + +CREATE PROCEDURE P6() + BEGIN + DECLARE c INT DEFAULT 0; + DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1; + CALL p5(); + SELECT c; + END| + +delimiter ;| + +CALL p1(); +CALL p6(); + +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; +DROP PROCEDURE p4; +DROP PROCEDURE p5; +DROP PROCEDURE p6; + +--echo +--echo # - Case 3: check that "Exception trumps No Data". +--echo + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES (1), (2), (3); + +delimiter |; + +CREATE PROCEDURE p1() +BEGIN + DECLARE c CURSOR FOR SELECT a FROM t1; + + OPEN c; + + BEGIN + DECLARE v1 INT; + DECLARE v2 INT; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + SELECT "Error caught (expected)"; + + DECLARE EXIT HANDLER FOR NOT FOUND + SELECT "End of Result Set found!"; + + WHILE TRUE DO + FETCH c INTO v1, v2; + END WHILE; + END; + + CLOSE c; + + SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack +END| + +delimiter ;| + +CALL p1(); + +DROP PROCEDURE p1; +DROP TABLE t1; + +--echo # +--echo # Bug#36185: Incorrect precedence for warning and exception handlers +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +DROP PROCEDURE IF EXISTS p1; +--enable_warnings + +CREATE TABLE t1 (a INT, b INT NOT NULL); + +delimiter |; + +CREATE PROCEDURE p1() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning'; + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception'; + INSERT INTO t1 VALUES (CAST('10 ' AS SIGNED), NULL); +END| + +delimiter ;| + +CALL p1(); + +DROP TABLE t1; +DROP PROCEDURE p1; + +--echo # +--echo # Bug#5889: Exit handler for a warning doesn't hide the warning in trigger +--echo # + +--echo +--echo # - Case 1 +--echo + +CREATE TABLE t1(a INT, b INT); +INSERT INTO t1 VALUES (1, 2); + +delimiter |; + +CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW +BEGIN + DECLARE EXIT HANDLER FOR SQLWARNING + SET NEW.a = 10; + + SET NEW.a = 99999999999; +END| + +delimiter ;| + +UPDATE t1 SET b = 20; + +SHOW WARNINGS; + +SELECT * FROM t1; + +DROP TRIGGER t1_bu; +DROP TABLE t1; + +--echo +--echo # - Case 2 +--echo + +CREATE TABLE t1(a INT); +CREATE TABLE t2(b CHAR(1)); + +delimiter |; + +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +BEGIN + INSERT INTO t2 VALUES('ab'); # Produces a warning. + + INSERT INTO t2 VALUES('b'); # Does not produce a warning, + # previous warning should be cleared. +END| + +delimiter ;| + +INSERT INTO t1 VALUES(0); + +SHOW WARNINGS; + +SELECT * FROM t1; +SELECT * FROM t2; + +DROP TRIGGER t1_bi; +DROP TABLE t1; +DROP TABLE t2; + +--echo # +--echo # Bug#9857: Stored procedures: handler for sqlwarning ignored +--echo # + +SET @sql_mode_saved = @@sql_mode; +SET sql_mode = traditional; + +delimiter |; + +CREATE PROCEDURE p1() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLWARNING + SELECT 'warning caught (expected)'; + + SELECT 5 / 0; +END| + +CREATE PROCEDURE p2() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION + SELECT 'error caught (unexpected)'; + + SELECT 5 / 0; +END| + +delimiter ;| + +CALL p1(); +SHOW WARNINGS; + +CALL p2(); +SHOW WARNINGS; + +DROP PROCEDURE p1; +DROP PROCEDURE p2; +SET sql_mode = @sql_mode_saved; === modified file 'mysql-test/t/sp.test' --- a/mysql-test/t/sp.test 2010-04-13 21:56:19 +0000 +++ b/mysql-test/t/sp.test 2010-07-30 15:28:36 +0000 @@ -5432,6 +5432,8 @@ drop procedure if exists bug15231_1| drop procedure if exists bug15231_2| drop procedure if exists bug15231_3| drop procedure if exists bug15231_4| +drop procedure if exists bug15231_5| +drop procedure if exists bug15231_6| --enable_warnings create table t3 (id int not null)| @@ -5461,7 +5463,7 @@ end| create procedure bug15231_3() begin declare exit handler for sqlwarning - select 'Caught it (wrong)' as 'Result'; + select 'Caught it (correct)' as 'Result'; call bug15231_4(); end| @@ -5472,16 +5474,37 @@ begin set x = 'zap'; select 'Missed it (correct)' as 'Result'; + show warnings; +end| + +create procedure bug15231_5() +begin + declare exit handler for sqlwarning + select 'Caught it (wrong)' as 'Result'; + + call bug15231_6(); +end| + +create procedure bug15231_6() +begin + declare x decimal(2,1); + + set x = 'zap'; + select 'Missed it (correct)' as 'Result'; + select id from t3; end| call bug15231_1()| call bug15231_3()| +call bug15231_5()| -drop table if exists t3| -drop procedure if exists bug15231_1| -drop procedure if exists bug15231_2| -drop procedure if exists bug15231_3| -drop procedure if exists bug15231_4| +drop table t3| +drop procedure bug15231_1| +drop procedure bug15231_2| +drop procedure bug15231_3| +drop procedure bug15231_4| +drop procedure bug15231_5| +drop procedure bug15231_6| # === modified file 'sql/sp_head.cc' --- a/sql/sp_head.cc 2010-07-29 12:32:11 +0000 +++ b/sql/sp_head.cc 2010-07-30 15:28:36 +0000 @@ -1076,6 +1076,104 @@ void sp_head::recursion_level_error(THD /** + Find an SQL handler for any condition (warning or error) after execution + of a stored routine instruction. Basically, this function looks for an + appropriate SQL handler in RT-contexts. If an SQL handler is found, it is + remembered in the RT-context for future activation (the context can be + inactive at the moment). + + If there is no pending condition, the function just returns. + + If there was an error during the execution, an SQL handler for it will be + searched within the current and outer scopes. + + There might be several errors in the Warning Info (that's possible by using + SIGNAL/RESIGNAL in nested scopes) -- the function is looking for an SQL + handler for the latest (current) error only. + + If there was a warning during the execution, an SQL handler for it will be + searched within the current scope only. + + If several warnings were thrown during the execution and there are different + SQL handlers for them, it is not determined which SQL handler will be chosen. + Only one SQL handler will be executed. + + If warnings and errors were thrown during the execution, the error takes + precedence. I.e. error handler will be executed. If there is no handler + for that error, condition will remain unhandled. + + Once a warning or an error has been handled it is not removed from + Warning Info. + + According to The Standard (quoting PeterG): + + An SQL procedure statement works like this ... + SQL/Foundation 13.5 + (General Rules) (greatly summarized) says: + (1) Empty diagnostics area, thus clearing the condition. + (2) Execute statement. + During execution, if Exception Condition occurs, + set Condition Area = Exception Condition and stop + statement. + During execution, if No Data occurs, + set Condition Area = No Data Condition and continue + statement. + During execution, if Warning occurs, + and Condition Area is not already full due to + an earlier No Data condition, set Condition Area + = Warning and continue statement. + (3) Finish statement. + At end of execution, if Condition Area is not + already full due to an earlier No Data or Warning, + set Condition Area = Successful Completion. + In effect, this system means there is a precedence: + Exception trumps No Data, No Data trumps Warning, + Warning trumps Successful Completion. + + NB: "Procedure statements" include any DDL or DML or + control statements. So CREATE and DELETE and WHILE + and CALL and RETURN are procedure statements. But + DECLARE and END are not procedure statements. + + @param thd thread handle + @param ctx runtime context of the stored routine +*/ + +static void +find_handler_after_execution(THD *thd, sp_rcontext *ctx) +{ + if (thd->is_error()) + { + ctx->find_handler(thd, + thd->stmt_da->sql_errno(), + thd->stmt_da->get_sqlstate(), + MYSQL_ERROR::WARN_LEVEL_ERROR, + thd->stmt_da->message()); + } + else if (thd->warning_info->statement_warn_count()) + { + List_iterator it(thd->warning_info->warn_list()); + MYSQL_ERROR *err; + while ((err= it++)) + { + if (err->get_level() != MYSQL_ERROR::WARN_LEVEL_WARN && + err->get_level() != MYSQL_ERROR::WARN_LEVEL_NOTE) + continue; + + if (ctx->find_handler(thd, + err->get_sql_errno(), + err->get_sqlstate(), + err->get_level(), + err->get_message_text())) + { + break; + } + } + } +} + + +/** Execute the routine. The main instruction jump loop is there. Assume the parameters already set. @todo @@ -1096,7 +1194,7 @@ sp_head::execute(THD *thd) LEX_STRING saved_cur_db_name= { saved_cur_db_name_buf, sizeof(saved_cur_db_name_buf) }; bool cur_db_changed= FALSE; - sp_rcontext *ctx; + sp_rcontext *ctx= thd->spcont; bool err_status= FALSE; uint ip= 0; ulong save_sql_mode; @@ -1157,8 +1255,6 @@ sp_head::execute(THD *thd) goto done; } - if ((ctx= thd->spcont)) - ctx->clear_handler(); thd->is_slave_error= 0; old_arena= thd->stmt_arena; @@ -1243,7 +1339,6 @@ sp_head::execute(THD *thd) do { sp_instr *i; - uint hip; #if defined(ENABLED_PROFILING) /* @@ -1265,6 +1360,9 @@ sp_head::execute(THD *thd) break; } + /* Reset number of warnings for this query. */ + thd->warning_info->reset_for_next_command(); + DBUG_PRINT("execute", ("Instruction %u", ip)); /* @@ -1309,40 +1407,28 @@ sp_head::execute(THD *thd) free_root(&execute_mem_root, MYF(0)); /* - Check if an exception has occurred and a handler has been found - Note: We have to check even if err_status == FALSE, since warnings (and - some errors) don't return a non-zero value. We also have to check even - if thd->killed != 0, since some errors return with this even when a - handler has been found (e.g. "bad data"). + Find and process SQL handlers unless it is a fatal error (fatal + errors are not catchable by SQL handlers) or the connection has been + killed during execution. */ - if (ctx) + if (!thd->is_fatal_error && !thd->killed_errno()) { - uint handler_index; + /* + Find SQL handler in the appropriate RT-contexts: + - warnings can be handled by SQL handlers within + the current scope only; + - errors can be handled by any SQL handler from outer scope. + */ + find_handler_after_execution(thd, ctx); - switch (ctx->found_handler(& hip, & handler_index)) { - case SP_HANDLER_NONE: - break; - case SP_HANDLER_CONTINUE: - thd->restore_active_arena(&execute_arena, &backup_arena); - thd->set_n_backup_active_arena(&execute_arena, &backup_arena); - ctx->push_hstack(i->get_cont_dest()); - /* Fall through */ - default: - if (ctx->end_partial_result_set) - thd->protocol->end_partial_result_set(thd); - ip= hip; + /* If found, activate handler for the current scope. */ + if (ctx->activate_handler(thd, &ip, i, &execute_arena, &backup_arena)) err_status= FALSE; - ctx->clear_handler(); - ctx->enter_handler(hip, handler_index); - thd->clear_error(); - thd->is_fatal_error= 0; - thd->killed= THD::NOT_KILLED; - thd->mysys_var->abort= 0; - continue; - } - - ctx->end_partial_result_set= FALSE; } + + /* Reset sp_rcontext::end_partial_result_set flag. */ + ctx->end_partial_result_set= FALSE; + } while (!err_status && !thd->killed && !thd->is_fatal_error); #if defined(ENABLED_PROFILING) @@ -3037,23 +3123,14 @@ sp_instr_set::exec_core(THD *thd, uint * { int res= thd->spcont->set_variable(thd, m_offset, &m_value); - if (res && thd->spcont->found_handler_here()) + if (res) { - /* - Failed to evaluate the value, and a handler has been found. Reset the - variable to NULL. - */ + /* Failed to evaluate the value. Reset the variable to NULL. */ if (thd->spcont->set_variable(thd, m_offset, 0)) { /* If this also failed, let's abort. */ - - sp_rcontext *spcont= thd->spcont; - - thd->spcont= NULL; /* Avoid handlers */ - my_error(ER_OUT_OF_RESOURCES, MYF(0)); - spcont->clear_handler(); - thd->spcont= spcont; + my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR)); } } @@ -3586,18 +3663,6 @@ sp_instr_copen::execute(THD *thd, uint * if (thd->stmt_arena->free_list) cleanup_items(thd->stmt_arena->free_list); thd->stmt_arena= old_arena; - /* - Work around the fact that errors in selects are not returned properly - (but instead converted into a warning), so if a condition handler - caught, we have lost the result code. - */ - if (!res) - { - uint dummy1, dummy2; - - if (thd->spcont->found_handler(&dummy1, &dummy2)) - res= -1; - } /* TODO: Assert here that we either have an error or a cursor */ } DBUG_RETURN(res); @@ -3773,13 +3838,11 @@ sp_instr_set_case_expr::exec_core(THD *t { int res= thd->spcont->set_case_expr(thd, m_case_expr_id, &m_case_expr); - if (res && - !thd->spcont->get_case_expr(m_case_expr_id) && - thd->spcont->found_handler_here()) + if (res && !thd->spcont->get_case_expr(m_case_expr_id)) { /* Failed to evaluate the value, the case expression is still not - initialized, and a handler has been found. Set to NULL so we can continue. + initialized. Set to NULL so we can continue. */ Item *null_item= new Item_null(); @@ -3788,13 +3851,7 @@ sp_instr_set_case_expr::exec_core(THD *t thd->spcont->set_case_expr(thd, m_case_expr_id, &null_item)) { /* If this also failed, we have to abort. */ - - sp_rcontext *spcont= thd->spcont; - - thd->spcont= NULL; /* Avoid handlers */ - my_error(ER_OUT_OF_RESOURCES, MYF(0)); - spcont->clear_handler(); - thd->spcont= spcont; + my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATALERROR)); } } else === modified file 'sql/sp_pcontext.h' --- a/sql/sp_pcontext.h 2010-03-31 14:05:33 +0000 +++ b/sql/sp_pcontext.h 2010-07-30 15:28:36 +0000 @@ -332,13 +332,6 @@ public: int push_cond(LEX_STRING *name, sp_cond_type_t *val); - inline void - pop_cond(uint num) - { - while (num--) - pop_dynamic(&m_conds); - } - sp_cond_type_t * find_cond(LEX_STRING *name, my_bool scoped=0); === modified file 'sql/sp_rcontext.cc' --- a/sql/sp_rcontext.cc 2010-07-27 12:42:36 +0000 +++ b/sql/sp_rcontext.cc 2010-07-30 15:28:36 +0000 @@ -171,48 +171,50 @@ sp_rcontext::set_return_value(THD *thd, #define IS_NOT_FOUND_CONDITION(S) ((S)[0] == '0' && (S)[1] == '2') #define IS_EXCEPTION_CONDITION(S) ((S)[0] != '0' || (S)[1] > '2') -/* - Find a handler for the given errno. - This is called from all error message functions (e.g. push_warning, - net_send_error, et al) when a sp_rcontext is in effect. If a handler - is found, no error is sent, and the the SP execution loop will instead - invoke the found handler. - This might be called several times before we get back to the execution - loop, so m_hfound can be >= 0 if a handler has already been found. - (In which case we don't search again - the first found handler will - be used.) - Handlers are pushed on the stack m_handler, with the latest/innermost +/** + Find an SQL handler for the given error. + + SQL handlers are pushed on the stack m_handler, with the latest/innermost one on the top; we then search for matching handlers from the top and down. + We search through all the handlers, looking for the most specific one (sql_errno more specific than sqlstate more specific than the rest). Note that mysql error code handlers is a MySQL extension, not part of the standard. - SYNOPSIS - sql_errno The error code - level Warning level + SQL handlers for warnings are searched in the current scope only. - RETURN - 1 if a handler was found, m_hfound is set to its index (>= 0) - 0 if not found, m_hfound is -1 + SQL handlers for errors are searched in the current and in outer scopes. + That's why finding and activation of handler must be separated: an errror + handler might be located in the outer scope, which is not active at the + moment. Before such handler can be activated, execution flow should + unwind to that scope. + + Found SQL handler is remembered in m_hfound for future activation. + If no handler is found, m_hfound is -1. + + @param thd Thread handle + @param sql_errno The error code + @param sqlstate The error SQL state + @param level The error level + @param msg The error message + + @retval TRUE if an SQL handler was found + @retval FALSE otherwise */ bool sp_rcontext::find_handler(THD *thd, uint sql_errno, - const char* sqlstate, + const char *sqlstate, MYSQL_ERROR::enum_warning_level level, - const char* msg, - MYSQL_ERROR ** cond_hdl) + const char *msg) { - if (m_hfound >= 0) - { - *cond_hdl= NULL; - return TRUE; // Already got one - } + int i= m_hcount; - int i= m_hcount, found= -1; + /* Reset previously found handler. */ + m_hfound= -1; /* If this is a fatal sub-statement error, and this runtime @@ -240,105 +242,56 @@ sp_rcontext::find_handler(THD *thd, { case sp_cond_type_t::number: if (sql_errno == cond->mysqlerr && - (found < 0 || m_handler[found].cond->type > sp_cond_type_t::number)) - found= i; // Always the most specific + (m_hfound < 0 || m_handler[m_hfound].cond->type > sp_cond_type_t::number)) + m_hfound= i; // Always the most specific break; case sp_cond_type_t::state: if (strcmp(sqlstate, cond->sqlstate) == 0 && - (found < 0 || m_handler[found].cond->type > sp_cond_type_t::state)) - found= i; + (m_hfound < 0 || m_handler[m_hfound].cond->type > sp_cond_type_t::state)) + m_hfound= i; break; case sp_cond_type_t::warning: if ((IS_WARNING_CONDITION(sqlstate) || level == MYSQL_ERROR::WARN_LEVEL_WARN) && - found < 0) - found= i; + m_hfound < 0) + m_hfound= i; break; case sp_cond_type_t::notfound: - if (IS_NOT_FOUND_CONDITION(sqlstate) && found < 0) - found= i; + if (IS_NOT_FOUND_CONDITION(sqlstate) && m_hfound < 0) + m_hfound= i; break; case sp_cond_type_t::exception: if (IS_EXCEPTION_CONDITION(sqlstate) && level == MYSQL_ERROR::WARN_LEVEL_ERROR && - found < 0) - found= i; + m_hfound < 0) + m_hfound= i; break; } } - if (found < 0) - { - /* - Only "exception conditions" are propagated to handlers in calling - contexts. If no handler is found locally for a "completion condition" - (warning or "not found") we will simply resume execution. - */ - if (m_prev_runtime_ctx && IS_EXCEPTION_CONDITION(sqlstate) && - level == MYSQL_ERROR::WARN_LEVEL_ERROR) - return m_prev_runtime_ctx->find_handler(thd, - sql_errno, - sqlstate, - level, - msg, - cond_hdl); - *cond_hdl= NULL; - return FALSE; - } - - m_hfound= found; - - MYSQL_ERROR *raised= NULL; - DBUG_ASSERT(m_hfound >= 0); - DBUG_ASSERT((uint) m_hfound < m_root_parsing_ctx->max_handler_index()); - raised= & m_raised_conditions[m_hfound]; - raised->clear(); - raised->set(sql_errno, sqlstate, level, msg); - - *cond_hdl= raised; - return TRUE; -} - -/* - Handle the error for a given errno. - The severity of the error is adjusted depending of the current sql_mode. - If an handler is present for the error (see find_handler()), - this function will return true. - If a handler is found and if the severity of the error indicate - that the current instruction executed should abort, - the flag thd->net.report_error is also set. - This will cause the execution of the current instruction in a - sp_instr* to fail, and give control to the handler code itself - in the sp_head::execute() loop. - SYNOPSIS - sql_errno The error code - level Warning level - thd The current thread + if (m_hfound >= 0) + { + DBUG_ASSERT((uint) m_hfound < m_root_parsing_ctx->max_handler_index()); - RETURN - TRUE if a handler was found. - FALSE if no handler was found. -*/ -bool -sp_rcontext::handle_condition(THD *thd, - uint sql_errno, - const char* sqlstate, - MYSQL_ERROR::enum_warning_level level, - const char* msg, - MYSQL_ERROR ** cond_hdl) -{ - MYSQL_ERROR::enum_warning_level elevated_level= level; + m_raised_conditions[m_hfound].clear(); + m_raised_conditions[m_hfound].set(sql_errno, sqlstate, level, msg); + return TRUE; + } - /* Depending on the sql_mode of execution, - warnings may be considered errors */ - if ((level == MYSQL_ERROR::WARN_LEVEL_WARN) && - thd->really_abort_on_warning()) + /* + Only "exception conditions" are propagated to handlers in calling + contexts. If no handler is found locally for a "completion condition" + (warning or "not found") we will simply resume execution. + */ + if (m_prev_runtime_ctx && IS_EXCEPTION_CONDITION(sqlstate) && + level == MYSQL_ERROR::WARN_LEVEL_ERROR) { - elevated_level= MYSQL_ERROR::WARN_LEVEL_ERROR; + return m_prev_runtime_ctx->find_handler(thd, sql_errno, sqlstate, + level, msg); } - return find_handler(thd, sql_errno, sqlstate, elevated_level, msg, cond_hdl); + return FALSE; } void @@ -384,7 +337,9 @@ sp_rcontext::pop_handlers(uint count) { DBUG_ENTER("sp_rcontext::pop_handlers"); DBUG_ASSERT(m_hcount >= count); + m_hcount-= count; + DBUG_PRINT("info", ("m_hcount: %d", m_hcount)); DBUG_VOID_RETURN; } @@ -394,7 +349,9 @@ sp_rcontext::push_hstack(uint h) { DBUG_ENTER("sp_rcontext::push_hstack"); DBUG_ASSERT(m_hsp < m_root_parsing_ctx->max_handler_index()); + m_hstack[m_hsp++]= h; + DBUG_PRINT("info", ("m_hsp: %d", m_hsp)); DBUG_VOID_RETURN; } @@ -405,21 +362,74 @@ sp_rcontext::pop_hstack() uint handler; DBUG_ENTER("sp_rcontext::pop_hstack"); DBUG_ASSERT(m_hsp); + handler= m_hstack[--m_hsp]; + DBUG_PRINT("info", ("m_hsp: %d", m_hsp)); DBUG_RETURN(handler); } -void -sp_rcontext::enter_handler(uint hip, uint hindex) +/** + Prepare found handler to be executed. + + @retval TRUE if an SQL handler is activated (was found) and IP of the + first handler instruction. + @retval FALSE if there is no active handler +*/ + +bool +sp_rcontext::activate_handler(THD *thd, + uint *ip, + sp_instr *instr, + Query_arena *execute_arena, + Query_arena *backup_arena) { - DBUG_ENTER("sp_rcontext::enter_handler"); - DBUG_ASSERT(m_ihsp < m_root_parsing_ctx->max_handler_index()); - m_in_handler[m_ihsp].ip= hip; - m_in_handler[m_ihsp].index= hindex; - m_ihsp++; - DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp)); - DBUG_VOID_RETURN; + if (m_hfound < 0) + return FALSE; + + switch (m_handler[m_hfound].type) { + case SP_HANDLER_NONE: + break; + + case SP_HANDLER_CONTINUE: + thd->restore_active_arena(execute_arena, backup_arena); + thd->set_n_backup_active_arena(execute_arena, backup_arena); + push_hstack(instr->get_cont_dest()); + + /* Fall through */ + + default: + /* End aborted result set. */ + + if (end_partial_result_set) + thd->protocol->end_partial_result_set(thd); + + /* Enter handler. */ + + DBUG_ASSERT(m_ihsp < m_root_parsing_ctx->max_handler_index()); + DBUG_ASSERT(m_hfound >= 0); + + m_in_handler[m_ihsp].ip= m_handler[m_hfound].handler; + m_in_handler[m_ihsp].index= m_hfound; + m_ihsp++; + + DBUG_PRINT("info", ("Entering handler...")); + DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp)); + + /* Reset error state. */ + + thd->clear_error(); + thd->killed= THD::NOT_KILLED; // Some errors set thd->killed + // (e.g. "bad data"). + + /* Return IP of the activated SQL handler. */ + *ip= m_handler[m_hfound].handler; + + /* Reset found handler. */ + m_hfound= -1; + } + + return TRUE; } void @@ -427,9 +437,11 @@ sp_rcontext::exit_handler() { DBUG_ENTER("sp_rcontext::exit_handler"); DBUG_ASSERT(m_ihsp); + uint hindex= m_in_handler[m_ihsp-1].index; m_raised_conditions[hindex].clear(); m_ihsp-= 1; + DBUG_PRINT("info", ("m_ihsp: %d", m_ihsp)); DBUG_VOID_RETURN; } @@ -567,6 +579,11 @@ sp_cursor::fetch(THD *thd, List= 0); - } + MYSQL_ERROR * + raised_condition() const; - // Clears the handler find state - inline void - clear_handler() - { - m_hfound= -1; - } + void + push_hstack(uint h); - void push_hstack(uint h); + uint + pop_hstack(); - uint pop_hstack(); + bool + activate_handler(THD *thd, + uint *ip, + sp_instr *instr, + Query_arena *execute_arena, + Query_arena *backup_arena); - /** - Enter a SQL exception handler. - @param hip the handler instruction pointer - @param index the handler index - */ - void enter_handler(uint hip, uint index); - void exit_handler(); + void + exit_handler(); void push_cursor(sp_lex_keeper *lex_keeper, sp_instr_cpush *i); @@ -199,7 +172,7 @@ class sp_rcontext : public Sql_alloc void pop_cursors(uint count); - void + inline void pop_all_cursors() { pop_cursors(m_ccount); === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2010-07-30 15:13:38 +0000 +++ b/sql/sql_class.cc 2010-07-30 15:28:36 +0000 @@ -845,35 +845,6 @@ MYSQL_ERROR* THD::raise_condition(uint s } } - /* - If a continue handler is found, the error message will be cleared - by the stored procedures code. - */ - if (!is_fatal_error && spcont && - spcont->handle_condition(this, sql_errno, sqlstate, level, msg, &cond)) - { - /* - Do not push any warnings, a handled error must be completely - silenced. - */ - DBUG_RETURN(cond); - } - - /* Un-handled conditions */ - - cond= raise_condition_no_handler(sql_errno, sqlstate, level, msg); - DBUG_RETURN(cond); -} - -MYSQL_ERROR* -THD::raise_condition_no_handler(uint sql_errno, - const char* sqlstate, - MYSQL_ERROR::enum_warning_level level, - const char* msg) -{ - MYSQL_ERROR *cond= NULL; - DBUG_ENTER("THD::raise_condition_no_handler"); - query_cache_abort(&query_cache_tls); /* FIXME: broken special case */ @@ -886,6 +857,7 @@ THD::raise_condition_no_handler(uint sql cond= warning_info->push_warning(this, sql_errno, sqlstate, level, msg); DBUG_RETURN(cond); } + extern "C" void *thd_alloc(MYSQL_THD thd, unsigned int size) { === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2010-07-30 15:13:38 +0000 +++ b/sql/sql_class.h 2010-07-30 15:28:36 +0000 @@ -2800,23 +2800,6 @@ private: MYSQL_ERROR::enum_warning_level level, const char* msg); - /** - Raise a generic SQL condition, without activation any SQL condition - handlers. - This method is necessary to support the RESIGNAL statement, - which is allowed to bypass SQL exception handlers. - @param sql_errno the condition error number - @param sqlstate the condition SQLSTATE - @param level the condition level - @param msg the condition message text - @return The condition raised, or NULL - */ - MYSQL_ERROR* - raise_condition_no_handler(uint sql_errno, - const char* sqlstate, - MYSQL_ERROR::enum_warning_level level, - const char* msg); - public: /** Overloaded to guard query/query_length fields */ virtual void set_statement(Statement *stmt); === modified file 'sql/sql_error.cc' --- a/sql/sql_error.cc 2010-07-20 11:57:02 +0000 +++ b/sql/sql_error.cc 2010-07-30 15:28:36 +0000 @@ -494,14 +494,6 @@ void Warning_info::clear_warning_info(ul m_current_row_for_warning= 1; /* Start counting from the first row */ } -void Warning_info::reserve_space(THD *thd, uint count) -{ - /* Make room for count conditions */ - while ((m_warn_list.elements > 0) && - ((m_warn_list.elements + count) > thd->variables.max_error_count)) - m_warn_list.pop(); -} - /** Append warnings only if the original contents of the routine warning info was replaced. === modified file 'sql/sql_error.h' --- a/sql/sql_error.h 2010-03-31 14:05:33 +0000 +++ b/sql/sql_error.h 2010-07-30 15:28:36 +0000 @@ -153,8 +153,8 @@ private: Representation of a SQL condition. A SQL condition can be a completion condition (note, warning), or an exception condition (error, not found). - @note This class is named MYSQL_ERROR instead of SQL_condition for historical reasons, - to facilitate merging code with previous releases. + @note This class is named MYSQL_ERROR instead of SQL_condition for + historical reasons, to facilitate merging code with previous releases. */ class MYSQL_ERROR : public Sql_alloc { @@ -471,18 +471,6 @@ public: ulong statement_warn_count() const { return m_statement_warn_count; } - /** - Reserve some space in the condition area. - This is a privileged operation, reserved for the RESIGNAL implementation, - as only the RESIGNAL statement is allowed to remove conditions from - the condition area. - For other statements, new conditions are not added to the condition - area once the condition area is full. - @param thd The current thread - @param count The number of slots to reserve - */ - void reserve_space(THD *thd, uint count); - /** Add a new condition to the current list. */ MYSQL_ERROR *push_warning(THD *thd, uint sql_errno, const char* sqlstate, === modified file 'sql/sql_signal.cc' --- a/sql/sql_signal.cc 2010-05-14 18:11:25 +0000 +++ b/sql/sql_signal.cc 2010-07-30 15:28:36 +0000 @@ -499,18 +499,6 @@ bool Resignal_statement::execute(THD *th } /* RESIGNAL with signal_value */ - - /* Make room for 2 conditions */ - thd->warning_info->reserve_space(thd, 2); - - MYSQL_ERROR *raised= NULL; - raised= thd->raise_condition_no_handler(signaled->get_sql_errno(), - signaled->get_sqlstate(), - signaled->get_level(), - signaled->get_message_text()); - if (raised) - raised->copy_opt_attributes(signaled); - result= raise_condition(thd, signaled); DBUG_RETURN(result); --Boundary_(ID_MNh8ag6FKwTIvdVMHI6COQ) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/alik@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/alik@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alik@stripped # target_branch: file:///mnt/raid/alik/MySQL/bzr/00/bug23032/mysql-\ # trunk-bugfixing-bug23032/ # testament_sha1: c8fe82a49d5e8198313a84d2b22fea5567dc7db2 # timestamp: 2010-07-30 19:28:54 +0400 # source_branch: file:///mnt/raid/alik/MySQL/bzr/mysql-trunk-\ # bugfixing/ # base_revision_id: alik@stripped # # Begin bundle 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 amiA --Boundary_(ID_MNh8ag6FKwTIvdVMHI6COQ)--