Loading mysql-test/r/events.result +20 −65 Original line number Diff line number Diff line Loading @@ -6,9 +6,29 @@ Note 1305 Event event1 does not exist create event event1 on schedule every 15 minute starts now() ends date_add(now(), interval 5 hour) DO begin end; alter event event1 rename to event2; alter event event2 disabled; alter event event2 on completion not preserve; alter event event2 on schedule every 1 year on completion preserve rename to event3 comment "new comment" do begin select 1; end__ alter event event3 rename to event2; drop event event2; create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end; drop event event2; create event e_43 on schedule every 1 second do set @a = 5; set global event_scheduler = 1; select sleep(2); sleep(2) 0 alter event e_43 do alter event e_43 do set @a = 4; select sleep(3); sleep(3) 0 select db, name, body, status, interval_field, interval_value from mysql.event; db name body status interval_field interval_value events_test e_43 set @a = 4 ENABLED SECOND 1 drop event e_43; select sleep(1); sleep(1) 0 set global event_scheduler = 0; create table t_event3 (a int, b float); drop event if exists event3; Warnings: Loading @@ -27,69 +47,4 @@ set event_scheduler=0; ERROR HY000: Variable 'event_scheduler' is a GLOBAL variable and should be set with SET GLOBAL set global event_scheduler=2; ERROR 42000: Variable 'event_scheduler' can't be set to the value of '2' set global event_scheduler=0; select count(*) from mysql.event; count(*) 0 select get_lock("test_lock1", 20); get_lock("test_lock1", 20) 1 create event закачка on schedule every 10 hour do select get_lock("test_lock1", 20); select count(*) from mysql.event; count(*) 1 select release_lock("test_lock1"); release_lock("test_lock1") 1 drop event закачка; select count(*) from mysql.event; count(*) 0 set global event_scheduler=1; select get_lock("test_lock2", 20); get_lock("test_lock2", 20) 1 create event закачка on schedule every 10 hour do select get_lock("test_lock2", 20); select sleep(2); sleep(2) 0 select release_lock("test_lock2"); release_lock("test_lock2") 1 drop event закачка; set global event_scheduler=1; select get_lock("test_lock2_1", 20); get_lock("test_lock2_1", 20) 1 create event закачка21 on schedule every 10 hour do select get_lock("test_lock2_1", 20); select sleep(2); sleep(2) 0 set global event_scheduler=0; select sleep(2); sleep(2) 0 select release_lock("test_lock2_1"); release_lock("test_lock2_1") 1 select sleep(2); sleep(2) 0 drop event закачка21; set global event_scheduler=1; select get_lock("test_lock3", 20); get_lock("test_lock3", 20) 1 create event закачка on schedule every 10 hour do select get_lock("test_lock3", 20); select sleep(2); sleep(2) 0 drop event закачка; select release_lock("test_lock3"); release_lock("test_lock3") 1 set global event_scheduler=0; select sleep(2); sleep(2) 0 drop database events_test; mysql-test/t/disabled.def +0 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ subselect : Bug#15706 ps_7ndb : dbug assert in RBR mode when executing test suite rpl_ddl : Bug#15963 SBR does not show "Definer" correctly partition_03ndb : Bug#16385 events : Affects flush test case. A table lock not released somewhere ndb_binlog_basic : Results are not deterministic, Tomas will fix rpl_ndb_basic : Bug#16228 rpl_sp : Bug #16456 Loading mysql-test/t/events.test +68 −53 Original line number Diff line number Diff line Loading @@ -4,11 +4,26 @@ drop event if exists event1; create event event1 on schedule every 15 minute starts now() ends date_add(now(), interval 5 hour) DO begin end; alter event event1 rename to event2; alter event event2 disabled; alter event event2 on completion not preserve; delimiter __; alter event event2 on schedule every 1 year on completion preserve rename to event3 comment "new comment" do begin select 1; end__ delimiter ;__ alter event event3 rename to event2; drop event event2; create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end; drop event event2; create event e_43 on schedule every 1 second do set @a = 5; set global event_scheduler = 1; select sleep(2); alter event e_43 do alter event e_43 do set @a = 4; select sleep(3); select db, name, body, status, interval_field, interval_value from mysql.event; drop event e_43; select sleep(1); set global event_scheduler = 0; create table t_event3 (a int, b float); drop event if exists event3; create event event3 on schedule every 50 + 10 minute starts date_add("20010101", interval 5 minute) ends date_add("20151010", interval 5 day) comment "portokala_comment" DO insert into t_event3 values (unix_timestamp(), rand()); Loading @@ -28,67 +43,67 @@ set event_scheduler=0; --error 1231 set global event_scheduler=2; set global event_scheduler=0; select count(*) from mysql.event; select get_lock("test_lock1", 20); create event закачка on schedule every 10 hour do select get_lock("test_lock1", 20); select count(*) from mysql.event; #show processlist; select release_lock("test_lock1"); drop event закачка; select count(*) from mysql.event; set global event_scheduler=1; select get_lock("test_lock2", 20); create event закачка on schedule every 10 hour do select get_lock("test_lock2", 20); select sleep(2); #show processlist; select release_lock("test_lock2"); drop event закачка; #set global event_scheduler=0; #select count(*) from mysql.event; #select get_lock("test_lock1", 20); #create event закачка on schedule every 10 hour do select get_lock("test_lock1", 20); #select count(*) from mysql.event; ##show processlist; #select release_lock("test_lock1"); #drop event закачка; #select count(*) from mysql.event; # # 1. get a lock # 2. create an event # 3. sleep so it has time to start # 4. should appear in processlist # 5. kill the scheduler, it will wait for the child to stop # 6. both processes should be there on show processlist # 7. release the lock and sleep, both scheduler and child should end set global event_scheduler=1; select get_lock("test_lock2_1", 20); create event закачка21 on schedule every 10 hour do select get_lock("test_lock2_1", 20); select sleep(2); #show processlist; set global event_scheduler=0; select sleep(2); #set global event_scheduler=1; #select get_lock("test_lock2", 20); #create event закачка on schedule every 10 hour do select get_lock("test_lock2", 20); #select sleep(2); #show processlist; select release_lock("test_lock2_1"); select sleep(2); #show processlist; drop event закачка21; #select release_lock("test_lock2"); #drop event закачка; set global event_scheduler=1; select get_lock("test_lock3", 20); create event закачка on schedule every 10 hour do select get_lock("test_lock3", 20); select sleep(2); ## ## 1. get a lock ## 2. create an event ## 3. sleep so it has time to start ## 4. should appear in processlist ## 5. kill the scheduler, it will wait for the child to stop ## 6. both processes should be there on show processlist ## 7. release the lock and sleep, both scheduler and child should end #set global event_scheduler=1; #select get_lock("test_lock2_1", 20); #create event закачка21 on schedule every 10 hour do select get_lock("test_lock2_1", 20); #select sleep(2); ##show processlist; #set global event_scheduler=0; #select sleep(2); ##show processlist; #select release_lock("test_lock2_1"); #select sleep(2); ##show processlist; #drop event закачка21; #set global event_scheduler=1; #select get_lock("test_lock3", 20); #create event закачка on schedule every 10 hour do select get_lock("test_lock3", 20); #select sleep(2); #show processlist; drop event закачка; select release_lock("test_lock3"); #drop event закачка; #select release_lock("test_lock3"); # # test with very often occuring event # (disabled for now, locks) #select get_lock("test_lock4", 20); #create event закачка4 on schedule every 1 second do select get_lock("test_lock4", 20); #select sleep(3); #show processlist; #drop event закачка4; #select release_lock("test_lock4"); ##select get_lock("test_lock4", 20); ##create event закачка4 on schedule every 1 second do select get_lock("test_lock4", 20); ##select sleep(3); ##show processlist; ##drop event закачка4; ##select release_lock("test_lock4"); set global event_scheduler=0; select sleep(2); #show processlist; #the following locks for some reason and is a bug, commented for now #select count(*) from mysql.event; #set global event_scheduler=0; #select sleep(2); ##show processlist; ##the following locks for some reason and is a bug, commented for now ##select count(*) from mysql.event; drop database events_test; sql/event.cc +12 −6 Original line number Diff line number Diff line Loading @@ -237,8 +237,9 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update) DBUG_RETURN(EVEX_GET_FIELD_FAILED); } DBUG_PRINT("info", ("dbname.len=%d",et->dbname.length)); DBUG_PRINT("info", ("name.len=%d",et->name.length)); DBUG_PRINT("info", ("dbname.len=[%s]",et->dbname.str)); DBUG_PRINT("info", ("name.len=[%s]",et->name.str)); DBUG_PRINT("info", ("body=[%s]",et->body.str)); if (table->field[field_num= EVEX_FIELD_DB]-> store(et->dbname.str, et->dbname.length, system_charset_info)) Loading Loading @@ -674,7 +675,8 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock) static int evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock) evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock, bool is_drop) { uint i; Loading @@ -697,14 +699,18 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock) { if (!et->is_running()) { DBUG_PRINT("evex_remove_from_cache", ("not running - free and delete")); et->free_sp(); delete et; } else { DBUG_PRINT("evex_remove_from_cache", ("running.defer mem free. is_drop=%d", is_drop)); et->flags|= EVENT_EXEC_NO_MORE; et->dropped= true; et->dropped= is_drop; } DBUG_PRINT("evex_remove_from_cache", ("delete from queue")); evex_queue_delete_element(&EVEX_EQ_NAME, i); // ok, we have cleaned goto done; Loading Loading @@ -805,7 +811,7 @@ evex_update_event(THD *thd, event_timed *et, sp_name *new_name, UNLOCK_MUTEX_AND_BAIL_OUT(LOCK_evex_running, done); VOID(pthread_mutex_lock(&LOCK_event_arrays)); evex_remove_from_cache(&et->dbname, &et->name, false); evex_remove_from_cache(&et->dbname, &et->name, false, false); if (et->status == MYSQL_EVENT_ENABLED) { if (new_name) Loading Loading @@ -874,7 +880,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists, VOID(pthread_mutex_lock(&LOCK_evex_running)); if (evex_is_running) ret= evex_remove_from_cache(&et->dbname, &et->name, true); ret= evex_remove_from_cache(&et->dbname, &et->name, true, true); VOID(pthread_mutex_unlock(&LOCK_evex_running)); done: Loading sql/event_executor.cc +6 −0 Original line number Diff line number Diff line Loading @@ -492,12 +492,18 @@ event_executor_worker(void *event_void) sql_print_information(" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d", event->dbname.str, event->name.str, (int) event->expression, ret); if (ret == EVEX_COMPILE_ERROR) sql_print_information(" EVEX COMPILE ERROR for event %s.%s", event->dbname.str, event->name.str); DBUG_PRINT("info", (" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d", event->dbname.str, event->name.str, (int) event->expression, ret)); } if ((event->flags & EVENT_EXEC_NO_MORE) || event->status==MYSQL_EVENT_DISABLED) { DBUG_PRINT("event_executor_worker", ("%s exec no more. to drop=%d",event->name.str, event->dropped)); if (event->dropped) event->drop(thd); delete event; Loading Loading
mysql-test/r/events.result +20 −65 Original line number Diff line number Diff line Loading @@ -6,9 +6,29 @@ Note 1305 Event event1 does not exist create event event1 on schedule every 15 minute starts now() ends date_add(now(), interval 5 hour) DO begin end; alter event event1 rename to event2; alter event event2 disabled; alter event event2 on completion not preserve; alter event event2 on schedule every 1 year on completion preserve rename to event3 comment "new comment" do begin select 1; end__ alter event event3 rename to event2; drop event event2; create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end; drop event event2; create event e_43 on schedule every 1 second do set @a = 5; set global event_scheduler = 1; select sleep(2); sleep(2) 0 alter event e_43 do alter event e_43 do set @a = 4; select sleep(3); sleep(3) 0 select db, name, body, status, interval_field, interval_value from mysql.event; db name body status interval_field interval_value events_test e_43 set @a = 4 ENABLED SECOND 1 drop event e_43; select sleep(1); sleep(1) 0 set global event_scheduler = 0; create table t_event3 (a int, b float); drop event if exists event3; Warnings: Loading @@ -27,69 +47,4 @@ set event_scheduler=0; ERROR HY000: Variable 'event_scheduler' is a GLOBAL variable and should be set with SET GLOBAL set global event_scheduler=2; ERROR 42000: Variable 'event_scheduler' can't be set to the value of '2' set global event_scheduler=0; select count(*) from mysql.event; count(*) 0 select get_lock("test_lock1", 20); get_lock("test_lock1", 20) 1 create event закачка on schedule every 10 hour do select get_lock("test_lock1", 20); select count(*) from mysql.event; count(*) 1 select release_lock("test_lock1"); release_lock("test_lock1") 1 drop event закачка; select count(*) from mysql.event; count(*) 0 set global event_scheduler=1; select get_lock("test_lock2", 20); get_lock("test_lock2", 20) 1 create event закачка on schedule every 10 hour do select get_lock("test_lock2", 20); select sleep(2); sleep(2) 0 select release_lock("test_lock2"); release_lock("test_lock2") 1 drop event закачка; set global event_scheduler=1; select get_lock("test_lock2_1", 20); get_lock("test_lock2_1", 20) 1 create event закачка21 on schedule every 10 hour do select get_lock("test_lock2_1", 20); select sleep(2); sleep(2) 0 set global event_scheduler=0; select sleep(2); sleep(2) 0 select release_lock("test_lock2_1"); release_lock("test_lock2_1") 1 select sleep(2); sleep(2) 0 drop event закачка21; set global event_scheduler=1; select get_lock("test_lock3", 20); get_lock("test_lock3", 20) 1 create event закачка on schedule every 10 hour do select get_lock("test_lock3", 20); select sleep(2); sleep(2) 0 drop event закачка; select release_lock("test_lock3"); release_lock("test_lock3") 1 set global event_scheduler=0; select sleep(2); sleep(2) 0 drop database events_test;
mysql-test/t/disabled.def +0 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ subselect : Bug#15706 ps_7ndb : dbug assert in RBR mode when executing test suite rpl_ddl : Bug#15963 SBR does not show "Definer" correctly partition_03ndb : Bug#16385 events : Affects flush test case. A table lock not released somewhere ndb_binlog_basic : Results are not deterministic, Tomas will fix rpl_ndb_basic : Bug#16228 rpl_sp : Bug #16456 Loading
mysql-test/t/events.test +68 −53 Original line number Diff line number Diff line Loading @@ -4,11 +4,26 @@ drop event if exists event1; create event event1 on schedule every 15 minute starts now() ends date_add(now(), interval 5 hour) DO begin end; alter event event1 rename to event2; alter event event2 disabled; alter event event2 on completion not preserve; delimiter __; alter event event2 on schedule every 1 year on completion preserve rename to event3 comment "new comment" do begin select 1; end__ delimiter ;__ alter event event3 rename to event2; drop event event2; create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end; drop event event2; create event e_43 on schedule every 1 second do set @a = 5; set global event_scheduler = 1; select sleep(2); alter event e_43 do alter event e_43 do set @a = 4; select sleep(3); select db, name, body, status, interval_field, interval_value from mysql.event; drop event e_43; select sleep(1); set global event_scheduler = 0; create table t_event3 (a int, b float); drop event if exists event3; create event event3 on schedule every 50 + 10 minute starts date_add("20010101", interval 5 minute) ends date_add("20151010", interval 5 day) comment "portokala_comment" DO insert into t_event3 values (unix_timestamp(), rand()); Loading @@ -28,67 +43,67 @@ set event_scheduler=0; --error 1231 set global event_scheduler=2; set global event_scheduler=0; select count(*) from mysql.event; select get_lock("test_lock1", 20); create event закачка on schedule every 10 hour do select get_lock("test_lock1", 20); select count(*) from mysql.event; #show processlist; select release_lock("test_lock1"); drop event закачка; select count(*) from mysql.event; set global event_scheduler=1; select get_lock("test_lock2", 20); create event закачка on schedule every 10 hour do select get_lock("test_lock2", 20); select sleep(2); #show processlist; select release_lock("test_lock2"); drop event закачка; #set global event_scheduler=0; #select count(*) from mysql.event; #select get_lock("test_lock1", 20); #create event закачка on schedule every 10 hour do select get_lock("test_lock1", 20); #select count(*) from mysql.event; ##show processlist; #select release_lock("test_lock1"); #drop event закачка; #select count(*) from mysql.event; # # 1. get a lock # 2. create an event # 3. sleep so it has time to start # 4. should appear in processlist # 5. kill the scheduler, it will wait for the child to stop # 6. both processes should be there on show processlist # 7. release the lock and sleep, both scheduler and child should end set global event_scheduler=1; select get_lock("test_lock2_1", 20); create event закачка21 on schedule every 10 hour do select get_lock("test_lock2_1", 20); select sleep(2); #show processlist; set global event_scheduler=0; select sleep(2); #set global event_scheduler=1; #select get_lock("test_lock2", 20); #create event закачка on schedule every 10 hour do select get_lock("test_lock2", 20); #select sleep(2); #show processlist; select release_lock("test_lock2_1"); select sleep(2); #show processlist; drop event закачка21; #select release_lock("test_lock2"); #drop event закачка; set global event_scheduler=1; select get_lock("test_lock3", 20); create event закачка on schedule every 10 hour do select get_lock("test_lock3", 20); select sleep(2); ## ## 1. get a lock ## 2. create an event ## 3. sleep so it has time to start ## 4. should appear in processlist ## 5. kill the scheduler, it will wait for the child to stop ## 6. both processes should be there on show processlist ## 7. release the lock and sleep, both scheduler and child should end #set global event_scheduler=1; #select get_lock("test_lock2_1", 20); #create event закачка21 on schedule every 10 hour do select get_lock("test_lock2_1", 20); #select sleep(2); ##show processlist; #set global event_scheduler=0; #select sleep(2); ##show processlist; #select release_lock("test_lock2_1"); #select sleep(2); ##show processlist; #drop event закачка21; #set global event_scheduler=1; #select get_lock("test_lock3", 20); #create event закачка on schedule every 10 hour do select get_lock("test_lock3", 20); #select sleep(2); #show processlist; drop event закачка; select release_lock("test_lock3"); #drop event закачка; #select release_lock("test_lock3"); # # test with very often occuring event # (disabled for now, locks) #select get_lock("test_lock4", 20); #create event закачка4 on schedule every 1 second do select get_lock("test_lock4", 20); #select sleep(3); #show processlist; #drop event закачка4; #select release_lock("test_lock4"); ##select get_lock("test_lock4", 20); ##create event закачка4 on schedule every 1 second do select get_lock("test_lock4", 20); ##select sleep(3); ##show processlist; ##drop event закачка4; ##select release_lock("test_lock4"); set global event_scheduler=0; select sleep(2); #show processlist; #the following locks for some reason and is a bug, commented for now #select count(*) from mysql.event; #set global event_scheduler=0; #select sleep(2); ##show processlist; ##the following locks for some reason and is a bug, commented for now ##select count(*) from mysql.event; drop database events_test;
sql/event.cc +12 −6 Original line number Diff line number Diff line Loading @@ -237,8 +237,9 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update) DBUG_RETURN(EVEX_GET_FIELD_FAILED); } DBUG_PRINT("info", ("dbname.len=%d",et->dbname.length)); DBUG_PRINT("info", ("name.len=%d",et->name.length)); DBUG_PRINT("info", ("dbname.len=[%s]",et->dbname.str)); DBUG_PRINT("info", ("name.len=[%s]",et->name.str)); DBUG_PRINT("info", ("body=[%s]",et->body.str)); if (table->field[field_num= EVEX_FIELD_DB]-> store(et->dbname.str, et->dbname.length, system_charset_info)) Loading Loading @@ -674,7 +675,8 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock) static int evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock) evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock, bool is_drop) { uint i; Loading @@ -697,14 +699,18 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock) { if (!et->is_running()) { DBUG_PRINT("evex_remove_from_cache", ("not running - free and delete")); et->free_sp(); delete et; } else { DBUG_PRINT("evex_remove_from_cache", ("running.defer mem free. is_drop=%d", is_drop)); et->flags|= EVENT_EXEC_NO_MORE; et->dropped= true; et->dropped= is_drop; } DBUG_PRINT("evex_remove_from_cache", ("delete from queue")); evex_queue_delete_element(&EVEX_EQ_NAME, i); // ok, we have cleaned goto done; Loading Loading @@ -805,7 +811,7 @@ evex_update_event(THD *thd, event_timed *et, sp_name *new_name, UNLOCK_MUTEX_AND_BAIL_OUT(LOCK_evex_running, done); VOID(pthread_mutex_lock(&LOCK_event_arrays)); evex_remove_from_cache(&et->dbname, &et->name, false); evex_remove_from_cache(&et->dbname, &et->name, false, false); if (et->status == MYSQL_EVENT_ENABLED) { if (new_name) Loading Loading @@ -874,7 +880,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists, VOID(pthread_mutex_lock(&LOCK_evex_running)); if (evex_is_running) ret= evex_remove_from_cache(&et->dbname, &et->name, true); ret= evex_remove_from_cache(&et->dbname, &et->name, true, true); VOID(pthread_mutex_unlock(&LOCK_evex_running)); done: Loading
sql/event_executor.cc +6 −0 Original line number Diff line number Diff line Loading @@ -492,12 +492,18 @@ event_executor_worker(void *event_void) sql_print_information(" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d", event->dbname.str, event->name.str, (int) event->expression, ret); if (ret == EVEX_COMPILE_ERROR) sql_print_information(" EVEX COMPILE ERROR for event %s.%s", event->dbname.str, event->name.str); DBUG_PRINT("info", (" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d", event->dbname.str, event->name.str, (int) event->expression, ret)); } if ((event->flags & EVENT_EXEC_NO_MORE) || event->status==MYSQL_EVENT_DISABLED) { DBUG_PRINT("event_executor_worker", ("%s exec no more. to drop=%d",event->name.str, event->dropped)); if (event->dropped) event->drop(thd); delete event; Loading