mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
1b6b7010a6
The problem is that one can not create a stored routine if sql_mode contains NO_ENGINE_SUBSTITUTION or PAD_CHAR_TO_FULL_LENGTH. Also when a event is created, the mode is silently lost if sql_mode contains one of the aforementioned. This was happening because the table definitions which stored sql_mode values weren't being updated to accept new values of sql_mode. The solution is to update, in a backwards compatible manner, the various table definitions (columns) that store the sql_mode value to take into account the new possible values. One incompatible change is that if a event that is being created can't be stored to the mysql.event table, an error will be raised. The tests case also ensure that new SQL modes will be added to the mysql.proc and mysql.event tables, otherwise the tests will fail. mysql-test/r/events_bugs.result: Add test case result for Bug#32633 mysql-test/r/information_schema.result: Update the sql_mode column definition. mysql-test/r/sp.result: Add test case result for Bug#32633 mysql-test/r/system_mysql_db.result: Update the sql_mode column definition. mysql-test/t/events_bugs.test: Add test case for Bug#32633 mysql-test/t/sp.test: Add test case for Bug#32633 mysql-test/t/system_mysql_db_fix50117.test: Update the sql_mode column definition. scripts/mysql_system_tables.sql: Update the sql_mode column definition. scripts/mysql_system_tables_fix.sql: Update the sql_mode column definition. sql/event_db_repository.cc: Reset and restore SQL modes when storing and loading a event from the data dictionary. Also throw out a error if a store fails. sql/mysqld.cc: Add warning to avoid this problem in the future. sql-common/my_user.c: Truncate length if user name or host name does not fit in the buffer. sql/sp.cc: SQL mode of the thread must not effect data dictionary operations.
974 lines
28 KiB
Text
974 lines
28 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: Bug #31332 --event-scheduler option misbehaving
|
||
#
|
||
|
||
# NOTE!! this test must come first! It's testing that the --event-scheduler
|
||
# option with no argument in events_bugs-master.opt turns the scheduler on.
|
||
|
||
select * from information_schema.global_variables where variable_name like 'event_scheduler';
|
||
|
||
SET GLOBAL event_scheduler = 'OFF';
|
||
|
||
#
|
||
# END: Bug #31332
|
||
#
|
||
|
||
#
|
||
# 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);
|
||
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;
|
||
|
||
#
|
||
# START - BUG#28666 CREATE EVENT ... EVERY 0 SECOND let server crash
|
||
#
|
||
--disable_warnings
|
||
drop event if exists new_event;
|
||
--enable_warnings
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY 0 SECOND DO SELECT 1;
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY (SELECT 0) SECOND DO SELECT 1;
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY "abcdef" SECOND DO SELECT 1;
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY "0abcdef" SECOND DO SELECT 1;
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY "a1bcdef" SECOND DO SELECT 1;
|
||
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY (SELECT "abcdef" UNION SELECT "abcdef") SECOND DO SELECT 1;
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY (SELECT "0abcdef") SECOND DO SELECT 1;
|
||
--error ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG
|
||
CREATE EVENT new_event ON SCHEDULE EVERY (SELECT "a1bcdef") SECOND DO SELECT 1;
|
||
|
||
--error ER_WRONG_VALUE
|
||
CREATE EVENT new_event ON SCHEDULE AT "every day" DO SELECT 1;
|
||
--error ER_WRONG_VALUE
|
||
CREATE EVENT new_event ON SCHEDULE AT "0every day" DO SELECT 1;
|
||
--error ER_WRONG_VALUE
|
||
CREATE EVENT new_event ON SCHEDULE AT (SELECT "every day") DO SELECT 1;
|
||
|
||
--error ER_PARSE_ERROR
|
||
CREATE EVENT new_event ON SCHEDULE AT NOW() STARTS NOW() DO SELECT 1;
|
||
--error ER_PARSE_ERROR
|
||
CREATE EVENT new_event ON SCHEDULE AT NOW() ENDS NOW() DO SELECT 1;
|
||
--error ER_PARSE_ERROR
|
||
CREATE EVENT new_event ON SCHEDULE AT NOW() STARTS NOW() ENDS NOW() DO SELECT 1;
|
||
|
||
#
|
||
# START - BUG#28924 If I drop the user who is the definer of an active event then server cores
|
||
#
|
||
let $engine=MyISAM;
|
||
USE test;
|
||
SHOW GRANTS FOR CURRENT_USER;
|
||
SET GLOBAL event_scheduler = ON;
|
||
eval CREATE TABLE event_log (id int KEY AUTO_INCREMENT,
|
||
ev_nm char(40), ev_cnt int,
|
||
ev_tm timestamp) ENGINE=$engine;
|
||
SET @ev_base_date = 20281224180000;
|
||
--disable_warnings
|
||
SET autocommit=0;
|
||
#DROP DATABASE IF EXISTS ev_db_1;
|
||
#CREATE DATABASE ev_db_1;
|
||
--enable_warnings
|
||
CREATE USER evtest1@localhost;
|
||
SET PASSWORD FOR evtest1@localhost = password('ev1');
|
||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM evtest1@localhost;
|
||
GRANT create, insert, select, event ON events_test.* TO evtest1@localhost;
|
||
GRANT select,insert ON test.* TO evtest1@localhost;
|
||
SHOW GRANTS FOR evtest1@localhost;
|
||
|
||
--echo connection e1;
|
||
--replace_result $MASTER_MYPORT MASTER_MYPORT $MASTER_MYSOCK MASTER_MYSOCK
|
||
connect (e1,localhost,evtest1,ev1,events_test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||
USE events_test;
|
||
|
||
DELIMITER |;
|
||
CREATE EVENT ev_sched_1823 ON SCHEDULE EVERY 2 SECOND
|
||
DO BEGIN
|
||
SET AUTOCOMMIT = 0;
|
||
SET @evname = 'ev_sched_1823';
|
||
SET @cnt = 0;
|
||
SELECT COUNT(*) INTO @cnt FROM test.event_log WHERE ev_nm = @evname;
|
||
IF @cnt < 6 THEN
|
||
INSERT INTO test.event_log VALUES (NULL,@evname,@cnt+1,current_timestamp());
|
||
COMMIT;
|
||
END IF;
|
||
SELECT COUNT(*) INTO @cnt FROM test.event_log WHERE ev_nm = @evname;
|
||
IF @cnt < 6 THEN
|
||
INSERT INTO test.event_log VALUES (NULL,@evname,@cnt+1,current_timestamp());
|
||
ROLLBACK;
|
||
END IF;
|
||
END;|
|
||
DELIMITER ;|
|
||
|
||
--sleep 6
|
||
--echo connection default;
|
||
DROP EVENT ev_sched_1823;
|
||
connection default;
|
||
DROP USER evtest1@localhost;
|
||
|
||
--sleep 6
|
||
USE test;
|
||
--echo =====================================================================================
|
||
--sleep 5
|
||
#--disable_result_log
|
||
select id,ev_nm,ev_cnt from event_log order by id;
|
||
#--enable_result_log
|
||
DROP TABLE event_log;
|
||
#DROP DATABASE ev_db_1;
|
||
SET GLOBAL event_scheduler = OFF;
|
||
|
||
#
|
||
# Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash.
|
||
#
|
||
SET GLOBAL event_scheduler= ON;
|
||
DELIMITER |;
|
||
CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
|
||
DO BEGIN
|
||
SELECT 1;
|
||
END;|
|
||
|
||
DELIMITER ;|
|
||
SET GLOBAL event_scheduler= OFF;
|
||
DROP EVENT bug28641;
|
||
|
||
###########################################################################
|
||
|
||
--echo
|
||
--echo #####################################################################
|
||
--echo #
|
||
--echo # BUG#31111: --read-only crashes MySQL (events fail to load).
|
||
--echo #
|
||
--echo #####################################################################
|
||
--echo
|
||
|
||
--error 0,ER_CANNOT_USER
|
||
DROP USER mysqltest_u1@localhost;
|
||
|
||
--disable_warnings
|
||
DROP EVENT IF EXISTS e1;
|
||
DROP EVENT IF EXISTS e2;
|
||
--enable_warnings
|
||
|
||
--echo
|
||
|
||
# Check that an ordinary user can not create/update/drop events in the
|
||
# read-only mode.
|
||
|
||
GRANT EVENT ON *.* TO mysqltest_u1@localhost;
|
||
|
||
--echo
|
||
|
||
SET GLOBAL READ_ONLY = 1;
|
||
|
||
--echo
|
||
|
||
--echo #
|
||
--echo # Connection: u1_con (mysqltest_u1@localhost/events_test).
|
||
--echo #
|
||
|
||
--connect(u1_con,localhost,mysqltest_u1,,events_test)
|
||
|
||
--echo
|
||
|
||
--error ER_OPTION_PREVENTS_STATEMENT
|
||
CREATE EVENT e1 ON SCHEDULE AT '2020-01-01 00:00:00' DO SET @a = 1;
|
||
|
||
--echo
|
||
|
||
--error ER_OPTION_PREVENTS_STATEMENT
|
||
ALTER EVENT e1 COMMENT 'comment';
|
||
|
||
--echo
|
||
|
||
--error ER_OPTION_PREVENTS_STATEMENT
|
||
DROP EVENT e1;
|
||
|
||
--echo
|
||
|
||
# Check that the super user still can create/update/drop events.
|
||
|
||
--echo #
|
||
--echo # Connection: root_con (root@localhost/events_test).
|
||
--echo #
|
||
|
||
--connect(root_con,localhost,root,,events_test)
|
||
|
||
--echo
|
||
|
||
CREATE EVENT e1 ON SCHEDULE AT '2020-01-01 00:00:00' DO SET @a = 1;
|
||
|
||
--echo
|
||
|
||
ALTER EVENT e1 COMMENT 'comment';
|
||
|
||
--echo
|
||
|
||
DROP EVENT e1;
|
||
|
||
--echo
|
||
|
||
#
|
||
# Switch to read-write mode; create test events under the user mysqltest_u1;
|
||
# switch back to read-only mode.
|
||
#
|
||
|
||
SET GLOBAL READ_ONLY = 0;
|
||
|
||
--echo
|
||
|
||
--echo #
|
||
--echo # Connection: u1_con (mysqltest_u1@localhost/test).
|
||
--echo #
|
||
|
||
--connection u1_con
|
||
|
||
--echo
|
||
|
||
CREATE EVENT e1 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 SECOND DO SET @a = 1;
|
||
CREATE EVENT e2 ON SCHEDULE EVERY 1 SECOND DO SET @a = 1;
|
||
|
||
--echo
|
||
|
||
SELECT
|
||
event_name,
|
||
last_executed IS NULL,
|
||
definer
|
||
FROM INFORMATION_SCHEMA.EVENTS
|
||
WHERE event_schema = 'events_test';
|
||
|
||
--echo
|
||
|
||
--echo #
|
||
--echo # Connection: root_con (root@localhost/events_test).
|
||
--echo #
|
||
|
||
--connection root_con
|
||
|
||
--echo
|
||
|
||
SET GLOBAL READ_ONLY = 1;
|
||
|
||
# Check that the event scheduler is able to update event.
|
||
|
||
--echo
|
||
|
||
SET GLOBAL EVENT_SCHEDULER = ON;
|
||
|
||
--echo
|
||
|
||
--echo # Waiting for the event scheduler to execute and drop event e1...
|
||
|
||
let $wait_timeout = 2;
|
||
let $wait_condition =
|
||
SELECT COUNT(*) = 0
|
||
FROM INFORMATION_SCHEMA.EVENTS
|
||
WHERE event_schema = 'events_test' AND event_name = 'e1';
|
||
--source include/wait_condition.inc
|
||
|
||
--echo
|
||
|
||
--echo # Waiting for the event scheduler to execute and update event e2...
|
||
|
||
let $wait_condition =
|
||
SELECT last_executed IS NOT NULL
|
||
FROM INFORMATION_SCHEMA.EVENTS
|
||
WHERE event_schema = 'events_test' AND event_name = 'e2';
|
||
--source include/wait_condition.inc
|
||
|
||
--echo
|
||
|
||
SET GLOBAL EVENT_SCHEDULER = OFF;
|
||
|
||
--echo
|
||
|
||
SELECT
|
||
event_name,
|
||
last_executed IS NULL,
|
||
definer
|
||
FROM INFORMATION_SCHEMA.EVENTS
|
||
WHERE event_schema = 'events_test';
|
||
|
||
--echo
|
||
|
||
--error ER_EVENT_DOES_NOT_EXIST
|
||
DROP EVENT e1;
|
||
|
||
--echo
|
||
--echo # Cleanup.
|
||
--echo
|
||
|
||
DROP EVENT e2;
|
||
|
||
--echo
|
||
|
||
SET GLOBAL READ_ONLY = 0;
|
||
|
||
--echo
|
||
|
||
--echo #
|
||
--echo # Connection: default
|
||
--echo #
|
||
|
||
--disconnect u1_con
|
||
--disconnect root_con
|
||
--connection default
|
||
|
||
--echo
|
||
|
||
DROP USER mysqltest_u1@localhost;
|
||
|
||
--echo
|
||
--echo #####################################################################
|
||
--echo #
|
||
--echo # End of BUG#31111.
|
||
--echo #
|
||
--echo #####################################################################
|
||
--echo
|
||
|
||
#
|
||
# Bug#32633 Can not create any routine if SQL_MODE=no_engine_substitution
|
||
#
|
||
# Ensure that when new SQL modes are introduced, they are also added to
|
||
# the mysql.event table.
|
||
#
|
||
|
||
--disable_warnings
|
||
drop procedure if exists p;
|
||
--enable_warnings
|
||
set @old_mode= @@sql_mode;
|
||
set @@sql_mode= pow(2,32)-1;
|
||
create event e1 on schedule every 1 day do select 1;
|
||
select @@sql_mode;
|
||
set @@sql_mode= @old_mode;
|
||
# Rename SQL modes that differ in name between the server and the table definition.
|
||
select replace(@full_mode, '?', 'NOT_USED') into @full_mode;
|
||
select replace(@full_mode, 'ALLOW_INVALID_DATES', 'INVALID_DATES') into @full_mode;
|
||
select name from mysql.event where name = 'p' and sql_mode = @full_mode;
|
||
drop event e1;
|
||
|
||
###########################################################################
|
||
#
|
||
# End of tests
|
||
#
|
||
# !!! KEEP this section AT THE END of this file !!!
|
||
#
|
||
###########################################################################
|
||
|
||
let $wait_condition=
|
||
select count(*) = 0 from information_schema.processlist
|
||
where db='events_test' and command = 'Connect' and user=current_user();
|
||
--source include/wait_condition.inc
|
||
|
||
DROP DATABASE events_test;
|
||
|
||
# THIS MUST BE THE LAST LINE in this file.
|