From: Alexander Nozdrin Date: July 29 2010 10:08pm Subject: bzr commit into mysql-trunk-runtime branch (alik:3158) Bug#5889 Bug#9857 Bug#23032 Bug#36185 List-Archive: http://lists.mysql.com/commits/114685 X-Bug: 5889,9857,23032,36185 Message-Id: <20100729220811.68F8140E90@quad> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_G/PBqxOnZuxy8sjlGkmV5A)" --Boundary_(ID_G/PBqxOnZuxy8sjlGkmV5A) 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 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. 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-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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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; === 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-29 22:08:04 +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,296 @@ 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 caugt (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 caugt (expected) +Error caugt (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; + +# - 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 1285 MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work +Warning found! +Warning found! +Level Code Message +Warning 1285 MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work +Warning found! +Warning found! +Level Code Message +Warning 1285 MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work +End of Result Set found! +End of Result Set found! +Level Code Message +Warning 1285 MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work +Error 1329 No data - zero rows fetched, selected, or processed +SET SESSION debug="-d,bug23032_emit_warning"; +DROP PROCEDURE p1; +DROP TABLE t1; +# +# 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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-29 22:08:04 +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-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-29 22:08:04 +0000 @@ -2543,3 +2543,322 @@ 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 caugt (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 # - 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; + +--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-29 22:08:04 +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-29 22:08:04 +0000 @@ -1076,6 +1076,76 @@ void sp_head::recursion_level_error(THD /** + Find an SQL handler for any warning or error after execution of a store + 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 warning/error, 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, and there are SQL + handlers for both warnings and errors, the error takes precedence. I.e. error + handler will be executed. If there were warnings and errors, but there are SQL + handlers for warnings only, one SQL handler for warning will be executed. + + Once a warning or an error has been handled it is not removed from + Warning Info. + + @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())) + { + return; + } + + 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())) + { + return; + } + } + } +} + + +/** Execute the routine. The main instruction jump loop is there. Assume the parameters already set. @todo @@ -1096,7 +1166,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 +1227,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 +1311,6 @@ sp_head::execute(THD *thd) do { sp_instr *i; - uint hip; #if defined(ENABLED_PROFILING) /* @@ -1265,6 +1332,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 +1379,30 @@ 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. - 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; - 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; - } + Update warning_info. + */ + find_handler_after_execution(thd, ctx); - ctx->end_partial_result_set= FALSE; + /* Activate handler for the current scope. */ + if (ctx->activate_handler(thd, &ip, i, &execute_arena, &backup_arena)) + err_status= 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 +3097,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 +3637,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 +3812,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 +3825,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-29 22:08:04 +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-29 22:08:04 +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; } @@ -402,24 +359,76 @@ sp_rcontext::push_hstack(uint h) uint sp_rcontext::pop_hstack() { - uint handler; DBUG_ENTER("sp_rcontext::pop_hstack"); DBUG_ASSERT(m_hsp); - handler= m_hstack[--m_hsp]; + + uint 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 +436,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 +578,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-29 20:17:09 +0000 +++ b/sql/sql_class.cc 2010-07-29 22:08:04 +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-29 20:17:09 +0000 +++ b/sql/sql_class.h 2010-07-29 22:08:04 +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-29 22:08:04 +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. @@ -570,6 +562,12 @@ MYSQL_ERROR *Warning_info::push_warning( return cond; } +void Warning_info::remove_warning(THD *thd, const MYSQL_ERROR *warning) +{ + m_warn_count[warning->get_level()]--; + m_statement_warn_count--; +} + /* Push the warning to error list if there is still room in the list === 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-29 22:08:04 +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,24 +471,14 @@ 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, MYSQL_ERROR::enum_warning_level level, const char* msg); + void remove_warning(THD *thd, const MYSQL_ERROR *warning); + /** Set the read only status for this statement area. This is a privileged operation, reserved for the implementation of === 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-29 22:08:04 +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_G/PBqxOnZuxy8sjlGkmV5A) 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: 91771386446df9d9f3280de684c6891be643efca # timestamp: 2010-07-30 02:08:11 +0400 # source_branch: file:///mnt/raid/alik/MySQL/bzr/mysql-trunk-\ # bugfixing/ # base_revision_id: alik@stripped # # Begin bundle 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 --Boundary_(ID_G/PBqxOnZuxy8sjlGkmV5A)--