mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
fa1d637e89
when there are no up-to-date system tables to support it: - initialize the scheduler before reporting "Ready for connections". This ensures that warnings, if any, are printed before "Ready for connections", and this message is not mangled. - do not abort the scheduler if there are no system tables - check the tables once at start up, remember the status and disable the scheduler if the tables are not up to date. If one attempts to use the scheduler with bad tables, issue an error message. - clean up the behaviour of the module under LOCK TABLES and pre-locking mode - make sure implicit commit of Events DDL works as expected. - add more tests Collateral clean ups in the events code. This patch fixes Bug#23631 Events: SHOW VARIABLES doesn't work when mysql.event is damaged mysql-test/r/events.result: Update results. mysql-test/r/events_bugs.result: Update results. mysql-test/r/events_restart_phase1.result: Update results. mysql-test/r/events_restart_phase2.result: Update results. mysql-test/r/events_restart_phase3.result: Update results. mysql-test/r/events_scheduling.result: Update results. mysql-test/r/events_time_zone.result: Update results. mysql-test/t/events.test: Add new tests for tampering with mysql.event and some more tests for sub-statements, LOCK TABLES mode and pre-locking. mysql-test/t/events_bugs.test: Move the non-concurrent part of test for Bug 16420 to this file. mysql-test/t/events_restart_phase1.test: Rewrite events_restart_* tests to take into account that now we check mysql.event table only once, at server startup. mysql-test/t/events_restart_phase2.test: Rewrite events_restart_* tests to take into account that now we check mysql.event table only once, at server startup. mysql-test/t/events_restart_phase3.test: Rewrite events_restart_* tests to take into account that now we check mysql.event table only once, at server startup. mysql-test/t/events_scheduling.test: Add more coverage for event_scheduler global variable. mysql-test/t/events_time_zone.test: Move the non-concurrent part of the tests for Bug 16420 to events_bugs.test sql/event_data_objects.cc: Move update_timing_fields functionality to Event_db_repository. Make loading of events from a table record more robust to tampering with the table - now we do not check mysql.event on every table open. sql/event_data_objects.h: Cleanup. sql/event_db_repository.cc: Now Event_db_repository is responsible for table I/O only. All the logic of events DDL is handled outside, in Events class please refer to the added test coverage to see how this change affected the behavior of Event Scheduler. Dependency on sp_head.h and sp.h removed. Make this module robust to tweaks with mysql.event table. Move check_system_tables from events.cc to this file sql/event_db_repository.h: Cleanup declarations (remove unused ones, change return type to bool from int). sql/event_queue.cc: Update to adapt to the new start up scheme of the Event Scheduler. sql/event_queue.h: Cleanup declarations. sql/event_scheduler.cc: Make all the error messages uniform: [SEVERITY] Event Scheduler: [user][schema.event] message Using append_identifier for error logging was an overkill - we may need it only if the system character set may have NUL (null character) as part of a valid identifier, this is currently never the case, whereas additional quoting did not look nice in the log. sql/event_scheduler.h: Cleanup the headers. sql/events.cc: Use a different start up procedure of Event Scheduler: - at start up, try to check the system tables first. If they are not up-to-date, disable the scheduler. - try to load all the active events. In case of a load error, abort start up. - do not parse an event on start up. Parsing only gives some information about event validity, but far not all. Consolidate the business logic of Events DDL in this module. Now opt_event_scheduler may change after start up and thus is protected by LOCK_event_metadata mutex. sql/events.h: Use all-static-data-members approach to implement Singleton pattern. sql/mysqld.cc: New invocation scheme of Events. Move some logic to events.cc. Initialize the scheduler before reporting "Ready for connections". sql/set_var.cc: Clean up sys_var_thd_sql_mode::symbolic_mode_representation to work with a LEX_STRING. Move more logic related to @@events_scheduler global variable to Events module. sql/set_var.h: Update declarations. sql/share/errmsg.txt: If someone tampered with mysql.event table after the server has started we no longer give him/her a complete report what was actually broken. Do not send the user to look at the error log in such case, as there is nothing there (check_table_intact is not executed). sql/sp_head.cc: Update to a new declaration of sys_var_thd_sql_mode::symbolic_mode_representation sql/sql_db.cc: New invocation scheme of Events module. sql/sql_parse.cc: Move more logic to Events module. Make sure that we are consistent in the way access rights are checked for Events DDL: always after committing the current transaction and checking the system tables. sql/sql_show.cc: Update to the new declarations of sys_var_thd_sql_mode::symbolic_mode_representation sql/sql_test.cc: New invocation scheme of events. sql/table.cc: mysql.event is a system table. Update check_table_intact to be concurrent, more verbose, and less smart. sql/table.h: Add a helper method. mysql-test/r/events_trans.result: New BitKeeper file ``mysql-test/r/events_trans.result'' mysql-test/t/events_trans.test: New BitKeeper file ``mysql-test/t/events_trans.test'': test cases for Event Scheduler that require a transactional storage engine.
617 lines
19 KiB
Text
617 lines
19 KiB
Text
# Can't test with embedded server that doesn't support grants
|
||
-- source include/not_embedded.inc
|
||
|
||
--disable_warnings
|
||
drop database if exists events_test;
|
||
drop database if exists mysqltest_db1;
|
||
drop database if exists mysqltest_db2;
|
||
--enable_warnings
|
||
create database events_test;
|
||
use events_test;
|
||
|
||
#
|
||
# START - 16415: Events: event names are case sensitive
|
||
#
|
||
CREATE EVENT lower_case ON SCHEDULE EVERY 1 MINUTE DO SELECT 1;
|
||
--error ER_EVENT_ALREADY_EXISTS
|
||
CREATE EVENT Lower_case ON SCHEDULE EVERY 2 MINUTE DO SELECT 2;
|
||
DROP EVENT Lower_case;
|
||
SET NAMES cp1251;
|
||
CREATE EVENT äîëåí_ðåãèñòúð_1251 ON SCHEDULE EVERY 1 YEAR DO SELECT 100;
|
||
--error ER_EVENT_ALREADY_EXISTS
|
||
CREATE EVENT ÄîËåÍ_ðåãèñòúð_1251 ON SCHEDULE EVERY 2 YEAR DO SELECT 200;
|
||
DROP EVENT ÄîËåÍ_ðåãèñòúð_1251;
|
||
SET NAMES utf8;
|
||
CREATE EVENT долен_региÑ<C2B8>Ñ‚ÑŠÑ€_утф8 ON SCHEDULE EVERY 3 YEAR DO SELECT 300;
|
||
--error ER_EVENT_ALREADY_EXISTS
|
||
CREATE EVENT ДОЛЕÐ<E280A2>_региÑ<C2B8>Ñ‚ÑŠÑ€_утф8 ON SCHEDULE EVERY 4 YEAR DO SELECT 400;
|
||
DROP EVENT ДОЛЕÐ<E280A2>_региÑ<C2B8>Ñ‚ÑŠÑ€_утф8;
|
||
SET NAMES latin1;
|
||
#
|
||
# END - 16415: Events: event names are case sensitive
|
||
#
|
||
|
||
#
|
||
# START - BUG#16408: Events: crash for an event in a procedure
|
||
#
|
||
set @a=3;
|
||
--error ER_EVENT_RECURSION_FORBIDDEN
|
||
CREATE PROCEDURE p_16 () CREATE EVENT e_16 ON SCHEDULE EVERY @a SECOND DO SET @a=5;
|
||
#
|
||
# END - BUG#16408: Events: crash for an event in a procedure
|
||
#
|
||
|
||
#
|
||
# Start - 16396: Events: Distant-future dates become past dates
|
||
#
|
||
--error ER_WRONG_VALUE
|
||
create event e_55 on schedule at 99990101000000 do drop table t;
|
||
--error ER_WRONG_VALUE
|
||
create event e_55 on schedule every 10 hour starts 99990101000000 do drop table t;
|
||
--error ER_EVENT_ENDS_BEFORE_STARTS
|
||
create event e_55 on schedule every 10 minute ends 99990101000000 do drop table t;
|
||
--error ER_WRONG_VALUE
|
||
create event e_55 on schedule at 10000101000000 do drop table t;
|
||
|
||
# For the purpose of backup we allow times in the past. Here, no
|
||
# error will be given, but the event won't be created. One may think
|
||
# of that as if the event was created, then it turned out it's in the
|
||
# past, so it was dropped because of implicit ON COMPLETION NOT
|
||
# PRESERVE.
|
||
create event e_55 on schedule at 20000101000000 do drop table t;
|
||
show events;
|
||
|
||
--error ER_PARSE_ERROR
|
||
create event e_55 on schedule at 20200101000000 starts 10000101000000 do drop table t;
|
||
--error ER_PARSE_ERROR
|
||
create event e_55 on schedule at 20200101000000 ends 10000101000000 do drop table t;
|
||
--error ER_PARSE_ERROR
|
||
create event e_55 on schedule at 20200101000000 starts 10000101000000 ends 10000101000000 do drop table t;
|
||
--error ER_WRONG_VALUE
|
||
create event e_55 on schedule every 10 hour starts 10000101000000 do drop table t;
|
||
|
||
#
|
||
# End - 16396: Events: Distant-future dates become past dates
|
||
#
|
||
|
||
#
|
||
# Start - 16407: Events: Changes in sql_mode won't be taken into account
|
||
#
|
||
set global event_scheduler=off;
|
||
delete from mysql.event;
|
||
set global event_scheduler= on;
|
||
set @old_sql_mode:=@@sql_mode;
|
||
set sql_mode=ansi;
|
||
select get_lock('test_bug16407', 60);
|
||
delimiter |;
|
||
create event e_16407 on schedule every 60 second do
|
||
begin
|
||
select get_lock('test_bug16407', 60);
|
||
drop table "hashed_num";
|
||
end|
|
||
delimiter ;|
|
||
|
||
let $wait_condition=
|
||
select count(*) = 1 from information_schema.processlist
|
||
where info = 'select get_lock(\'test_bug16407\', 60)';
|
||
--source include/wait_condition.inc
|
||
|
||
--echo "Now if everything is fine the event has compiled and is locked"
|
||
select /*1*/ user, host, db, info from information_schema.processlist where command!='Daemon' and (info is null or info not like '%processlist%') order by info;
|
||
select release_lock('test_bug16407');
|
||
|
||
set global event_scheduler= off;
|
||
|
||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||
--echo "Let's check whether we change the sql_mode on ALTER EVENT"
|
||
set sql_mode='traditional';
|
||
alter event e_16407 do select 1;
|
||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||
drop event e_16407;
|
||
|
||
set sql_mode="ansi";
|
||
select get_lock('ee_16407_2', 60);
|
||
|
||
set global event_scheduler= 1;
|
||
--echo "Another sql_mode test"
|
||
set sql_mode="traditional";
|
||
create table events_smode_test(ev_name char(10), a date) engine=myisam;
|
||
--echo "This should never insert something"
|
||
delimiter |;
|
||
create event ee_16407_2 on schedule every 60 second do
|
||
begin
|
||
select get_lock('ee_16407_2', 60) /*ee_16407_2*/;
|
||
select release_lock('ee_16407_2');
|
||
insert into events_test.events_smode_test values('ee_16407_2','1980-19-02');
|
||
end|
|
||
--error ER_TRUNCATED_WRONG_VALUE
|
||
insert into events_smode_test values ('test','1980-19-02')|
|
||
--echo "This is ok"
|
||
create event ee_16407_3 on schedule every 60 second do
|
||
begin
|
||
select get_lock('ee_16407_2', 60) /*ee_16407_3*/;
|
||
select release_lock('ee_16407_2');
|
||
insert into events_test.events_smode_test values ('ee_16407_3','1980-02-19');
|
||
insert into events_test.events_smode_test values ('ee_16407_3','1980-02-29');
|
||
end|
|
||
set sql_mode=""|
|
||
--echo "This will insert rows but they will be truncated"
|
||
create event ee_16407_4 on schedule every 60 second do
|
||
begin
|
||
select get_lock('ee_16407_2', 60) /*ee_16407_4*/;
|
||
select release_lock('ee_16407_2');
|
||
insert into events_test.events_smode_test values ('ee_16407_4','10-11-1956');
|
||
end|
|
||
delimiter ;|
|
||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||
|
||
let $wait_condition=
|
||
select count(*) = 3 from information_schema.processlist
|
||
where info = 'select get_lock(\'ee_16407_2\', 60)';
|
||
--source include/wait_condition.inc
|
||
|
||
select /*2*/ user, host, db, info from information_schema.processlist where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') order by info;
|
||
select release_lock('ee_16407_2');
|
||
|
||
let $wait_condition=
|
||
select count(*) = 1 and user = 'event_scheduler' and info is null
|
||
from information_schema.processlist
|
||
where (command!='Daemon' || user='event_scheduler')
|
||
and (info is null or info not like '%processlist%');
|
||
--source include/wait_condition.inc
|
||
|
||
select /*3*/ user, host, db, info from information_schema.processlist where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') order by info;
|
||
set global event_scheduler= off;
|
||
select * from events_smode_test order by ev_name, a;
|
||
--echo "OK, last check before we drop them"
|
||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||
drop event ee_16407_2;
|
||
drop event ee_16407_3;
|
||
drop event ee_16407_4;
|
||
|
||
|
||
--echo "And now one last test regarding sql_mode and call of SP from an event"
|
||
delete from events_smode_test;
|
||
set sql_mode='ansi';
|
||
select get_lock('ee_16407_5', 60);
|
||
|
||
set global event_scheduler= on;
|
||
|
||
set sql_mode='traditional';
|
||
delimiter |;
|
||
# ee_16407_5_pendant() should not insert anything because of invalid date.
|
||
create procedure ee_16407_5_pendant() begin insert into events_test.events_smode_test values('ee_16407_5','2001-02-29'); end|
|
||
create procedure ee_16407_6_pendant() begin insert into events_test.events_smode_test values('ee_16407_6','2004-02-29'); end|
|
||
create event ee_16407_5 on schedule every 60 second do
|
||
begin
|
||
select get_lock('ee_16407_5', 60) /*ee_16407_5*/;
|
||
select release_lock('ee_16407_5');
|
||
call events_test.ee_16407_5_pendant();
|
||
end|
|
||
create event ee_16407_6 on schedule every 60 second do
|
||
begin
|
||
select get_lock('ee_16407_5', 60) /*ee_16407_6*/;
|
||
select release_lock('ee_16407_5');
|
||
call events_test.ee_16407_6_pendant();
|
||
end|
|
||
delimiter ;|
|
||
|
||
let $wait_condition=
|
||
select count(*) = 2 from information_schema.processlist
|
||
where info = 'select get_lock(\'ee_16407_5\', 60)';
|
||
--source include/wait_condition.inc
|
||
|
||
--echo "Should have 2 locked processes"
|
||
select /*4*/ user, host, db, info from information_schema.processlist where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') order by info;
|
||
select release_lock('ee_16407_5');
|
||
|
||
let $wait_condition=
|
||
select count(*) = 1 and user = 'event_scheduler' and info is null
|
||
from information_schema.processlist
|
||
where (command!='Daemon' || user='event_scheduler')
|
||
and (info is null or info not like '%processlist%');
|
||
--source include/wait_condition.inc
|
||
|
||
--echo "Should have 0 processes locked"
|
||
select /*5*/ user, host, db, info from information_schema.processlist where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') order by info;
|
||
select * from events_smode_test order by ev_name, a;
|
||
--echo "And here we check one more time before we drop the events"
|
||
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
|
||
drop event ee_16407_5;
|
||
drop event ee_16407_6;
|
||
drop procedure ee_16407_5_pendant;
|
||
drop procedure ee_16407_6_pendant;
|
||
set global event_scheduler= off;
|
||
drop table events_smode_test;
|
||
set sql_mode=@old_sql_mode;
|
||
#
|
||
# End - 16407: Events: Changes in sql_mode won't be taken into account
|
||
#
|
||
|
||
#
|
||
# START - 18897: Events: unauthorized action possible with alter event rename
|
||
#
|
||
set global event_scheduler=off;
|
||
--disable_warnings
|
||
delete from mysql.user where User like 'mysqltest_%';
|
||
delete from mysql.db where User like 'mysqltest_%';
|
||
flush privileges;
|
||
drop database if exists mysqltest_db1;
|
||
--enable_warnings
|
||
create user mysqltest_user1@localhost;
|
||
create database mysqltest_db1;
|
||
grant event on events_test.* to mysqltest_user1@localhost;
|
||
connect (conn2,localhost,mysqltest_user1,,events_test);
|
||
create event mysqltest_user1 on schedule every 10 second do select 42;
|
||
--error ER_DBACCESS_DENIED_ERROR
|
||
alter event mysqltest_user1 rename to mysqltest_db1.mysqltest_user1;
|
||
--echo "Let's test now rename when there is no select DB"
|
||
disconnect conn2;
|
||
connect (conn2,localhost,mysqltest_user1,,*NO-ONE*);
|
||
select database();
|
||
--error ER_NO_DB_ERROR
|
||
alter event events_test.mysqltest_user1 rename to mysqltest_user1;
|
||
select event_schema, event_name, definer, event_type, status from information_schema.events;
|
||
drop event events_test.mysqltest_user1;
|
||
disconnect conn2;
|
||
connection default;
|
||
drop user mysqltest_user1@localhost;
|
||
drop database mysqltest_db1;
|
||
#
|
||
# END - 18897: Events: unauthorized action possible with alter event rename
|
||
#
|
||
|
||
#
|
||
# START - BUG#16394: Events: Crash if schedule contains SELECT
|
||
#
|
||
--error ER_NOT_SUPPORTED_YET
|
||
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
||
--error ER_NOT_SUPPORTED_YET
|
||
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
||
--error ER_NOT_SUPPORTED_YET
|
||
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
||
--error ER_NOT_SUPPORTED_YET
|
||
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
||
#
|
||
# END - BUG#16394: Events: Crash if schedule contains SELECT
|
||
#
|
||
|
||
#
|
||
# START - BUG#22397: Events: crash with procedure which alters events
|
||
#
|
||
--disable_warnings
|
||
drop event if exists e_16;
|
||
drop procedure if exists p_16;
|
||
--enable_warnings
|
||
create event e_16 on schedule every 1 second do set @a=5;
|
||
create procedure p_16 () alter event e_16 on schedule every @a second;
|
||
set @a = null;
|
||
--error ER_WRONG_VALUE
|
||
call p_16();
|
||
--error ER_WRONG_VALUE
|
||
call p_16();
|
||
set @a= 6;
|
||
call p_16();
|
||
|
||
drop procedure p_16;
|
||
drop event e_16;
|
||
|
||
#
|
||
# START - BUG#22830 Events: crash with procedure which alters events with function
|
||
#
|
||
--disable_warnings
|
||
drop function if exists f22830;
|
||
drop event if exists e22830;
|
||
drop event if exists e22830_1;
|
||
drop event if exists e22830_2;
|
||
drop event if exists e22830_3;
|
||
drop event if exists e22830_4;
|
||
drop table if exists t1;
|
||
drop table if exists t2;
|
||
--enable_warnings
|
||
create table t1 (a int);
|
||
insert into t1 values (2);
|
||
create table t2 (a char(20));
|
||
insert into t2 values ("e22830_1");
|
||
create function f22830 () returns int return 5;
|
||
|
||
select get_lock('ee_22830', 60);
|
||
set global event_scheduler=on;
|
||
|
||
delimiter |;
|
||
create procedure p22830_wait()
|
||
begin
|
||
select get_lock('ee_22830', 60);
|
||
select release_lock('ee_22830');
|
||
end|
|
||
|
||
--error ER_NOT_SUPPORTED_YET
|
||
create event e22830 on schedule every f22830() second do
|
||
begin
|
||
call p22830_wait();
|
||
select 123;
|
||
end|
|
||
create event e22830_1 on schedule every 1 hour do
|
||
begin
|
||
call p22830_wait();
|
||
alter event e22830_1 on schedule every (select 8 from dual) hour;
|
||
end|
|
||
create event e22830_2 on schedule every 1 hour do
|
||
begin
|
||
call p22830_wait();
|
||
alter event e22830_2 on schedule every (select 8 from t1) hour;
|
||
end|
|
||
create event e22830_3 on schedule every 1 hour do
|
||
begin
|
||
call p22830_wait();
|
||
alter event e22830_3 on schedule every f22830() hour;
|
||
end|
|
||
create event e22830_4 on schedule every 1 hour do
|
||
begin
|
||
call p22830_wait();
|
||
alter event e22830_4 on schedule every (select f22830() from dual) hour;
|
||
end|
|
||
delimiter ;|
|
||
|
||
--echo "All events should be blocked in get_lock()"
|
||
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
||
|
||
select release_lock('ee_22830');
|
||
|
||
let $wait_condition=
|
||
select group_concat(interval_value order by interval_value) = '1,1,1,8'
|
||
from information_schema.events;
|
||
--source include/wait_condition.inc
|
||
|
||
set global event_scheduler=off;
|
||
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
||
drop procedure p22830_wait;
|
||
drop function f22830;
|
||
--error ER_PARSE_ERROR
|
||
drop event (select a from t2);
|
||
drop event e22830_1;
|
||
drop event e22830_2;
|
||
drop event e22830_3;
|
||
drop event e22830_4;
|
||
drop table t1;
|
||
drop table t2;
|
||
|
||
|
||
#
|
||
# BUG#16425: Events: no DEFINER clause
|
||
#
|
||
--error 0,ER_CANNOT_USER
|
||
DROP USER mysqltest_u1@localhost;
|
||
|
||
CREATE USER mysqltest_u1@localhost;
|
||
GRANT EVENT ON events_test.* TO mysqltest_u1@localhost;
|
||
|
||
CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
CREATE DEFINER=CURRENT_USER EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
ALTER DEFINER=mysqltest_u1@localhost EVENT e1 ON SCHEDULE EVERY 1 HOUR;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
CREATE DEFINER=CURRENT_USER() EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
CREATE DEFINER=mysqltest_u1@localhost EVENT e1 ON SCHEDULE EVERY 1 DAY DO
|
||
SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
connect (conn1, localhost, mysqltest_u1, , events_test);
|
||
|
||
CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
CREATE DEFINER=CURRENT_USER EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
|
||
ALTER DEFINER=root@localhost EVENT e1 ON SCHEDULE EVERY 1 HOUR;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
CREATE DEFINER=CURRENT_USER() EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
||
DROP EVENT e1;
|
||
|
||
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
|
||
CREATE DEFINER=root@localhost EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
--error ER_EVENT_DOES_NOT_EXIST
|
||
DROP EVENT e1;
|
||
|
||
disconnect conn1;
|
||
connection default;
|
||
|
||
DROP USER mysqltest_u1@localhost;
|
||
|
||
|
||
#
|
||
# BUG#16420: Events: timestamps become UTC
|
||
# BUG#26429: SHOW CREATE EVENT is incorrect for an event that
|
||
# STARTS NOW()
|
||
# BUG#26431: Impossible to re-create an event from backup if its
|
||
# STARTS clause is in the past
|
||
# WL#3698: Events: execution in local time zone
|
||
#
|
||
# Here we only check non-concurrent aspects of the patch.
|
||
# For the actual tests of time zones please see events_time_zone.test
|
||
#
|
||
SET GLOBAL EVENT_SCHEDULER= OFF;
|
||
SET @save_time_zone= @@TIME_ZONE;
|
||
|
||
#----------------------------------------------------------------------
|
||
|
||
# We will use a separate connection because SET TIMESTAMP will stop
|
||
# the clock in that connection.
|
||
|
||
SET TIME_ZONE= '+00:00';
|
||
SET TIMESTAMP= UNIX_TIMESTAMP('2005-12-31 23:58:59');
|
||
|
||
|
||
# Test when event time zone is updated on ALTER EVENT.
|
||
#
|
||
|
||
CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
||
SHOW EVENTS;
|
||
|
||
# Test storing and updating of the event time zone.
|
||
#
|
||
SET TIME_ZONE= '-01:00';
|
||
ALTER EVENT e1 ON SCHEDULE EVERY 1 DAY STARTS '2000-01-01 00:00:00';
|
||
SHOW EVENTS;
|
||
|
||
# This will update event time zone.
|
||
SET TIME_ZONE= '+02:00';
|
||
ALTER EVENT e1 ON SCHEDULE AT '2000-01-02 00:00:00'
|
||
ON COMPLETION PRESERVE DISABLE;
|
||
SHOW EVENTS;
|
||
|
||
# This will update event time zone.
|
||
SET TIME_ZONE= '-03:00';
|
||
ALTER EVENT e1 ON SCHEDULE EVERY 1 DAY ENDS '2030-01-03 00:00:00'
|
||
ON COMPLETION PRESERVE DISABLE;
|
||
SHOW EVENTS;
|
||
|
||
# This will not update event time zone, as no time is being adjusted.
|
||
SET TIME_ZONE= '+04:00';
|
||
ALTER EVENT e1 DO SELECT 2;
|
||
SHOW EVENTS;
|
||
|
||
DROP EVENT e1;
|
||
|
||
#----------------------------------------------------------------------
|
||
|
||
# Create some events.
|
||
SET TIME_ZONE='+05:00';
|
||
CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO
|
||
SELECT 1;
|
||
|
||
SET TIMESTAMP= @@TIMESTAMP + 1;
|
||
|
||
SET TIME_ZONE='-05:00';
|
||
CREATE EVENT e2 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO
|
||
SELECT 1;
|
||
|
||
SET TIMESTAMP= @@TIMESTAMP + 1;
|
||
|
||
SET TIME_ZONE='+00:00';
|
||
CREATE EVENT e3 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO
|
||
SELECT 1;
|
||
|
||
|
||
# Test INFORMATION_SCHEMA.EVENTS.
|
||
#
|
||
|
||
SELECT * FROM INFORMATION_SCHEMA.EVENTS ORDER BY event_name;
|
||
|
||
|
||
# Test SHOW EVENTS.
|
||
#
|
||
|
||
SHOW EVENTS;
|
||
|
||
|
||
# Test SHOW CREATE EVENT.
|
||
#
|
||
|
||
SHOW CREATE EVENT e1;
|
||
SHOW CREATE EVENT e2;
|
||
SHOW CREATE EVENT e3;
|
||
|
||
#----------------------------------------------------------------------
|
||
|
||
# Test times in the past.
|
||
#
|
||
|
||
--echo The following should fail, and nothing should be altered.
|
||
|
||
--error ER_EVENT_CANNOT_ALTER_IN_THE_PAST
|
||
ALTER EVENT e1 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00';
|
||
|
||
--error ER_EVENT_CANNOT_ALTER_IN_THE_PAST
|
||
ALTER EVENT e1 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00' DISABLE;
|
||
|
||
--echo The following should give warnings, and nothing should be created.
|
||
|
||
CREATE EVENT e4 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00'
|
||
DO
|
||
SELECT 1;
|
||
|
||
CREATE EVENT e4 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00' DISABLE
|
||
DO
|
||
SELECT 1;
|
||
|
||
CREATE EVENT e4 ON SCHEDULE AT '1999-01-01 00:00:00' DO
|
||
SELECT 1;
|
||
|
||
CREATE EVENT e4 ON SCHEDULE AT '1999-01-01 00:00:00' DISABLE
|
||
DO
|
||
SELECT 1;
|
||
|
||
SHOW EVENTS;
|
||
|
||
--echo The following should succeed giving a warning.
|
||
|
||
ALTER EVENT e1 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00' ON COMPLETION PRESERVE;
|
||
|
||
CREATE EVENT e4 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00' ON COMPLETION PRESERVE
|
||
DO
|
||
SELECT 1;
|
||
|
||
CREATE EVENT e5 ON SCHEDULE AT '1999-01-01 00:00:00'
|
||
ON COMPLETION PRESERVE
|
||
DO
|
||
SELECT 1;
|
||
|
||
--echo The following should succeed without warnings.
|
||
|
||
ALTER EVENT e2 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00';
|
||
|
||
ALTER EVENT e3 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00' ON COMPLETION PRESERVE DISABLE;
|
||
|
||
CREATE EVENT e6 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00' DO
|
||
SELECT 1;
|
||
|
||
CREATE EVENT e7 ON SCHEDULE EVERY 1 HOUR STARTS '1999-01-01 00:00:00'
|
||
ENDS '1999-01-02 00:00:00' ON COMPLETION PRESERVE DISABLE
|
||
DO
|
||
SELECT 1;
|
||
|
||
CREATE EVENT e8 ON SCHEDULE AT '1999-01-01 00:00:00'
|
||
ON COMPLETION PRESERVE DISABLE
|
||
DO
|
||
SELECT 1;
|
||
|
||
SHOW EVENTS;
|
||
|
||
|
||
DROP EVENT e8;
|
||
DROP EVENT e7;
|
||
DROP EVENT e6;
|
||
DROP EVENT e5;
|
||
DROP EVENT e4;
|
||
DROP EVENT e3;
|
||
DROP EVENT e2;
|
||
DROP EVENT e1;
|
||
|
||
SET TIME_ZONE=@save_time_zone;
|
||
|
||
#
|
||
# End of tests
|
||
#
|
||
drop database events_test;
|