From: Dmitry Shulga Date: May 23 2011 3:16pm Subject: bzr commit into mysql-5.1 branch (Dmitry.Shulga:3622) Bug#12546938 List-Archive: http://lists.mysql.com/commits/137875 X-Bug: 12546938 Message-Id: <201105231516.p4NFGQgK017948@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4108283742054966861==" --===============4108283742054966861== 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-bug12546938/ based on revid:vinay.fisrekar@stripped 3622 Dmitry Shulga 2011-05-23 Fixed bug#12546938 (formerly known as 61005) - CREATE IF NOT EXIST EVENT will create multiple running events. A CREATE IF NOT EXIST on an event that currently exists and is enabled will cause multiple instances of the event to run. Disabling the event does not help. If the event is dropped, the event stops running, but when created again, multile instances of the event are still running. The only way to get out of this situation is to restart the server. The probles was that Event_db_repository::create_event() didn' return information that permits discriminate between situation when event wasn't exist and when made attempt to create existed event with keyword IF NOT EXIST. In last case the call to method Event_db_repository::create_event() returned OK and information about event inserted to queue for executions. So after statement's execution is finished there is two event objects corresponding the event that waiting for exectuion. The solutuon is to add flag into Event_db_repository::create_event() definition that signals that event isn't created because event already exist and IF NOT EXISTS clause is specified. @ sql/event_db_repository.cc Event_db_repository::create_event was modified: set new added argument event_already_exists in true value if event wasn't created because event already exist and IF NOT EXIST clause was set. @ sql/event_db_repository.h Added OUT argument 'event_already_exists' into create_event() method. @ sql/events.cc Events::create_event was modified: insert new element into event queue only if event was actually created. modified: sql/event_db_repository.cc sql/event_db_repository.h sql/events.cc === modified file 'sql/event_db_repository.cc' --- a/sql/event_db_repository.cc 2011-05-04 12:59:24 +0000 +++ b/sql/event_db_repository.cc 2011-05-23 15:16:04 +0000 @@ -615,7 +615,8 @@ Event_db_repository::open_event_table(TH 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; @@ -648,8 +649,11 @@ Event_db_repository::create_event(THD *t } else my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), parse_data->name.str); + + *event_already_exists= true; 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 2007-08-15 15:08:44 +0000 +++ b/sql/event_db_repository.h 2011-05-23 15:16:04 +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 2010-03-28 08:37:47 +0000 +++ b/sql/events.cc 2011-05-23 15:16:04 +0000 @@ -370,6 +370,7 @@ create_query_string(THD *thd, String *bu return 0; } + /** Create a new event. @@ -391,7 +392,7 @@ Events::create_event(THD *thd, Event_par bool if_not_exists) { int ret; - bool save_binlog_row_based; + bool save_binlog_row_based, event_already_exists; DBUG_ENTER("Events::create_event"); /* @@ -440,7 +441,8 @@ Events::create_event(THD *thd, Event_par pthread_mutex_lock(&LOCK_event_metadata); /* 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; @@ -460,8 +462,12 @@ Events::create_event(THD *thd, Event_par { /* TODO: do not ignore the out parameter and a possible OOM error! */ bool created; - if (event_queue) + + if (event_queue && !event_already_exists || + (event_already_exists && !if_not_exists)) event_queue->create_event(thd, new_element, &created); + else + delete new_element; } /* binlog the create event unless it's been successfully dropped @@ -472,16 +478,14 @@ Events::create_event(THD *thd, Event_par DBUG_ASSERT(thd->query() && thd->query_length()); String log_query; if (create_query_string(thd, &log_query)) - { sql_print_error("Event Error: An error occurred while creating query string, " "before writing it into binary log."); - /* Restore the state of binlog format */ - thd->current_stmt_binlog_row_based= save_binlog_row_based; - DBUG_RETURN(TRUE); - } - /* 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()); + 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. + */ + ret= write_bin_log(thd, TRUE, log_query.c_ptr(), log_query.length()); } } pthread_mutex_unlock(&LOCK_event_metadata); --===============4108283742054966861== 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\ # h9skbeoia9axgme5 # target_branch: file:///Users/shulga/projects/mysql/mysql-5.1-\ # bug12546938/ # testament_sha1: 06e12e833eceb6326121c3b6e8992a4600264e15 # timestamp: 2011-05-23 22:16:20 +0700 # base_revision_id: vinay.fisrekar@stripped\ # 9178kabh4c7y6n92 # # Begin bundle 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 KEg2spY9gA== --===============4108283742054966861==--