From: Dmitry Shulga Date: May 27 2011 12:06pm Subject: bzr push into mysql-trunk branch (Dmitry.Shulga:3122 to 3123) Bug#12546938 List-Archive: http://lists.mysql.com/commits/138324 X-Bug: 12546938 Message-Id: <201105271206.p4RC6uee005654@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8275406144014965718==" --===============8275406144014965718== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3123 Dmitry Shulga 2011-05-27 [merge] Auto-merge of patch for bug#12546938 from mysql-5.5->mysql-trunk. 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 3122 Tor Didriksen 2011-05-26 Bug#11765003 - 57912 Use memset() rather than the deprecated bfill() and bzero() @ support-files/build-tags Extend filter to tag .cpp files as well. modified: client/completion_hash.cc client/mysql.cc client/mysql_upgrade.c client/mysqlbinlog.cc client/mysqldump.c client/mysqlslap.c client/mysqltest.cc client/sql_string.cc cmake/os/WindowsCache.cmake config.h.cmake configure.cmake dbug/dbug.c extra/comp_err.c extra/replace.c include/hash.h include/m_string.h include/myisampack.h libmysql/libmysql.c libmysqld/lib_sql.cc mysys/array.c mysys/charset.c mysys/default.c mysys/lf_dynarray.c mysys/mf_iocache.c mysys/mf_keycache.c mysys/mf_radix.c mysys/my_aes.c mysys/my_alloc.c mysys/my_bitmap.c mysys/my_chsize.c mysys/my_file.c mysys/my_gethwaddr.c mysys/my_init.c mysys/my_lib.c mysys/my_malloc.c mysys/my_once.c mysys/my_wincond.c mysys/my_windac.c mysys/sha1.c mysys/testhash.c mysys/thr_alarm.c mysys/thr_lock.c mysys/thr_mutex.c mysys/tree.c mysys/waiting_threads.c regex/regexp.c regex/reginit.c sql-common/client.c sql-common/client_plugin.c sql-common/my_time.c sql/binlog.cc sql/debug_sync.cc sql/des_key_file.cc sql/event_data_objects.cc sql/field.cc sql/field.h sql/field_conv.cc sql/filesort.cc sql/gcalc_tools.h sql/ha_ndbcluster.cc sql/ha_ndbcluster_binlog.cc sql/ha_partition.cc sql/handler.cc sql/hash_filo.h sql/item.cc sql/item.h sql/item_cmpfunc.h sql/item_inetfunc.cc sql/item_strfunc.cc sql/item_sum.cc sql/item_timefunc.cc sql/item_xmlfunc.cc sql/key.cc sql/log.cc sql/log_event.cc sql/mysqld.cc sql/opt_range.cc sql/partition_info.cc sql/password.c sql/protocol.cc sql/records.cc sql/rpl_info_file.cc sql/rpl_master.cc sql/rpl_rli.cc sql/rpl_utility.cc sql/rpl_utility.h sql/set_var.cc sql/sp.cc sql/sp_head.cc sql/sql_acl.cc sql/sql_alter.cc sql/sql_analyse.cc sql/sql_audit.cc sql/sql_base.cc sql/sql_cache.cc sql/sql_class.cc sql/sql_class.h sql/sql_connect.cc sql/sql_db.cc sql/sql_delete.cc sql/sql_error.cc sql/sql_insert.cc sql/sql_join_cache.cc sql/sql_lex.cc sql/sql_list.h sql/sql_load.cc sql/sql_parse.cc sql/sql_partition_admin.cc sql/sql_plugin.cc sql/sql_prepare.cc sql/sql_select.cc sql/sql_select.h sql/sql_show.cc sql/sql_string.cc sql/sql_table.cc sql/sql_trigger.cc sql/sql_trigger.h sql/sql_udf.cc sql/sql_union.cc sql/sql_update.cc sql/sql_view.cc sql/sql_yacc.yy sql/table.cc sql/table.h sql/thr_malloc.cc sql/tztime.cc sql/udf_example.c sql/unireg.cc sql/unireg.h storage/blackhole/ha_blackhole.cc storage/federated/ha_federated.cc storage/heap/ha_heap.cc storage/heap/hp_create.c storage/heap/hp_hash.c storage/heap/hp_test1.c storage/heap/hp_test2.c storage/innobase/handler/ha_innodb.cc storage/myisam/ft_boolean_search.c storage/myisam/ft_nlq_search.c storage/myisam/ft_update.c storage/myisam/ha_myisam.cc storage/myisam/mi_cache.c storage/myisam/mi_check.c storage/myisam/mi_create.c storage/myisam/mi_dynrec.c storage/myisam/mi_key.c storage/myisam/mi_log.c storage/myisam/mi_open.c storage/myisam/mi_packrec.c storage/myisam/mi_rkey.c storage/myisam/mi_statrec.c storage/myisam/mi_test1.c storage/myisam/mi_test2.c storage/myisam/mi_test3.c storage/myisam/myisamchk.c storage/myisam/myisamlog.c storage/myisam/myisampack.c storage/myisam/rt_test.c storage/myisam/sort.c storage/myisam/sp_key.c storage/myisam/sp_test.c storage/myisammrg/ha_myisammrg.cc storage/myisammrg/myrg_open.c storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp storage/ndb/src/kernel/blocks/tsman.cpp storage/ndb/src/kernel/vm/RWPool.cpp storage/ndb/src/kernel/vm/WOPool.cpp storage/ndb/src/kernel/vm/bench_pool.cpp storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp storage/ndb/src/mgmsrv/InitConfigFileParser.cpp storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp storage/ndb/test/ndbapi/testNodeRestart.cpp storage/ndb/test/run-test/setup.cpp storage/ndb/test/src/DbUtil.cpp strings/conf_to_src.c strings/ctype-czech.c strings/ctype-mb.c strings/ctype-simple.c strings/ctype-uca.c strings/ctype-win1250ch.c strings/ctype.c strings/decimal.c strings/dump_map.c strings/my_vsnprintf.c strings/uca-dump.c strings/uctypedump.c strings/xml.c support-files/build-tags tests/mysql_client_test.c unittest/mysys/waiting_threads-t.c vio/vio.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:49:13 +0000 +++ b/sql/event_db_repository.cc 2011-05-27 11:50:52 +0000 @@ -621,18 +621,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; @@ -664,6 +667,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); @@ -671,8 +675,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-18 16:34:56 +0000 +++ b/sql/event_db_repository.h 2011-05-27 11:50:52 +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:25:33 +0000 +++ b/sql/events.cc 2011-05-27 11:50:52 +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 */ --===============8275406144014965718== 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\ # f7p1tv8qyrgo11m8 # target_branch: file:///Users/shulga/projects/mysql/mysql-trunk/ # testament_sha1: 61c9e6a352c91db149262d8607845c339ce81c57 # timestamp: 2011-05-27 19:06:52 +0700 # source_branch: file:///Users/shulga/projects/mysql/mysql-5.5/ # base_revision_id: tor.didriksen@stripped\ # mdn9u03pruj0mf2z # # Begin bundle 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 8g== --===============8275406144014965718==--