From: Dmitry Shulga Date: June 9 2011 5:03pm Subject: bzr commit into mysql-5.1 branch (Dmitry.Shulga:3640) Bug#57156 Bug#11764334 List-Archive: http://lists.mysql.com/commits/138975 X-Bug: 57156,11764334 Message-Id: <201106091703.p59H3U8m028097@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0444087779329299987==" --===============0444087779329299987== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/shulga/projects/mysql/mysql-5.1-bug11764334/ based on revid:marko.makela@stripped 3640 Dmitry Shulga 2011-06-10 Fixed bug#11764334 (formerly bug#57156): ALTER EVENT CHANGES THE EVENT STATUS. Any ALTER EVENT statement on a disabled event enabled it back (unless this ALTER EVENT statement explicitly disabled the event). The problem was that during processing of an ALTER EVENT statement value of status field was overwritten unconditionally even if new value was not specified explicitly. As a consequence this field was set to default value for status which corresponds to ENABLE. The solution is to check if status field was explicitly specified in ALTER EVENT statement before assigning new value to status field. @ mysql-test/r/events_bugs.result test's result for Bug#11764334 was added. @ mysql-test/t/events_bugs.test new test for Bug#11764334 was added. @ sql/event_db_repository.cc mysql_event_fill_row() was modified: set value for status field in events tables only in case if statement CREATE EVENT is being processed or if this value was set in ALTER EVENT statement. Event_db_repository::create_event was modified: removed redundant setting of status field after return from call to mysql_event_fill_row(). @ sql/event_parse_data.h Event_parse_data structure was modified: added flag status_changed that is set to true if status's value was changed in ALTER EVENT statement. @ sql/sql_yacc.yy Set flag status_changed if status was set in ALTER EVENT statement. modified: mysql-test/r/events_bugs.result mysql-test/t/events_bugs.test sql/event_db_repository.cc sql/event_parse_data.cc sql/event_parse_data.h sql/sql_yacc.yy === modified file 'mysql-test/r/events_bugs.result' --- a/mysql-test/r/events_bugs.result 2011-05-27 09:23:08 +0000 +++ b/mysql-test/r/events_bugs.result 2011-06-09 17:03:17 +0000 @@ -419,7 +419,7 @@ SET TIME_ZONE= '+04:00'; ALTER EVENT e1 DO SELECT 2; SHOW EVENTS; Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation -events_test e1 root@localhost -03:00 RECURRING NULL 1 DAY 2005-12-31 20:58:59 2030-01-03 00:00:00 ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci +events_test e1 root@localhost -03:00 RECURRING NULL 1 DAY 2005-12-31 20:58:59 2030-01-03 00:00:00 DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci DROP EVENT e1; SET TIME_ZONE='+05:00'; CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO @@ -796,6 +796,20 @@ COUNT(*) DROP EVENT IF EXISTS event_Bug12546938; DROP TABLE table_bug12546938; SET GLOBAL EVENT_SCHEDULER = OFF; +DROP DATABASE IF EXISTS event_test11764334; +CREATE DATABASE event_test11764334; +USE event_test11764334; +CREATE EVENT ev1 ON SCHEDULE EVERY 3 SECOND DISABLE DO SELECT 1; +SHOW EVENTS IN event_test11764334 WHERE NAME='ev1'; +Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation +event_test11764334 ev1 root@localhost SYSTEM RECURRING NULL 3 SECOND 2011-06-09 19:59:01 NULL DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci +ALTER EVENT ev1 ON SCHEDULE EVERY 4 SECOND; +SHOW EVENTS IN event_test11764334 WHERE NAME='ev1'; +Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation +event_test11764334 ev1 root@localhost SYSTEM RECURRING NULL 4 SECOND 2011-06-09 19:59:01 NULL DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci +DROP EVENT ev1; +DROP DATABASE event_test11764334; +USE test; DROP DATABASE events_test; SET GLOBAL event_scheduler= 'ON'; SET @@global.concurrent_insert= @concurrent_insert; === modified file 'mysql-test/t/events_bugs.test' --- a/mysql-test/t/events_bugs.test 2011-05-27 09:23:08 +0000 +++ b/mysql-test/t/events_bugs.test 2011-06-09 17:03:17 +0000 @@ -1286,6 +1286,21 @@ DROP EVENT IF EXISTS event_Bug12546938; DROP TABLE table_bug12546938; SET GLOBAL EVENT_SCHEDULER = OFF; +# +# Bug#11764334 - 57156: ALTER EVENT CHANGES THE EVENT STATUS +# +--disable_warnings +DROP DATABASE IF EXISTS event_test11764334; +--enable_warnings +CREATE DATABASE event_test11764334; +USE event_test11764334; +CREATE EVENT ev1 ON SCHEDULE EVERY 3 SECOND DISABLE DO SELECT 1; +SHOW EVENTS IN event_test11764334 WHERE NAME='ev1'; +ALTER EVENT ev1 ON SCHEDULE EVERY 4 SECOND; +SHOW EVENTS IN event_test11764334 WHERE NAME='ev1'; +DROP EVENT ev1; +DROP DATABASE event_test11764334; +USE test; ########################################################################### # # End of tests === modified file 'sql/event_db_repository.cc' --- a/sql/event_db_repository.cc 2011-05-27 09:23:08 +0000 +++ b/sql/event_db_repository.cc 2011-06-09 17:03:17 +0000 @@ -226,9 +226,16 @@ mysql_event_fill_row(THD *thd, if (fields[f_num= ET_FIELD_NAME]->store(et->name.str, et->name.length, scs)) goto err_truncate; - /* both ON_COMPLETION and STATUS are NOT NULL thus not calling set_notnull()*/ + /* ON_COMPLETION field is NOT NULL thus not calling set_notnull()*/ rs|= fields[ET_FIELD_ON_COMPLETION]->store((longlong)et->on_completion, TRUE); - rs|= fields[ET_FIELD_STATUS]->store((longlong)et->status, TRUE); + + /* + Set STATUS value unconditionally in case of CREATE EVENT. + For ALTER EVENT set it only if value of this field was changed. + Since STATUS field is NOT NULL call to set_notnull() is not needed. + */ + if (!is_update || et->status_changed) + rs|= fields[ET_FIELD_STATUS]->store((longlong)et->status, TRUE); rs|= fields[ET_FIELD_ORIGINATOR]->store((longlong)et->originator, TRUE); /* @@ -694,8 +701,6 @@ Event_db_repository::create_event(THD *t if (mysql_event_fill_row(thd, table, parse_data, sp, saved_mode, FALSE)) goto end; - table->field[ET_FIELD_STATUS]->store((longlong)parse_data->status, TRUE); - if ((ret= table->file->ha_write_row(table->record[0]))) { table->file->print_error(ret, MYF(0)); === modified file 'sql/event_parse_data.cc' --- a/sql/event_parse_data.cc 2009-02-13 16:41:47 +0000 +++ b/sql/event_parse_data.cc 2011-06-09 17:03:17 +0000 @@ -46,9 +46,8 @@ Event_parse_data::new_instance(THD *thd) Event_parse_data::Event_parse_data() :on_completion(Event_parse_data::ON_COMPLETION_DEFAULT), - status(Event_parse_data::ENABLED), - do_not_create(FALSE), - body_changed(FALSE), + status(Event_parse_data::ENABLED), status_changed(false), + do_not_create(FALSE), body_changed(FALSE), item_starts(NULL), item_ends(NULL), item_execute_at(NULL), starts_null(TRUE), ends_null(TRUE), execute_at_null(TRUE), item_expression(NULL), expression(0) @@ -140,6 +139,7 @@ Event_parse_data::check_if_in_the_past(T else if (status == Event_parse_data::ENABLED) { status= Event_parse_data::DISABLED; + status_changed= true; push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_EVENT_EXEC_TIME_IN_THE_PAST, ER(ER_EVENT_EXEC_TIME_IN_THE_PAST)); @@ -569,7 +569,10 @@ void Event_parse_data::check_originator_ DBUG_PRINT("info", ("Invoked object status set to SLAVESIDE_DISABLED.")); if ((status == Event_parse_data::ENABLED) || (status == Event_parse_data::DISABLED)) - status = Event_parse_data::SLAVESIDE_DISABLED; + { + status= Event_parse_data::SLAVESIDE_DISABLED; + status_changed= true; + } originator = thd->server_id; } else === modified file 'sql/event_parse_data.h' --- a/sql/event_parse_data.h 2008-11-10 20:21:49 +0000 +++ b/sql/event_parse_data.h 2011-06-09 17:03:17 +0000 @@ -49,6 +49,7 @@ public: int on_completion; int status; + bool status_changed; longlong originator; /* do_not_create will be set if STARTS time is in the past and === modified file 'sql/sql_yacc.yy' --- a/sql/sql_yacc.yy 2010-10-13 05:28:58 +0000 +++ b/sql/sql_yacc.yy 2011-06-09 17:03:17 +0000 @@ -2024,16 +2024,19 @@ opt_ev_status: | ENABLE_SYM { Lex->event_parse_data->status= Event_parse_data::ENABLED; + Lex->event_parse_data->status_changed= true; $$= 1; } | DISABLE_SYM ON SLAVE { Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; + Lex->event_parse_data->status_changed= true; $$= 1; } | DISABLE_SYM { Lex->event_parse_data->status= Event_parse_data::DISABLED; + Lex->event_parse_data->status_changed= true; $$= 1; } ; --===============0444087779329299987== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.shulga@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.shulga@stripped\ # u4v9mvdajfyr2y91 # target_branch: file:///Users/shulga/projects/mysql/mysql-5.1-\ # bug11764334/ # testament_sha1: 8ed37d5f0d30ed7206b1c0af55870efe7faf04c9 # timestamp: 2011-06-10 00:03:24 +0700 # base_revision_id: marko.makela@stripped\ # rhfwxtmyedcp5il6 # # Begin bundle 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 /vU+D/i7kinChICQS0P4 --===============0444087779329299987==--