From: Alexander Nozdrin Date: October 26 2010 11:48am Subject: bzr commit into mysql-5.5-bugteam branch (alexander.nozdrin:3098) Bug#55850 List-Archive: http://lists.mysql.com/commits/121921 X-Bug: 55850 Message-Id: <201010261149.o9QBfJhu023585@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4465628408978463673==" --===============4465628408978463673== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/bug55850/mysql-5.5-bugteam-bug55850/ based on revid:marc.alff@stripped 3098 Alexander Nozdrin 2010-10-26 Patch for Bug#55850 (Trigger warnings not cleared). The problem was that the warnings risen by a trigger were not cleared upon successful completion. The warnings should be cleared if the trigger completes successfully. The fix is to skip merging warnings into caller's Warning Info for triggers. modified: mysql-test/r/signal.result mysql-test/r/sp-error.result mysql-test/r/trigger.result mysql-test/suite/rpl/r/rpl_row_trig003.result mysql-test/t/sp-error.test sql/sp_head.cc sql/sp_head.h === modified file 'mysql-test/r/signal.result' --- a/mysql-test/r/signal.result 2010-07-30 15:28:36 +0000 +++ b/mysql-test/r/signal.result 2010-10-26 11:48:08 +0000 @@ -1379,9 +1379,6 @@ MESSAGE_TEXT = msg, MYSQL_ERRNO = 1012; end $$ insert into t1 values (1), (2) $$ -Warnings: -Warning 1012 This trigger SIGNAL a warning, a=1 -Warning 1012 This trigger SIGNAL a warning, a=2 drop trigger t1_ai $$ create trigger t1_ai after insert on t1 for each row begin @@ -1416,11 +1413,7 @@ MESSAGE_TEXT = NEW.msg, MYSQL_ERRNO = NEW.errno; end $$ insert into t1 set errno=1012, msg='Warning message 1 in trigger' $$ -Warnings: -Warning 1012 Warning message 1 in trigger insert into t1 set errno=1013, msg='Warning message 2 in trigger' $$ -Warnings: -Warning 1013 Warning message 2 in trigger drop table t1 $$ drop table if exists t1 $$ drop procedure if exists p1 $$ === modified file 'mysql-test/r/sp-error.result' --- a/mysql-test/r/sp-error.result 2010-07-30 15:28:36 +0000 +++ b/mysql-test/r/sp-error.result 2010-10-26 11:48:08 +0000 @@ -1877,9 +1877,6 @@ 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 @@ -1889,40 +1886,13 @@ 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 # @@ -1961,3 +1931,64 @@ Warning 1365 Division by 0 DROP PROCEDURE p1; DROP PROCEDURE p2; SET sql_mode = @sql_mode_saved; +# +# Bug#55850: Trigger warnings not cleared. +# +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +DROP PROCEDURE IF EXISTS p1; +CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT); +CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT, +d SMALLINT, e SMALLINT, f SMALLINT); +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +INSERT INTO t2(a, b, c) VALUES(99999, 99999, 99999); +CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW +INSERT INTO t2(d, e, f) VALUES(99999, 99999, 99999); +CREATE PROCEDURE p1() +INSERT INTO t1 VALUES(99999, 99999, 99999); + +CALL p1(); +Warnings: +Warning 1264 Out of range value for column 'x' at row 1 +Warning 1264 Out of range value for column 'y' at row 1 +Warning 1264 Out of range value for column 'z' at row 1 + +SHOW WARNINGS; +Level Code Message +Warning 1264 Out of range value for column 'x' at row 1 +Warning 1264 Out of range value for column 'y' at row 1 +Warning 1264 Out of range value for column 'z' at row 1 + +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE p1; +# ---------------------------------------------------------------------- +CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT); +CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT NOT NULL); +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +BEGIN +INSERT INTO t2 VALUES( +CAST('111111 ' AS SIGNED), +CAST('222222 ' AS SIGNED), +NULL); +END| +CREATE PROCEDURE p1() +INSERT INTO t1 VALUES(99999, 99999, 99999); + +CALL p1(); +ERROR 23000: Column 'c' cannot be null + +SHOW WARNINGS; +Level Code Message +Warning 1264 Out of range value for column 'x' at row 1 +Warning 1264 Out of range value for column 'y' at row 1 +Warning 1264 Out of range value for column 'z' at row 1 +Warning 1292 Truncated incorrect INTEGER value: '111111 ' +Warning 1264 Out of range value for column 'a' at row 1 +Warning 1292 Truncated incorrect INTEGER value: '222222 ' +Warning 1264 Out of range value for column 'b' at row 1 +Error 1048 Column 'c' cannot be null + +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE p1; === modified file 'mysql-test/r/trigger.result' --- a/mysql-test/r/trigger.result 2010-08-25 10:22:34 +0000 +++ b/mysql-test/r/trigger.result 2010-10-26 11:48:08 +0000 @@ -1072,8 +1072,6 @@ SELECT @x; NULL SET @x=2; UPDATE t1 SET i1 = @x; -Warnings: -Warning 1365 Division by 0 SELECT @x; @x NULL @@ -1085,9 +1083,6 @@ SELECT @x; NULL SET @x=4; UPDATE t1 SET i1 = @x; -Warnings: -Warning 1365 Division by 0 -Warning 1365 Division by 0 SELECT @x; @x NULL @@ -1198,8 +1193,6 @@ Warnings: Warning 1365 Division by 0 create trigger t1_bi before insert on t1 for each row set @a:=1/0| insert into t1 values(20, 20)| -Warnings: -Warning 1365 Division by 0 drop trigger t1_bi| create trigger t1_bi before insert on t1 for each row begin @@ -1218,8 +1211,6 @@ set @a:=1/0; end| set @check=0, @t4_bi_called=0, @t4_bu_called=0| insert into t1 values(30, 30)| -Warnings: -Warning 1365 Division by 0 select @check, @t4_bi_called, @t4_bu_called| @check @t4_bi_called @t4_bu_called 2 1 1 @@ -2090,12 +2081,8 @@ SELECT 1 FROM t1 c WHERE END// SET @bug51650 = 1; INSERT IGNORE INTO t2 VALUES(); -Warnings: -Warning 1329 No data - zero rows fetched, selected, or processed INSERT IGNORE INTO t1 SET b = '777'; INSERT IGNORE INTO t2 SET a = '111'; -Warnings: -Warning 1329 No data - zero rows fetched, selected, or processed SET @bug51650 = 1; INSERT IGNORE INTO t2 SET a = '777'; DROP TRIGGER trg1; @@ -2177,8 +2164,6 @@ SELECT 'ab' INTO a; SELECT 'a' INTO a; END| INSERT INTO t1 VALUES (1); -Warnings: -Warning 1265 Data truncated for column 'a' at row 1 DROP TRIGGER trg1; DROP TABLE t1; DROP TRIGGER IF EXISTS trg1; @@ -2196,20 +2181,12 @@ DECLARE trg2 CHAR; SELECT 'ab' INTO trg2; END| INSERT INTO t1 VALUES (0); -Warnings: -Warning 1265 Data truncated for column 'trg1' at row 1 -Warning 1265 Data truncated for column 'trg2' at row 1 SELECT * FROM t1; a 0 SHOW WARNINGS; Level Code Message INSERT INTO t1 VALUES (1),(2); -Warnings: -Warning 1265 Data truncated for column 'trg1' at row 1 -Warning 1265 Data truncated for column 'trg2' at row 1 -Warning 1265 Data truncated for column 'trg1' at row 1 -Warning 1265 Data truncated for column 'trg2' at row 1 DROP TRIGGER trg1; DROP TRIGGER trg2; DROP TABLE t1; === modified file 'mysql-test/suite/rpl/r/rpl_row_trig003.result' --- a/mysql-test/suite/rpl/r/rpl_row_trig003.result 2010-07-30 15:28:36 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_trig003.result 2010-10-26 11:48:08 +0000 @@ -69,15 +69,9 @@ 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/sp-error.test' --- a/mysql-test/t/sp-error.test 2010-07-30 15:28:36 +0000 +++ b/mysql-test/t/sp-error.test 2010-10-26 11:48:08 +0000 @@ -2719,10 +2719,6 @@ DROP PROCEDURE p1; --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); @@ -2747,36 +2743,6 @@ 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 # @@ -2813,3 +2779,83 @@ SHOW WARNINGS; DROP PROCEDURE p1; DROP PROCEDURE p2; SET sql_mode = @sql_mode_saved; + +--echo # +--echo # Bug#55850: Trigger warnings not cleared. +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +DROP TABLE IF EXISTS t2; +DROP PROCEDURE IF EXISTS p1; +--enable_warnings + +CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT); +CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT, + d SMALLINT, e SMALLINT, f SMALLINT); + +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW + INSERT INTO t2(a, b, c) VALUES(99999, 99999, 99999); + +CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW + INSERT INTO t2(d, e, f) VALUES(99999, 99999, 99999); + +CREATE PROCEDURE p1() + INSERT INTO t1 VALUES(99999, 99999, 99999); + +# What happened before the patch was: +# - INSERT INTO t1 added 3 warnings about overflow in 'x', 'y' and 'z' columns; +# - t1_bi run and added 3 warnings about overflow in 'a', 'b' and 'c' columns; +# - t1_ai run and added 3 warnings about overflow in 'd', 'e' and 'f' columns; +# => we had 9 warnings. +# +# Now what happens is: +# - INSERT INTO t1 adds 3 warnings about overflow in 'x', 'y' and 'z' columns; +# - t1_bi adds 3 warnings about overflow in 'a', 'b' and 'c' columns; +# - The warnings added by triggers are cleared; +# - t1_ai run and added 3 warnings about overflow in 'd', 'e' and 'f' columns; +# - The warnings added by triggers are cleared; +# => we have 3 warnings. + +--echo +CALL p1(); + +--echo +SHOW WARNINGS; + +--echo +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE p1; + +--echo # ---------------------------------------------------------------------- + +CREATE TABLE t1(x SMALLINT, y SMALLINT, z SMALLINT); +CREATE TABLE t2(a SMALLINT, b SMALLINT, c SMALLINT NOT NULL); + +delimiter |; + +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW +BEGIN + INSERT INTO t2 VALUES( + CAST('111111 ' AS SIGNED), + CAST('222222 ' AS SIGNED), + NULL); +END| + +delimiter ;| + +CREATE PROCEDURE p1() + INSERT INTO t1 VALUES(99999, 99999, 99999); + +--echo +--error ER_BAD_NULL_ERROR +CALL p1(); + +--echo +SHOW WARNINGS; + +--echo +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE p1; === modified file 'sql/sp_head.cc' --- a/sql/sp_head.cc 2010-10-21 08:41:13 +0000 +++ b/sql/sp_head.cc 2010-10-26 11:48:08 +0000 @@ -1176,10 +1176,17 @@ find_handler_after_execution(THD *thd, s /** Execute the routine. The main instruction jump loop is there. Assume the parameters already set. + + @param thd Thread context. + @param merge_da_on_success Flag specifying if Warning Info should be + propagated to the caller on Completion + Condition or not. + @todo - Will write this SP statement into binlog separately (TODO: consider changing the condition to "not inside event union") + @return Error status. @retval FALSE on success @retval @@ -1187,7 +1194,7 @@ find_handler_after_execution(THD *thd, s */ bool -sp_head::execute(THD *thd) +sp_head::execute(THD *thd, bool merge_da_on_success) { DBUG_ENTER("sp_head::execute"); char saved_cur_db_name_buf[NAME_LEN+1]; @@ -1481,8 +1488,15 @@ sp_head::execute(THD *thd) thd->stmt_arena= old_arena; state= EXECUTED; - /* Restore the caller's original warning information area. */ - saved_warning_info->merge_with_routine_info(thd, thd->warning_info); + /* + Restore the caller's original warning information area: + - warnings generated during trigger execution should not be + propagated to the caller on success; + - if there was an exception during execution, warning info should be + propagated to the caller in any case. + */ + if (err_status || merge_da_on_success) + saved_warning_info->merge_with_routine_info(thd, thd->warning_info); thd->warning_info= saved_warning_info; done: @@ -1704,7 +1718,7 @@ sp_head::execute_trigger(THD *thd, thd->spcont= nctx; - err_status= execute(thd); + err_status= execute(thd, FALSE); err_with_cleanup: thd->restore_active_arena(&call_arena, &backup_arena); @@ -1921,7 +1935,7 @@ sp_head::execute_function(THD *thd, Item */ thd->set_n_backup_active_arena(&call_arena, &backup_arena); - err_status= execute(thd); + err_status= execute(thd, TRUE); thd->restore_active_arena(&call_arena, &backup_arena); @@ -2154,7 +2168,7 @@ sp_head::execute_procedure(THD *thd, Lis #endif if (!err_status) - err_status= execute(thd); + err_status= execute(thd, TRUE); if (save_log_general) thd->variables.option_bits &= ~OPTION_LOG_OFF; === modified file 'sql/sp_head.h' --- a/sql/sp_head.h 2010-08-16 15:16:07 +0000 +++ b/sql/sp_head.h 2010-10-26 11:48:08 +0000 @@ -527,7 +527,7 @@ private: HASH m_sptabs; bool - execute(THD *thd); + execute(THD *thd, bool merge_da_on_success); /** Perform a forward flow analysis in the generated code. --===============4465628408978463673== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # x72e12800wl136go # target_branch: file:///home/alik/MySQL/bzr/00/bug55850/mysql-5.5-\ # bugteam-bug55850/ # testament_sha1: 8033e2b4266b903a2c463cbf69619c82f11918f6 # timestamp: 2010-10-26 15:48:19 +0400 # base_revision_id: marc.alff@stripped\ # xkuzdj7ucmu70807 # # Begin bundle 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 WkgoAi+lpGhLKUm0uI1/U/lR/xdyRThQkIEjek8= --===============4465628408978463673==--