From: Dmitry Shulga Date: May 27 2011 11:44am Subject: bzr push into mysql-5.5 branch (Dmitry.Shulga:3407 to 3408) Bug#12546938 List-Archive: http://lists.mysql.com/commits/138316 X-Bug: 12546938 Message-Id: <201105271144.p4RBiiSw031529@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5975689290668242788==" --===============5975689290668242788== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3408 Dmitry Shulga 2011-05-27 [merge] Manual-merge of patch for bug#12546938 from mysql-5.1->mysql-5.5 modified: mysql-test/r/events_bugs.result mysql-test/t/events_bugs.test sql/event_db_repository.cc sql/event_db_repository.h sql/events.cc 3407 Tatjana Azundris Nuernberg 2011-05-27 build fixes for -Werror (11745920) modified: vio/viossl.c === modified file 'mysql-test/r/events_bugs.result' --- a/mysql-test/r/events_bugs.result 2011-03-28 15:38:16 +0000 +++ b/mysql-test/r/events_bugs.result 2011-05-27 11:42:28 +0000 @@ -535,6 +535,7 @@ DROP EVENT e3; DROP EVENT e2; DROP EVENT e1; SET TIME_ZONE=@save_time_zone; +SET TIMESTAMP=DEFAULT; drop event if exists new_event; CREATE EVENT new_event ON SCHEDULE EVERY 0 SECOND DO SELECT 1; ERROR HY000: INTERVAL is either not positive or too big @@ -756,6 +757,45 @@ 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 DROP DATABASE event_test1; DROP DATABASE event_test12; +# +# Bug#12546938 (formerly known as bug#61005): +# CREATE IF NOT EXIST EVENT WILL CREATE MULTIPLE RUNNING EVENTS +# +USE events_test; +SET GLOBAL event_scheduler = ON; +DROP TABLE IF EXISTS table_bug12546938; +DROP EVENT IF EXISTS event_Bug12546938; +CREATE TABLE table_bug12546938 (i INT); +# Create an event which will be executed with a small delay +# and won't be automatically dropped after that. +CREATE EVENT event_Bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN +INSERT INTO table_bug12546938 VALUES(1); +END +| +# Now try to create the same event using CREATE EVENT IF NOT EXISTS. +# A warning should be emitted. A new event should not be created nor +# the old event should be re-executed. +CREATE EVENT IF NOT EXISTS event_bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN +INSERT INTO table_bug12546938 VALUES (1); +END +| +Warnings: +Note 1537 Event 'event_bug12546938' already exists +# Wait until at least one instance of event is executed. +# Check that only one instance of our event was executed. +SELECT COUNT(*) FROM table_bug12546938; +COUNT(*) +1 +# Clean-up. +DROP EVENT IF EXISTS event_Bug12546938; +DROP TABLE table_bug12546938; +SET GLOBAL EVENT_SCHEDULER = OFF; 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-03-28 15:38:16 +0000 +++ b/mysql-test/t/events_bugs.test 2011-05-27 11:42:28 +0000 @@ -857,6 +857,7 @@ DROP EVENT e2; DROP EVENT e1; SET TIME_ZONE=@save_time_zone; +SET TIMESTAMP=DEFAULT; # # START - BUG#28666 CREATE EVENT ... EVERY 0 SECOND let server crash @@ -1235,6 +1236,55 @@ SHOW EVENTS; DROP DATABASE event_test1; DROP DATABASE event_test12; +--echo # +--echo # Bug#12546938 (formerly known as bug#61005): +--echo # CREATE IF NOT EXIST EVENT WILL CREATE MULTIPLE RUNNING EVENTS +--echo # +USE events_test; +SET GLOBAL event_scheduler = ON; + +--disable_warnings +DROP TABLE IF EXISTS table_bug12546938; +DROP EVENT IF EXISTS event_Bug12546938; +--enable_warnings +CREATE TABLE table_bug12546938 (i INT); + +delimiter |; + +--echo # Create an event which will be executed with a small delay +--echo # and won't be automatically dropped after that. +CREATE EVENT event_Bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN + INSERT INTO table_bug12546938 VALUES(1); +END +| + +--echo # Now try to create the same event using CREATE EVENT IF NOT EXISTS. +--echo # A warning should be emitted. A new event should not be created nor +--echo # the old event should be re-executed. +CREATE EVENT IF NOT EXISTS event_bug12546938 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND ON COMPLETION PRESERVE +ENABLE DO +BEGIN + INSERT INTO table_bug12546938 VALUES (1); +END +| + +delimiter ;| + +--echo # Wait until at least one instance of event is executed. +let $wait_condition= SELECT COUNT(*) FROM table_bug12546938; +--source include/wait_condition.inc + +--echo # Check that only one instance of our event was executed. +SELECT COUNT(*) FROM table_bug12546938; + +--echo # Clean-up. +DROP EVENT IF EXISTS event_Bug12546938; +DROP TABLE table_bug12546938; +SET GLOBAL EVENT_SCHEDULER = OFF; ########################################################################### # === modified file 'sql/event_db_repository.cc' --- a/sql/event_db_repository.cc 2011-05-04 13:22:38 +0000 +++ b/sql/event_db_repository.cc 2011-05-27 11:42:28 +0000 @@ -620,18 +620,21 @@ Event_db_repository::open_event_table(TH only creates a record on disk. @pre The thread handle has no open tables. - @param[in,out] thd THD - @param[in] parse_data Parsed event definition - @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided - to CREATE EVENT statement - + @param[in,out] thd THD + @param[in] parse_data Parsed event definition + @param[in] create_if_not TRUE if IF NOT EXISTS clause was provided + to CREATE EVENT statement + @param[out] event_already_exists When method is completed successfully + set to true if event already exists else + set to false @retval FALSE success @retval TRUE error */ bool Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data, - my_bool create_if_not) + bool create_if_not, + bool *event_already_exists) { int ret= 1; TABLE *table= NULL; @@ -663,6 +666,7 @@ Event_db_repository::create_event(THD *t { if (create_if_not) { + *event_already_exists= true; push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_EVENT_ALREADY_EXISTS, ER(ER_EVENT_ALREADY_EXISTS), parse_data->name.str); @@ -670,8 +674,10 @@ Event_db_repository::create_event(THD *t } else my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), parse_data->name.str); + goto end; - } + } else + *event_already_exists= false; DBUG_PRINT("info", ("non-existent, go forward")); === modified file 'sql/event_db_repository.h' --- a/sql/event_db_repository.h 2010-11-11 17:11:05 +0000 +++ b/sql/event_db_repository.h 2011-05-27 11:42:28 +0000 @@ -73,7 +73,8 @@ public: Event_db_repository(){} bool - create_event(THD *thd, Event_parse_data *parse_data, my_bool create_if_not); + create_event(THD *thd, Event_parse_data *parse_data, bool create_if_not, + bool *event_already_exists); bool update_event(THD *thd, Event_parse_data *parse_data, LEX_STRING *new_dbname, === modified file 'sql/events.cc' --- a/sql/events.cc 2011-05-21 08:21:08 +0000 +++ b/sql/events.cc 2011-05-27 11:42:28 +0000 @@ -284,6 +284,7 @@ create_query_string(THD *thd, String *bu return 0; } + /** Create a new event. @@ -304,8 +305,8 @@ bool Events::create_event(THD *thd, Event_parse_data *parse_data, bool if_not_exists) { - int ret; - bool save_binlog_row_based; + bool ret; + bool save_binlog_row_based, event_already_exists; DBUG_ENTER("Events::create_event"); if (check_if_system_tables_error()) @@ -345,28 +346,32 @@ Events::create_event(THD *thd, Event_par DBUG_RETURN(TRUE); /* On error conditions my_error() is called so no need to handle here */ - if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists))) + if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists, + &event_already_exists))) { Event_queue_element *new_element; bool dropped= 0; - if (!(new_element= new Event_queue_element())) - ret= TRUE; // OOM - else if ((ret= db_repository->load_named_event(thd, parse_data->dbname, - parse_data->name, - new_element))) + if (!event_already_exists) { - if (!db_repository->drop_event(thd, parse_data->dbname, parse_data->name, - TRUE)) - dropped= 1; - delete new_element; - } - else - { - /* TODO: do not ignore the out parameter and a possible OOM error! */ - bool created; - if (event_queue) - event_queue->create_event(thd, new_element, &created); + if (!(new_element= new Event_queue_element())) + ret= TRUE; // OOM + else if ((ret= db_repository->load_named_event(thd, parse_data->dbname, + parse_data->name, + new_element))) + { + if (!db_repository->drop_event(thd, parse_data->dbname, parse_data->name, + TRUE)) + dropped= 1; + delete new_element; + } + else + { + /* TODO: do not ignore the out parameter and a possible OOM error! */ + bool created; + if (event_queue) + event_queue->create_event(thd, new_element, &created); + } } /* binlog the create event unless it's been successfully dropped @@ -380,14 +385,14 @@ Events::create_event(THD *thd, Event_par { sql_print_error("Event Error: An error occurred while creating query string, " "before writing it into binary log."); - ret= TRUE; + ret= true; } else - { - /* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER - will be written into the binary log as the definer for the SQL thread. */ + /* + If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER + will be written into the binary log as the definer for the SQL thread. + */ ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length()); - } } } /* Restore the state of binlog format */ --===============5975689290668242788== 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\ # vx1bqttx302xs2dk # target_branch: file:///Users/shulga/projects/mysql/mysql-5.5/ # testament_sha1: 2687523ec32ac6c0fffe0d7a33c5620a20a911fa # timestamp: 2011-05-27 18:44:39 +0700 # source_branch: file:///Users/shulga/projects/mysql/mysql-5.1-\ # bug11749345/ # base_revision_id: tatjana.nuernberg@stripped\ # ocwi9edbdrlujdwc # # Begin bundle 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 tQ== --===============5975689290668242788==--