From: Alexander Nozdrin Date: October 6 2010 7:03pm Subject: bzr commit into mysql-5.5-bugteam branch (alexander.nozdrin:3097) Bug#55850 List-Archive: http://lists.mysql.com/commits/120166 X-Bug: 55850 Message-Id: <201010061905.o96FYQwo030720@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4337820471377287563==" --===============4337820471377287563== 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:alexander.nozdrin@stripped 3097 Alexander Nozdrin 2010-10-06 Preliminary patch for Bug#55850 (Trigger warnings not cleared). The problem was that the warnings risen by a trigger were not cleared. The warnings should be cleared if the trigger completes successfully. The fix is to remove "trigger warnings" after executing the trigger in Table_triggers_list::process_triggers(). modified: mysql-test/r/sp-error.result mysql-test/t/sp-error.test sql/sql_error.cc sql/sql_error.h sql/sql_trigger.cc === modified file 'mysql-test/r/sp-error.result' --- a/mysql-test/r/sp-error.result 2010-10-06 17:35:29 +0000 +++ b/mysql-test/r/sp-error.result 2010-10-06 19:03:48 +0000 @@ -1949,3 +1949,26 @@ 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 +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE p1; === 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-06 19:03:48 +0000 @@ -2813,3 +2813,46 @@ 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. + +CALL p1(); + +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE p1; === modified file 'sql/sql_error.cc' --- a/sql/sql_error.cc 2010-10-06 17:35:29 +0000 +++ b/sql/sql_error.cc 2010-10-06 19:03:48 +0000 @@ -566,6 +566,14 @@ 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-10-06 17:35:29 +0000 +++ b/sql/sql_error.h 2010-10-06 19:03:48 +0000 @@ -97,6 +97,9 @@ public: return m_statement_warn_count; } + void remove_warning() + { --m_statement_warn_count; } + Diagnostics_area() { reset_diagnostics_area(); } private: @@ -489,6 +492,8 @@ public: 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_trigger.cc' --- a/sql/sql_trigger.cc 2010-09-30 10:43:43 +0000 +++ b/sql/sql_trigger.cc 2010-10-06 19:03:48 +0000 @@ -2032,6 +2032,8 @@ bool Table_triggers_list::process_trigge thd->reset_sub_statement_state(&statement_state, SUB_STMT_TRIGGER); + uint statement_warn_count_saved= thd->warning_info->statement_warn_count(); + /* Reset current_select before call execute_trigger() and restore it after return from one. This way error is set @@ -2039,13 +2041,32 @@ bool Table_triggers_list::process_trigge */ save_current_select= thd->lex->current_select; thd->lex->current_select= NULL; + err_status= sp_trigger->execute_trigger(thd, &trigger_table->s->db, &trigger_table->s->table_name, &subject_table_grants[event][time_type]); + thd->lex->current_select= save_current_select; + if (statement_warn_count_saved < thd->warning_info->statement_warn_count()) + { + List_iterator it(thd->warning_info->warn_list()); + MYSQL_ERROR *err; + uint idx= 0; + while ((err= it++)) + { + if (++idx <= statement_warn_count_saved) + continue; + + thd->warning_info->remove_warning(thd, err); + thd->stmt_da->remove_warning(); + + it.remove(); + } + } + thd->restore_sub_statement_state(&statement_state); return err_status; --===============4337820471377287563== 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\ # 81uq2f270fxdq97i # target_branch: file:///home/alik/MySQL/bzr/00/bug55850/mysql-5.5-\ # bugteam-bug55850/ # testament_sha1: 977c988a561fa0a3545b6c0aca835c221d3cb488 # timestamp: 2010-10-06 23:03:53 +0400 # base_revision_id: alexander.nozdrin@stripped\ # 2qmlj0bc8rqmc17h # # Begin bundle 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 --===============4337820471377287563==--