2008-11-04 12:27:21 +01:00
|
|
|
|
#### t/events_bugs.test
|
|
|
|
|
#
|
|
|
|
|
# Last change:
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# 2009-01-08 mleich
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# - Fix for
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# Bug#41111 events_bugs fails sporadically on pushbuild
|
|
|
|
|
# - Avoid effects of
|
|
|
|
|
# Bug#41925 Warning 1366 Incorrect string value: ... for column processlist.info
|
|
|
|
|
#
|
|
|
|
|
# Please set $
|
|
|
|
|
let $fixed_bug41925= 0;
|
|
|
|
|
#
|
|
|
|
|
# Dear maintainer of this test. Please do NOT remove the next big comment.
|
|
|
|
|
# The tests for events were quite unstable over a significant time because the
|
|
|
|
|
# effects of events in general and their representation within the processlist
|
|
|
|
|
# were partially not known. Therefore I had to make excessive experiments.
|
|
|
|
|
# The comment with the outcome of these experiments will be moved into a README
|
|
|
|
|
# file as soon as the tests for events get their own testsuite.
|
|
|
|
|
#
|
|
|
|
|
# Outcome of some experiments (mleich, mysql-5.1 2008-12):
|
|
|
|
|
# --------------------------------------------------------
|
|
|
|
|
# 0. Most time used setup:
|
|
|
|
|
# High parallel I/O load
|
|
|
|
|
# set global event_scheduler= off;
|
|
|
|
|
# sleep 3;
|
|
|
|
|
# use events_test;
|
|
|
|
|
# create event e_16407 on schedule every 2 second do
|
|
|
|
|
# begin
|
|
|
|
|
# select 'FIRST COMMAND', sleep(0.5);
|
|
|
|
|
# select 'SECOND COMMAND';
|
|
|
|
|
# end|
|
|
|
|
|
# set global event_scheduler= on;
|
|
|
|
|
# Start observation of the processlist
|
|
|
|
|
#
|
|
|
|
|
#
|
|
|
|
|
# 1. SET GLOBAL event_scheduler = 'ON' and immediate observation of the processlist.
|
|
|
|
|
# 1.1 Effects around event scheduler:
|
|
|
|
|
# 1.1.1 First phase (very short)
|
|
|
|
|
# No user 'event_scheduler' within information_schema.processlist.
|
|
|
|
|
# 1.1.2 Second phase observed (independend of probably existing events and very short) was
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# event_scheduler localhost NULL Daemon 0 Initialized NULL
|
|
|
|
|
# 1.1.3 Third phase observed:
|
|
|
|
|
# 1.1.3.1 Case we do not have existing events (rather long)
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# event_scheduler localhost NULL Daemon 0 Waiting on empty queue NULL
|
|
|
|
|
# 1.1.3.2 Case there exists already an event
|
|
|
|
|
# 1.1.3.2.1 Event executor is not visible in processlist but comes up soon
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# event_scheduler localhost NULL Daemon 0 NULL
|
|
|
|
|
# or
|
|
|
|
|
# event_scheduler localhost NULL Daemon 0 NULL NULL
|
|
|
|
|
# 1.1.3.2.2 A bit later, at least one event executor is or was visible in processlist
|
|
|
|
|
# The states mentioned in 3.2.1 or a bit later
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# event_scheduler localhost NULL Daemon 0 Waiting for next activation NULL
|
|
|
|
|
# 1.2 Effects around event executor:
|
|
|
|
|
# Typical processlist content:
|
|
|
|
|
# USER evtest1 -- Definer of event
|
|
|
|
|
# DB events_test -- DB during time of event creation (use DB is not allowed in events)
|
|
|
|
|
# COMMAND Connect
|
|
|
|
|
# STATE NULL
|
|
|
|
|
# INFO SET @evname = 'ev_sched_1823' -- Part of the event code
|
|
|
|
|
#
|
|
|
|
|
# State before "User sleep select 'FIRST COMMAND', sleep(0.5);"
|
|
|
|
|
# ID USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# 7 event_scheduler localhost NULL Connect 0 NULL NULL
|
|
|
|
|
# !! The user is not the event creator and the DB is different. !!
|
|
|
|
|
# !! This means that we must get later a change of the identity. !!
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 checking permissions
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 checking permissions CREATE PROCEDURE ....
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 NULL select 'FIRST COMMAND', sleep(0.5)
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 checking permissions select 'FIRST COMMAND'...
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 Opening table select 'FIRST COMMAND', sleep(0.5)
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 Locked select 'FIRST COMMAND', sleep(0.5)
|
|
|
|
|
# or
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 executing select 'FIRST COMMAND', sleep(0.5)
|
|
|
|
|
#
|
|
|
|
|
# State "User sleep select 'FIRST COMMAND', sleep(0.5);" reached
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 User sleep select 'FIRST COMMAND', sleep(0.5)
|
|
|
|
|
#
|
|
|
|
|
# State at end (! It looks like a slow CREATE PROC !) of event code execution was sometimes
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 logging slow query CREATE PROCEDURE `e_16407`...
|
|
|
|
|
#
|
|
|
|
|
# State after running some event code was sometimes
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# root localhost events_test Connect 0 logging slow query select 'SECOND COMMAND'
|
|
|
|
|
#
|
|
|
|
|
# State somewhere (I guess just before the event executor disappears)
|
|
|
|
|
# USER HOST DB COMMAND TIME STATE INFO
|
|
|
|
|
# Event thread fin <empty> events_test Connect 0 Clearing NULL
|
|
|
|
|
#
|
|
|
|
|
#
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# 2. SET GLOBAL event_scheduler = 'OFF';
|
|
|
|
|
# Immediate observation of the processlist.
|
|
|
|
|
# Effects:
|
|
|
|
|
# 1. I never found the user 'event_scheduler' within the processlist.
|
|
|
|
|
# 2. Events just during execution could be found within the processlist
|
|
|
|
|
# = It does not look like "SET GLOBAL event_scheduler = 'OFF'" stops them.
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# ==> Everything mentioned in 1.2 above could be observed.
|
|
|
|
|
#
|
|
|
|
|
# Several subtests were weak because they showed random result set differences after issuing
|
|
|
|
|
# "SET GLOBAL EVENT_SCHEDULER= off;".
|
|
|
|
|
# 1. Reason one: There were already event executors
|
|
|
|
|
# Fix: Wait till there is no event executor active ==> no session WHERE
|
|
|
|
|
# - command IN ('Connect')
|
|
|
|
|
# There must be no parallel session being just in "Connect" phase!
|
|
|
|
|
# or
|
|
|
|
|
# - user = <who created the maybe current running events>
|
|
|
|
|
# There must be no parallel session of this person.
|
|
|
|
|
# or user = 'event_scheduler' with command = 'Connect'
|
|
|
|
|
# The session which will soon change its identity to event creator.
|
|
|
|
|
#
|
|
|
|
|
# 2. Reason two: If an event modifies a MyISAM table than a delayed visibilty of changes
|
|
|
|
|
# might occur (concurrent_inserts=on or delayed inserts ...).
|
2008-11-04 12:27:21 +01:00
|
|
|
|
#
|
|
|
|
|
|
2006-06-23 09:40:06 +02:00
|
|
|
|
# Can't test with embedded server that doesn't support grants
|
|
|
|
|
-- source include/not_embedded.inc
|
|
|
|
|
|
A set of changes aiming to make the Event Scheduler more user-friendly
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.
2007-04-05 13:24:34 +02:00
|
|
|
|
--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;
|
2006-02-20 23:52:22 +01:00
|
|
|
|
use events_test;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# We use MyISAM tables and must avoid effects (visibility of changes might be
|
|
|
|
|
# delayed) caused by concurrent_insert on (default).
|
|
|
|
|
set @concurrent_insert= @@global.concurrent_insert;
|
|
|
|
|
set @@global.concurrent_insert = 0;
|
2006-03-24 17:45:52 +01:00
|
|
|
|
|
2007-10-22 21:16:43 +02:00
|
|
|
|
#
|
|
|
|
|
# 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';
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# Check that the event_scheduler is really running
|
|
|
|
|
--source include/running_event_scheduler.inc
|
2007-10-22 21:16:43 +02:00
|
|
|
|
|
|
|
|
|
SET GLOBAL event_scheduler = 'OFF';
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2007-10-22 21:16:43 +02:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# END: Bug #31332
|
|
|
|
|
#
|
|
|
|
|
|
2006-03-24 17:45:52 +01:00
|
|
|
|
#
|
|
|
|
|
# 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 <20><><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_1251 ON SCHEDULE EVERY 1 YEAR DO SELECT 100;
|
|
|
|
|
--error ER_EVENT_ALREADY_EXISTS
|
|
|
|
|
CREATE EVENT <20><><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_1251 ON SCHEDULE EVERY 2 YEAR DO SELECT 200;
|
|
|
|
|
DROP EVENT <20><><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_1251;
|
|
|
|
|
SET NAMES utf8;
|
|
|
|
|
CREATE EVENT долен_регистър_утф8 ON SCHEDULE EVERY 3 YEAR DO SELECT 300;
|
|
|
|
|
--error ER_EVENT_ALREADY_EXISTS
|
|
|
|
|
CREATE EVENT ДОЛЕН_регистър_утф8 ON SCHEDULE EVERY 4 YEAR DO SELECT 400;
|
|
|
|
|
DROP EVENT ДОЛЕН_регистър_утф8;
|
|
|
|
|
SET NAMES latin1;
|
|
|
|
|
#
|
|
|
|
|
# END - 16415: Events: event names are case sensitive
|
|
|
|
|
#
|
|
|
|
|
|
2006-03-16 13:14:40 +01:00
|
|
|
|
#
|
|
|
|
|
# START - BUG#16408: Events: crash for an event in a procedure
|
|
|
|
|
#
|
|
|
|
|
set @a=3;
|
2007-03-27 20:15:51 +02:00
|
|
|
|
--error ER_EVENT_RECURSION_FORBIDDEN
|
2006-03-16 13:14:40 +01:00
|
|
|
|
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
|
|
|
|
|
#
|
|
|
|
|
|
2006-03-03 01:39:11 +01:00
|
|
|
|
#
|
|
|
|
|
# Start - 16396: Events: Distant-future dates become past dates
|
|
|
|
|
#
|
fix for bug #17619 Scheduler race conditions
- Scheduler is either initialized at server start or never.
Starting & stopping is now suspending & resuming.
- The scheduler has clear OO interface
- Now all calls to the scheduler are synchronous
- GLOBAL event_scheduler uses thd::sys_var_tmp (see set_var.cc)
- External API is encapsulated into class Events
- Includes fixes for all comments of Kostja's review of 19.05.2005
Starting to merge into 5.1-release (5.1.10) and push
BitKeeper/etc/ignore:
Added libmysqld/event_scheduler.cc to the ignore list
libmysqld/Makefile.am:
executor -> scheduler
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_microsec.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/disabled.def:
enable these tests
mysql-test/t/events.test:
optimize the test a bit for speed, save some seconds runtime
remove FULL from SHOW EVENTS
mostly use I_S.EVENTS
mysql-test/t/events_bugs.test:
Skip irrelevant for the current design tests - all events are loaded
on server startup. Change in mysql.event will be visible on next server start.
Don't use numeric error codes.
mysql-test/t/events_logs_tests.test:
optimize the test a bit for speed
mysql-test/t/events_microsec.test:
Skip irrelevant for the current design tests - all events are loaded
on server startup. Change in mysql.event will be visible on next server start.
Don't use numeric error codes.
mysql-test/t/events_scheduling.test:
broader test
mysql-test/t/events_stress.test:
Rework the test to the new architecture of suspending/resuming.
Use less events, no need for thousands, hundreds is still ok.
sql/Makefile.am:
executor -> scheduler
sql/cmakelists.txt:
executor -> scheduler
sql/event.cc:
- remove todo comments
- remove unneded evex_queue abstraction functions
- move events_init() and events_shutdown() from event_executor.cc to here
- export db_create_event
- remove evex_load_and_compile_event, part of class Event_scheduler
- integrate the public interface found in event.h and used by sql_parse.cc
to use the new class Event_scheduler.
sql/event.h:
- add COND_finished so if one thread kills a running event it waits on this
- export callback event_timed_definer_equal, event_timed_identifier_equal(),
event_timed_name_equal and event_timed_db_equal()
to be used by Event_scheduler::drop_matching_events()
- cleanup event.h
- encapsulated all external interface into class Events
sql/event_executor.cc:
make it empty, will delete after that
sql/event_priv.h:
- more things in the private header
- remove event queue abstraction functions. tightly bind to QUEUE
- export privately db_drop_event, db_find_event, db_create_event()
- made change_security_context() and restore_security_context() free functions
sql/event_timed.cc:
- fix calculation of time when ENDS is set (STARTS is always set)
- during Event_timed::compile() set the right Security_ctx. Prevents a crash
during Event_scheduler::load_events_from_db()
- add Event_timed::kill_thread()
- implement event_timed_*_equal()
- made change_security_context() and restore_security_context() free functions.
- Comments cleanups
sql/lex.h:
new word scheduler for SHOW SCHEDULER STATUS (available only debug builds)
sql/log.cc:
move these from event_scheduler.cc
sql/mysql_priv.h:
refactor kill_one_thread
export sql_print_message_func and sql_print_message_handlers
sql/mysqld.cc:
In close_connections, called by kill_server() skip the main scheduler
thread and use events_shutdown() for shutting down the scheduler, in the same
manner it's done for RPL.
Add a new value to --event-scheduler :
0 <- No scheduler available
1 <- Start with scheduler enabled
2 <- Start with scheduler suspended
sql/repl_failsafe.cc:
refactor thd::system_thread to be an enum
sql/set_var.cc:
move sys_var_event_executor::update() to set_var.cc
executor -> scheduler
use thd::sys_var_tmp
sql/set_var.h:
executor -> scheduler
sql/share/errmsg.txt:
3 new error messages
sql/sql_class.cc:
refactor thd::system_thread to be an enum . more type-safety
sql/sql_class.h:
refactor thd::system_thread to be an enum . more type-safety
sql/sql_db.cc:
get the error from evex_drop_schema_events
sql/sql_error.h:
export warning_level_names
sql/sql_lex.h:
new command SHOW SCHEDULER STATUS, available only in debug build and
for debug purposes.
sql/sql_parse.cc:
refactor kill_one_thread() -> does the *dirty* work, and sql_kill
just the reporting.
add handler for SQLCOM_SHOW_SCHEDULER_STATUS
sql/sql_show.cc:
fix verbosity handling (this will be obsoleted anyway by the fix for 17394).
sql/sql_yacc.yy:
remove FULL from SHOW EVENTS
add SHOW SCHEDULER STATUS in debug builds
sql/table.cc:
Fix valgrind warning.
2006-05-22 20:46:13 +02:00
|
|
|
|
--error ER_WRONG_VALUE
|
2006-03-03 01:39:11 +01:00
|
|
|
|
create event e_55 on schedule at 99990101000000 do drop table t;
|
fix for bug #17619 Scheduler race conditions
- Scheduler is either initialized at server start or never.
Starting & stopping is now suspending & resuming.
- The scheduler has clear OO interface
- Now all calls to the scheduler are synchronous
- GLOBAL event_scheduler uses thd::sys_var_tmp (see set_var.cc)
- External API is encapsulated into class Events
- Includes fixes for all comments of Kostja's review of 19.05.2005
Starting to merge into 5.1-release (5.1.10) and push
BitKeeper/etc/ignore:
Added libmysqld/event_scheduler.cc to the ignore list
libmysqld/Makefile.am:
executor -> scheduler
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_microsec.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/disabled.def:
enable these tests
mysql-test/t/events.test:
optimize the test a bit for speed, save some seconds runtime
remove FULL from SHOW EVENTS
mostly use I_S.EVENTS
mysql-test/t/events_bugs.test:
Skip irrelevant for the current design tests - all events are loaded
on server startup. Change in mysql.event will be visible on next server start.
Don't use numeric error codes.
mysql-test/t/events_logs_tests.test:
optimize the test a bit for speed
mysql-test/t/events_microsec.test:
Skip irrelevant for the current design tests - all events are loaded
on server startup. Change in mysql.event will be visible on next server start.
Don't use numeric error codes.
mysql-test/t/events_scheduling.test:
broader test
mysql-test/t/events_stress.test:
Rework the test to the new architecture of suspending/resuming.
Use less events, no need for thousands, hundreds is still ok.
sql/Makefile.am:
executor -> scheduler
sql/cmakelists.txt:
executor -> scheduler
sql/event.cc:
- remove todo comments
- remove unneded evex_queue abstraction functions
- move events_init() and events_shutdown() from event_executor.cc to here
- export db_create_event
- remove evex_load_and_compile_event, part of class Event_scheduler
- integrate the public interface found in event.h and used by sql_parse.cc
to use the new class Event_scheduler.
sql/event.h:
- add COND_finished so if one thread kills a running event it waits on this
- export callback event_timed_definer_equal, event_timed_identifier_equal(),
event_timed_name_equal and event_timed_db_equal()
to be used by Event_scheduler::drop_matching_events()
- cleanup event.h
- encapsulated all external interface into class Events
sql/event_executor.cc:
make it empty, will delete after that
sql/event_priv.h:
- more things in the private header
- remove event queue abstraction functions. tightly bind to QUEUE
- export privately db_drop_event, db_find_event, db_create_event()
- made change_security_context() and restore_security_context() free functions
sql/event_timed.cc:
- fix calculation of time when ENDS is set (STARTS is always set)
- during Event_timed::compile() set the right Security_ctx. Prevents a crash
during Event_scheduler::load_events_from_db()
- add Event_timed::kill_thread()
- implement event_timed_*_equal()
- made change_security_context() and restore_security_context() free functions.
- Comments cleanups
sql/lex.h:
new word scheduler for SHOW SCHEDULER STATUS (available only debug builds)
sql/log.cc:
move these from event_scheduler.cc
sql/mysql_priv.h:
refactor kill_one_thread
export sql_print_message_func and sql_print_message_handlers
sql/mysqld.cc:
In close_connections, called by kill_server() skip the main scheduler
thread and use events_shutdown() for shutting down the scheduler, in the same
manner it's done for RPL.
Add a new value to --event-scheduler :
0 <- No scheduler available
1 <- Start with scheduler enabled
2 <- Start with scheduler suspended
sql/repl_failsafe.cc:
refactor thd::system_thread to be an enum
sql/set_var.cc:
move sys_var_event_executor::update() to set_var.cc
executor -> scheduler
use thd::sys_var_tmp
sql/set_var.h:
executor -> scheduler
sql/share/errmsg.txt:
3 new error messages
sql/sql_class.cc:
refactor thd::system_thread to be an enum . more type-safety
sql/sql_class.h:
refactor thd::system_thread to be an enum . more type-safety
sql/sql_db.cc:
get the error from evex_drop_schema_events
sql/sql_error.h:
export warning_level_names
sql/sql_lex.h:
new command SHOW SCHEDULER STATUS, available only in debug build and
for debug purposes.
sql/sql_parse.cc:
refactor kill_one_thread() -> does the *dirty* work, and sql_kill
just the reporting.
add handler for SQLCOM_SHOW_SCHEDULER_STATUS
sql/sql_show.cc:
fix verbosity handling (this will be obsoleted anyway by the fix for 17394).
sql/sql_yacc.yy:
remove FULL from SHOW EVENTS
add SHOW SCHEDULER STATUS in debug builds
sql/table.cc:
Fix valgrind warning.
2006-05-22 20:46:13 +02:00
|
|
|
|
--error ER_WRONG_VALUE
|
2006-03-03 01:39:11 +01:00
|
|
|
|
create event e_55 on schedule every 10 hour starts 99990101000000 do drop table t;
|
2006-03-17 11:01:45 +01:00
|
|
|
|
--error ER_EVENT_ENDS_BEFORE_STARTS
|
2006-03-03 01:39:11 +01:00
|
|
|
|
create event e_55 on schedule every 10 minute ends 99990101000000 do drop table t;
|
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
The problem was that local times specified by the user in AT, STARTS
and ENDS of CREATE EVENT/ALTER EVENT statement were converted to UTC,
and the original time zone was forgotten. This way, event scheduler
couldn't honor Daylight Saving Time shifts, and times shown to the
user were also in UTC. Additionally, CREATE EVENT didn't allow times
in the past, thus preventing straightforward event restoration from
old backups.
This patch reworks event scheduler time computations, performing them
in the time zone associated with the event. Also it allows times to
be in the past.
The patch adds time_zone column to mysql.event table.
NOTE: The patch is almost final, but the bug#9953 should be pushed
first.
client/mysqldump.c:
Before every CREATE EVENT, output its time zone.
mysql-test/include/wait_condition.inc:
Add optional $wait_timeout parameter.
mysql-test/lib/init_db.sql:
Add time_zone column.
mysql-test/r/events.result:
Update result.
mysql-test/r/events_bugs.result:
Update result.
mysql-test/r/events_grant.result:
Update result.
mysql-test/r/events_restart_phase1.result:
Update result.
mysql-test/r/events_scheduling.result:
Update result.
mysql-test/r/mysqldump.result:
Update result.
mysql-test/r/ps.result:
Update result.
mysql-test/r/system_mysql_db.result:
Update result.
mysql-test/t/events.test:
Remove STARTS from the result, as it depends on current time.
mysql-test/t/events_bugs.test:
Time in the past is no longer an error.
mysql-test/t/events_restart_phase1.test:
Fill new column 'time_zone' in mysql.event.
mysql-test/t/events_scheduling.test:
Cleanup: disable event scheduler.
scripts/mysql_create_system_tables.sh:
Add new column 'time_zone' to mysql.event.
scripts/mysql_fix_privilege_tables.sql:
Add new column 'time_zone' to mysql.event.
sql/event_data_objects.cc:
The essence of the change is the following:
- for internal times use my_time_t instead of TIME. Assignment and
comparison is done now on plain numbers.
- in init_execute_at(), init_starts(), init_ends() convert given time
to number of seconds since Epoch (aka Unix time, in UTC).
- handle time_zone field loading and storing.
- in get_next_time(), Unix time is converted back to event time zone,
interval is added, and the result is converted to UTC again.
- fix Event_timed::get_create_event() to report STARTS and ENDS.
- before executing the event body we set thread time zone to the
event time zone.
sql/event_data_objects.h:
Add time_zone member to Event_basic class.
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_db_repository.cc:
Add time_zone column handling.
Give a warning and do not create an event if its execution time is in
the past, and ON COMPLETION NOT PRESERVE is set, because such an event
should be dropped by that time. Also, do not allow ALTER EVENT to
set execution time in the past when ON COMPLETION NOT PRESERVE is set.
sql/event_db_repository.h:
Add enum member for new time zone column.
sql/event_queue.cc:
Replace handling of broken down times with simple handling of
my_time_t.
sql/event_queue.h:
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_scheduler.cc:
Add TODO comment.
sql/events.cc:
Send time_zone column for SHOW CREATE EVENT.
sql/share/errmsg.txt:
Update error message, and add two more errors.
sql/sql_show.cc:
Add TIME_ZONE column to the output of SHOW EVENTS.
mysql-test/r/events_time_zone.result:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/r/events_time_zone.result
mysql-test/t/events_time_zone.test:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/t/events_time_zone.test
2007-03-16 15:31:07 +01:00
|
|
|
|
--error ER_WRONG_VALUE
|
2006-07-10 13:44:43 +02:00
|
|
|
|
create event e_55 on schedule at 10000101000000 do drop table t;
|
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
The problem was that local times specified by the user in AT, STARTS
and ENDS of CREATE EVENT/ALTER EVENT statement were converted to UTC,
and the original time zone was forgotten. This way, event scheduler
couldn't honor Daylight Saving Time shifts, and times shown to the
user were also in UTC. Additionally, CREATE EVENT didn't allow times
in the past, thus preventing straightforward event restoration from
old backups.
This patch reworks event scheduler time computations, performing them
in the time zone associated with the event. Also it allows times to
be in the past.
The patch adds time_zone column to mysql.event table.
NOTE: The patch is almost final, but the bug#9953 should be pushed
first.
client/mysqldump.c:
Before every CREATE EVENT, output its time zone.
mysql-test/include/wait_condition.inc:
Add optional $wait_timeout parameter.
mysql-test/lib/init_db.sql:
Add time_zone column.
mysql-test/r/events.result:
Update result.
mysql-test/r/events_bugs.result:
Update result.
mysql-test/r/events_grant.result:
Update result.
mysql-test/r/events_restart_phase1.result:
Update result.
mysql-test/r/events_scheduling.result:
Update result.
mysql-test/r/mysqldump.result:
Update result.
mysql-test/r/ps.result:
Update result.
mysql-test/r/system_mysql_db.result:
Update result.
mysql-test/t/events.test:
Remove STARTS from the result, as it depends on current time.
mysql-test/t/events_bugs.test:
Time in the past is no longer an error.
mysql-test/t/events_restart_phase1.test:
Fill new column 'time_zone' in mysql.event.
mysql-test/t/events_scheduling.test:
Cleanup: disable event scheduler.
scripts/mysql_create_system_tables.sh:
Add new column 'time_zone' to mysql.event.
scripts/mysql_fix_privilege_tables.sql:
Add new column 'time_zone' to mysql.event.
sql/event_data_objects.cc:
The essence of the change is the following:
- for internal times use my_time_t instead of TIME. Assignment and
comparison is done now on plain numbers.
- in init_execute_at(), init_starts(), init_ends() convert given time
to number of seconds since Epoch (aka Unix time, in UTC).
- handle time_zone field loading and storing.
- in get_next_time(), Unix time is converted back to event time zone,
interval is added, and the result is converted to UTC again.
- fix Event_timed::get_create_event() to report STARTS and ENDS.
- before executing the event body we set thread time zone to the
event time zone.
sql/event_data_objects.h:
Add time_zone member to Event_basic class.
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_db_repository.cc:
Add time_zone column handling.
Give a warning and do not create an event if its execution time is in
the past, and ON COMPLETION NOT PRESERVE is set, because such an event
should be dropped by that time. Also, do not allow ALTER EVENT to
set execution time in the past when ON COMPLETION NOT PRESERVE is set.
sql/event_db_repository.h:
Add enum member for new time zone column.
sql/event_queue.cc:
Replace handling of broken down times with simple handling of
my_time_t.
sql/event_queue.h:
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_scheduler.cc:
Add TODO comment.
sql/events.cc:
Send time_zone column for SHOW CREATE EVENT.
sql/share/errmsg.txt:
Update error message, and add two more errors.
sql/sql_show.cc:
Add TIME_ZONE column to the output of SHOW EVENTS.
mysql-test/r/events_time_zone.result:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/r/events_time_zone.result
mysql-test/t/events_time_zone.test:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/t/events_time_zone.test
2007-03-16 15:31:07 +01:00
|
|
|
|
|
|
|
|
|
# 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.
|
2006-07-10 13:44:43 +02:00
|
|
|
|
create event e_55 on schedule at 20000101000000 do drop table t;
|
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
The problem was that local times specified by the user in AT, STARTS
and ENDS of CREATE EVENT/ALTER EVENT statement were converted to UTC,
and the original time zone was forgotten. This way, event scheduler
couldn't honor Daylight Saving Time shifts, and times shown to the
user were also in UTC. Additionally, CREATE EVENT didn't allow times
in the past, thus preventing straightforward event restoration from
old backups.
This patch reworks event scheduler time computations, performing them
in the time zone associated with the event. Also it allows times to
be in the past.
The patch adds time_zone column to mysql.event table.
NOTE: The patch is almost final, but the bug#9953 should be pushed
first.
client/mysqldump.c:
Before every CREATE EVENT, output its time zone.
mysql-test/include/wait_condition.inc:
Add optional $wait_timeout parameter.
mysql-test/lib/init_db.sql:
Add time_zone column.
mysql-test/r/events.result:
Update result.
mysql-test/r/events_bugs.result:
Update result.
mysql-test/r/events_grant.result:
Update result.
mysql-test/r/events_restart_phase1.result:
Update result.
mysql-test/r/events_scheduling.result:
Update result.
mysql-test/r/mysqldump.result:
Update result.
mysql-test/r/ps.result:
Update result.
mysql-test/r/system_mysql_db.result:
Update result.
mysql-test/t/events.test:
Remove STARTS from the result, as it depends on current time.
mysql-test/t/events_bugs.test:
Time in the past is no longer an error.
mysql-test/t/events_restart_phase1.test:
Fill new column 'time_zone' in mysql.event.
mysql-test/t/events_scheduling.test:
Cleanup: disable event scheduler.
scripts/mysql_create_system_tables.sh:
Add new column 'time_zone' to mysql.event.
scripts/mysql_fix_privilege_tables.sql:
Add new column 'time_zone' to mysql.event.
sql/event_data_objects.cc:
The essence of the change is the following:
- for internal times use my_time_t instead of TIME. Assignment and
comparison is done now on plain numbers.
- in init_execute_at(), init_starts(), init_ends() convert given time
to number of seconds since Epoch (aka Unix time, in UTC).
- handle time_zone field loading and storing.
- in get_next_time(), Unix time is converted back to event time zone,
interval is added, and the result is converted to UTC again.
- fix Event_timed::get_create_event() to report STARTS and ENDS.
- before executing the event body we set thread time zone to the
event time zone.
sql/event_data_objects.h:
Add time_zone member to Event_basic class.
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_db_repository.cc:
Add time_zone column handling.
Give a warning and do not create an event if its execution time is in
the past, and ON COMPLETION NOT PRESERVE is set, because such an event
should be dropped by that time. Also, do not allow ALTER EVENT to
set execution time in the past when ON COMPLETION NOT PRESERVE is set.
sql/event_db_repository.h:
Add enum member for new time zone column.
sql/event_queue.cc:
Replace handling of broken down times with simple handling of
my_time_t.
sql/event_queue.h:
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_scheduler.cc:
Add TODO comment.
sql/events.cc:
Send time_zone column for SHOW CREATE EVENT.
sql/share/errmsg.txt:
Update error message, and add two more errors.
sql/sql_show.cc:
Add TIME_ZONE column to the output of SHOW EVENTS.
mysql-test/r/events_time_zone.result:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/r/events_time_zone.result
mysql-test/t/events_time_zone.test:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/t/events_time_zone.test
2007-03-16 15:31:07 +01:00
|
|
|
|
show events;
|
|
|
|
|
|
2006-07-10 13:44:43 +02:00
|
|
|
|
--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;
|
|
|
|
|
|
2006-03-03 01:39:11 +01:00
|
|
|
|
#
|
|
|
|
|
# End - 16396: Events: Distant-future dates become past dates
|
|
|
|
|
#
|
|
|
|
|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
#
|
|
|
|
|
# Start - 16407: Events: Changes in sql_mode won't be taken into account
|
|
|
|
|
#
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler=off;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2006-02-20 23:52:22 +01:00
|
|
|
|
delete from mysql.event;
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler= on;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2006-02-20 23:52:22 +01:00
|
|
|
|
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 ;|
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# The default session has the user lock.
|
|
|
|
|
# We wait till one event runs and hangs when trying to get the user lock.
|
2007-01-19 16:33:48 +01:00
|
|
|
|
let $wait_condition=
|
2008-11-04 12:27:21 +01:00
|
|
|
|
select count(*) > 0 from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
|
2007-01-19 16:33:48 +01:00
|
|
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
|
|
|
|
--echo "Now if everything is fine the event has compiled and is locked"
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# Expect to see one session in events_test waiting for the user lock.
|
|
|
|
|
select /*1*/ user, host, db, info from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
|
2006-02-20 23:52:22 +01:00
|
|
|
|
select release_lock('test_bug16407');
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# Try to avoid
|
|
|
|
|
# Bug#39863 events_bugs fails sporadically on pushbuild (extra processes in I_S.PROCESSLIST)
|
|
|
|
|
# which is most probably caused by
|
|
|
|
|
# Bug#32782 User lock hash fails to find lock
|
|
|
|
|
# "various issues related to missing or incorrect return results
|
|
|
|
|
# from release_lock()."
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# Therefore we check here if the event executor is no more locked or
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# we waited >= 5 seconds for this to happen.
|
|
|
|
|
let $wait_timeout= 5;
|
|
|
|
|
let $wait_condition=
|
|
|
|
|
select count(*) = 0 from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
|
2008-11-04 12:27:21 +01:00
|
|
|
|
--source include/wait_condition.inc
|
|
|
|
|
if (!`$wait_condition`)
|
|
|
|
|
{
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--echo ERROR: There must be no session with
|
|
|
|
|
--echo state = 'User lock' and info = 'select get_lock('test_bug16407', 60)
|
|
|
|
|
--echo within the processlist.
|
2008-11-04 12:27:21 +01:00
|
|
|
|
--echo We probably hit Bug#32782 User lock hash fails to find lock
|
2009-01-09 15:10:03 +01:00
|
|
|
|
SELECT * FROM information_schema.processlist;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
--echo Abort
|
|
|
|
|
exit;
|
|
|
|
|
}
|
2006-07-10 13:44:43 +02:00
|
|
|
|
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler= off;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# Wait till the event scheduler and all event executors have finished their work.
|
|
|
|
|
--source include/check_events_off.inc
|
2006-07-10 13:44:43 +02:00
|
|
|
|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
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;
|
|
|
|
|
|
2006-07-10 13:44:43 +02:00
|
|
|
|
set sql_mode="ansi";
|
|
|
|
|
select get_lock('ee_16407_2', 60);
|
|
|
|
|
|
|
|
|
|
set global event_scheduler= 1;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2006-02-20 23:52:22 +01:00
|
|
|
|
--echo "Another sql_mode test"
|
|
|
|
|
set sql_mode="traditional";
|
2009-01-09 15:10:03 +01:00
|
|
|
|
create table events_smode_test(ev_name char(10), a date);
|
2006-02-20 23:52:22 +01:00
|
|
|
|
--echo "This should never insert something"
|
|
|
|
|
delimiter |;
|
|
|
|
|
create event ee_16407_2 on schedule every 60 second do
|
|
|
|
|
begin
|
2006-03-16 16:41:00 +01:00
|
|
|
|
select get_lock('ee_16407_2', 60) /*ee_16407_2*/;
|
2006-07-10 13:44:43 +02:00
|
|
|
|
select release_lock('ee_16407_2');
|
2006-02-20 23:52:22 +01:00
|
|
|
|
insert into events_test.events_smode_test values('ee_16407_2','1980-19-02');
|
|
|
|
|
end|
|
2006-03-24 17:45:52 +01:00
|
|
|
|
--error ER_TRUNCATED_WRONG_VALUE
|
2009-01-09 15:10:03 +01:00
|
|
|
|
insert into events_test.events_smode_test values ('test','1980-19-02')|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
--echo "This is ok"
|
|
|
|
|
create event ee_16407_3 on schedule every 60 second do
|
|
|
|
|
begin
|
2006-03-16 16:41:00 +01:00
|
|
|
|
select get_lock('ee_16407_2', 60) /*ee_16407_3*/;
|
2006-07-10 13:44:43 +02:00
|
|
|
|
select release_lock('ee_16407_2');
|
2006-02-20 23:52:22 +01:00
|
|
|
|
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
|
2006-03-16 16:41:00 +01:00
|
|
|
|
select get_lock('ee_16407_2', 60) /*ee_16407_4*/;
|
2006-07-10 13:44:43 +02:00
|
|
|
|
select release_lock('ee_16407_2');
|
2006-02-20 23:52:22 +01:00
|
|
|
|
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;
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# We wait till we have three event executors waiting for the removal of the lock.
|
2007-01-19 16:33:48 +01:00
|
|
|
|
let $wait_condition=
|
|
|
|
|
select count(*) = 3 from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
|
2007-01-19 16:33:48 +01:00
|
|
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# There is an extreme low risk that an additional event execution is just coming
|
|
|
|
|
# up because
|
|
|
|
|
# - the events have to be started every 60 seconds.
|
|
|
|
|
# - we are just after event creation + waiting for seeing 3 locked
|
|
|
|
|
# We expect to see three event executors in state 'User lock'.
|
2008-11-04 12:27:21 +01:00
|
|
|
|
select /*2*/ user, host, db, info from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
|
|
|
|
|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
select release_lock('ee_16407_2');
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# Try to avoid
|
|
|
|
|
# Bug#39863 events_bugs fails sporadically on pushbuild (extra processes in I_S.PROCESSLIST)
|
|
|
|
|
# which is most probably caused by
|
|
|
|
|
# Bug#32782 User lock hash fails to find lock
|
|
|
|
|
# "various issues related to missing or incorrect return results
|
|
|
|
|
# from release_lock()."
|
|
|
|
|
# Therefore we check here if the event executing sessions disappeared or
|
|
|
|
|
# we waited >= 5 seconds for this to happen.
|
|
|
|
|
let $wait_timeout= 5;
|
2007-01-19 16:33:48 +01:00
|
|
|
|
let $wait_condition=
|
2008-11-04 12:27:21 +01:00
|
|
|
|
select count(*) = 0
|
2007-01-19 16:33:48 +01:00
|
|
|
|
from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
|
2007-01-19 16:33:48 +01:00
|
|
|
|
--source include/wait_condition.inc
|
2009-01-09 15:10:03 +01:00
|
|
|
|
if (!`$wait_condition`)
|
|
|
|
|
{
|
|
|
|
|
--echo ERROR: There must be no session with
|
|
|
|
|
--echo state = 'User lock' and info = 'select get_lock('test_bug16407_2', 60)
|
|
|
|
|
--echo within the processlist.
|
|
|
|
|
--echo We probably hit Bug#32782 User lock hash fails to find lock
|
|
|
|
|
SELECT * FROM information_schema.processlist;
|
|
|
|
|
--echo Abort
|
|
|
|
|
exit;
|
|
|
|
|
}
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# We expect to see no event executors in state 'User lock'.
|
|
|
|
|
if(!$fixed_bug41925)
|
|
|
|
|
{
|
|
|
|
|
--disable_warnings
|
|
|
|
|
}
|
2008-11-04 12:27:21 +01:00
|
|
|
|
select /*3*/ user, host, db, info from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
|
|
|
|
|
if(!$fixed_bug41925)
|
|
|
|
|
{
|
|
|
|
|
--enable_warnings
|
|
|
|
|
}
|
|
|
|
|
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler= off;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# Wait till the event scheduler and all event executors have finished their work.
|
|
|
|
|
# Without this the next queries will give unstable results.
|
|
|
|
|
--source include/check_events_off.inc
|
|
|
|
|
|
|
|
|
|
select * from events_test.events_smode_test order by ev_name, a;
|
2006-02-20 23:52:22 +01:00
|
|
|
|
--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"
|
2009-01-09 15:10:03 +01:00
|
|
|
|
delete from events_test.events_smode_test;
|
2006-07-10 13:44:43 +02:00
|
|
|
|
set sql_mode='ansi';
|
|
|
|
|
select get_lock('ee_16407_5', 60);
|
|
|
|
|
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler= on;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2006-07-10 13:44:43 +02:00
|
|
|
|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
set sql_mode='traditional';
|
|
|
|
|
delimiter |;
|
2007-01-19 16:33:48 +01:00
|
|
|
|
# ee_16407_5_pendant() should not insert anything because of invalid date.
|
2006-02-20 23:52:22 +01:00
|
|
|
|
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
|
2006-03-16 16:41:00 +01:00
|
|
|
|
select get_lock('ee_16407_5', 60) /*ee_16407_5*/;
|
2006-07-10 13:44:43 +02:00
|
|
|
|
select release_lock('ee_16407_5');
|
2006-02-20 23:52:22 +01:00
|
|
|
|
call events_test.ee_16407_5_pendant();
|
|
|
|
|
end|
|
|
|
|
|
create event ee_16407_6 on schedule every 60 second do
|
|
|
|
|
begin
|
2006-03-16 16:41:00 +01:00
|
|
|
|
select get_lock('ee_16407_5', 60) /*ee_16407_6*/;
|
2006-07-10 13:44:43 +02:00
|
|
|
|
select release_lock('ee_16407_5');
|
2006-02-20 23:52:22 +01:00
|
|
|
|
call events_test.ee_16407_6_pendant();
|
|
|
|
|
end|
|
|
|
|
|
delimiter ;|
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
|
|
|
|
let $wait_condition=
|
|
|
|
|
select count(*) = 2 from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
|
2007-01-19 16:33:48 +01:00
|
|
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
2006-03-16 16:41:00 +01:00
|
|
|
|
--echo "Should have 2 locked processes"
|
2008-11-04 12:27:21 +01:00
|
|
|
|
select /*4*/ user, host, db, info from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
|
|
|
|
|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
select release_lock('ee_16407_5');
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
|
|
|
|
let $wait_condition=
|
2009-01-09 15:10:03 +01:00
|
|
|
|
select count(*) = 0 from information_schema.processlist
|
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
|
2007-01-19 16:33:48 +01:00
|
|
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
2006-03-16 16:41:00 +01:00
|
|
|
|
--echo "Should have 0 processes locked"
|
2009-01-09 15:10:03 +01:00
|
|
|
|
if(!$fixed_bug41925)
|
|
|
|
|
{
|
|
|
|
|
--disable_warnings
|
|
|
|
|
}
|
2008-11-04 12:27:21 +01:00
|
|
|
|
select /*5*/ user, host, db, info from information_schema.processlist
|
2009-01-09 15:10:03 +01:00
|
|
|
|
where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
|
|
|
|
|
if(!$fixed_bug41925)
|
|
|
|
|
{
|
|
|
|
|
--enable_warnings
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Wait till all event executors have finished their work, so that we can be sure
|
|
|
|
|
# that their changes to events_smode_test are done.
|
|
|
|
|
--source include/no_running_events.inc
|
|
|
|
|
|
|
|
|
|
select * from events_test.events_smode_test order by ev_name, a;
|
2006-02-20 23:52:22 +01:00
|
|
|
|
--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;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
|
2006-02-20 23:52:22 +01:00
|
|
|
|
drop event ee_16407_5;
|
|
|
|
|
drop event ee_16407_6;
|
|
|
|
|
drop procedure ee_16407_5_pendant;
|
|
|
|
|
drop procedure ee_16407_6_pendant;
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler= off;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2006-02-20 23:52:22 +01:00
|
|
|
|
drop table events_smode_test;
|
|
|
|
|
set sql_mode=@old_sql_mode;
|
|
|
|
|
#
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# End - 16407: Events: Changes in sql_mode won't be taken into account
|
2006-02-20 23:52:22 +01:00
|
|
|
|
#
|
2006-06-23 17:29:01 +02:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# START - 18897: Events: unauthorized action possible with alter event rename
|
|
|
|
|
#
|
WL#3337 (Event scheduler new architecture)
This is a post-review patch.
Fixes the typelib implementation, available only in 5.1.11.
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_restart_phase1.result:
update result
mysql-test/r/events_restart_phase3.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/events.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_bugs.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_logs_tests.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase1.test:
update test:
2 -> off
1 -> on
mysql-test/t/events_restart_phase2-master.opt:
update master file : 1 => on
mysql-test/t/events_scheduling.test:
update test:
2 -> off
1 -> on
add tests for event_scheduler global variable representation from
SHOW VARIABLES.
mysql-test/t/events_stress.test:
update test:
2 -> off
1 -> on
sql/events.cc:
Implement two different TYPELIBs for --event-scheduler cmd line
option and for GLOBAL variable event_scheduler
--event-scheduler cmdline : DISABLED | ON | OFF | 0 | 1
DISABLED - makes the scheduler unavailable during the server run
(ON|1)- When the server is started the scheduler will be started. It can
be stopped and restarted by setting appropriate values to
GLOBAL event_scheduler
(OFF|0)- When the server is started, the scheduler won't be started. It
can be started and again stopped by setting appropriate values to
GLOBAL event_scheduler. _DEFAULT_ value
The GLOBAL variable event_scheduler can have the following values:
OFF | ON | 0 | 1
DISABLED is not possible and every attempt will end with an error that
it's not a valid value for the variable.
OFF | 0 - This is the pre-5.1.11 behavior - The scheduler stops, if not
already stopped, and can be started again by setting
the value of the variable to ON|1.
ON | 1 - This is the pre-5.1.11 behavior - The scheduler starts, if not
already started, and can be stopped again by setting the value
of the variable to OFF|0.
sql/events.h:
additional TYPELIB for GLOBAL event_scheduler
sql/mysqld.cc:
--event-scheduler should be checked against a TYPELIB and
therefore should be GET_STR, as well as we make the parameter optional.
When not provided OFF|0 is used.
sql/set_var.cc:
Implement typelib for event_scheduler variable.
If allows both INT_RESULT -> 0 | 1
and STRING_RESULT -> OFF | ON
The variable is shown as DISABLED | ON | OFF
sql/set_var.h:
Implement typelib, which expects both STRING and INT,
for event_scheduler.
2006-09-01 13:08:44 +02:00
|
|
|
|
set global event_scheduler=off;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2006-06-23 17:29:01 +02:00
|
|
|
|
--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
|
|
|
|
|
#
|
|
|
|
|
|
2006-06-29 11:53:51 +02:00
|
|
|
|
#
|
|
|
|
|
# START - BUG#16394: Events: Crash if schedule contains SELECT
|
|
|
|
|
#
|
2006-11-02 13:51:43 +01:00
|
|
|
|
--error ER_NOT_SUPPORTED_YET
|
2006-06-29 11:53:51 +02:00
|
|
|
|
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
2006-11-02 13:51:43 +01:00
|
|
|
|
--error ER_NOT_SUPPORTED_YET
|
2006-06-29 11:53:51 +02:00
|
|
|
|
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
2006-11-02 13:51:43 +01:00
|
|
|
|
--error ER_NOT_SUPPORTED_YET
|
2006-06-29 11:53:51 +02:00
|
|
|
|
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
2006-11-02 13:51:43 +01:00
|
|
|
|
--error ER_NOT_SUPPORTED_YET
|
2006-06-29 11:53:51 +02:00
|
|
|
|
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
|
|
|
|
|
#
|
|
|
|
|
|
2006-09-25 16:49:25 +02:00
|
|
|
|
#
|
|
|
|
|
# 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;
|
2006-11-02 13:51:43 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 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;
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
|
|
|
|
select get_lock('ee_22830', 60);
|
|
|
|
|
set global event_scheduler=on;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
|
|
|
|
delimiter |;
|
|
|
|
|
create procedure p22830_wait()
|
|
|
|
|
begin
|
|
|
|
|
select get_lock('ee_22830', 60);
|
|
|
|
|
select release_lock('ee_22830');
|
|
|
|
|
end|
|
|
|
|
|
|
2006-11-02 13:51:43 +01:00
|
|
|
|
--error ER_NOT_SUPPORTED_YET
|
2007-01-19 16:33:48 +01:00
|
|
|
|
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()"
|
2006-11-02 13:51:43 +01:00
|
|
|
|
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
2007-01-19 16:33:48 +01:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
2006-11-02 13:51:43 +01:00
|
|
|
|
set global event_scheduler=off;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2006-11-02 13:51:43 +01:00
|
|
|
|
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
2007-01-19 16:33:48 +01:00
|
|
|
|
drop procedure p22830_wait;
|
2006-11-02 13:51:43 +01:00
|
|
|
|
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;
|
|
|
|
|
|
2007-02-02 18:43:33 +01:00
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# 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;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
DROP EVENT e1;
|
|
|
|
|
|
|
|
|
|
CREATE DEFINER=CURRENT_USER EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
ALTER DEFINER=mysqltest_u1@localhost EVENT e1 ON SCHEDULE EVERY 1 HOUR;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
DROP EVENT e1;
|
|
|
|
|
|
|
|
|
|
CREATE DEFINER=CURRENT_USER() EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
DROP EVENT e1;
|
|
|
|
|
|
|
|
|
|
CREATE DEFINER=mysqltest_u1@localhost EVENT e1 ON SCHEDULE EVERY 1 DAY DO
|
|
|
|
|
SELECT 1;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
DROP EVENT e1;
|
|
|
|
|
|
|
|
|
|
connect (conn1, localhost, mysqltest_u1, , events_test);
|
|
|
|
|
|
|
|
|
|
CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
DROP EVENT e1;
|
|
|
|
|
|
|
|
|
|
CREATE DEFINER=CURRENT_USER EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
|
|
|
|
|
ALTER DEFINER=root@localhost EVENT e1 ON SCHEDULE EVERY 1 HOUR;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
DROP EVENT e1;
|
|
|
|
|
|
|
|
|
|
CREATE DEFINER=CURRENT_USER() EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SELECT event_name, definer FROM INFORMATION_SCHEMA.EVENTS;
|
2007-02-02 18:43:33 +01:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
2006-11-02 13:51:43 +01:00
|
|
|
|
#
|
A set of changes aiming to make the Event Scheduler more user-friendly
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.
2007-04-05 13:24:34 +02:00
|
|
|
|
# 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;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
A set of changes aiming to make the Event Scheduler more user-friendly
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.
2007-04-05 13:24:34 +02:00
|
|
|
|
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;
|
|
|
|
|
|
2007-05-25 14:46:22 +02:00
|
|
|
|
#
|
|
|
|
|
# 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;
|
|
|
|
|
|
2007-06-27 08:06:37 +02:00
|
|
|
|
#
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# START - BUG#28924 If I drop the user who is the definer of an active event
|
|
|
|
|
# then server cores
|
2007-06-27 08:06:37 +02:00
|
|
|
|
#
|
|
|
|
|
let $engine=MyISAM;
|
|
|
|
|
USE test;
|
|
|
|
|
SHOW GRANTS FOR CURRENT_USER;
|
|
|
|
|
SET GLOBAL event_scheduler = ON;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2008-11-04 12:27:21 +01:00
|
|
|
|
eval
|
|
|
|
|
CREATE TABLE events_test.event_log
|
|
|
|
|
(id int KEY AUTO_INCREMENT, ev_nm char(40), ev_cnt int, ev_tm timestamp)
|
|
|
|
|
ENGINE=$engine;
|
2007-06-27 08:06:37 +02:00
|
|
|
|
SET autocommit=0;
|
|
|
|
|
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;
|
2007-07-01 20:00:29 +02:00
|
|
|
|
GRANT select,insert ON test.* TO evtest1@localhost;
|
2007-06-27 08:06:37 +02:00
|
|
|
|
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);
|
|
|
|
|
DELIMITER |;
|
|
|
|
|
CREATE EVENT ev_sched_1823 ON SCHEDULE EVERY 2 SECOND
|
|
|
|
|
DO BEGIN
|
2008-11-04 12:27:21 +01:00
|
|
|
|
SET AUTOCOMMIT = 0;
|
|
|
|
|
SET @evname = 'ev_sched_1823';
|
|
|
|
|
SET @cnt = 0;
|
|
|
|
|
SELECT COUNT(*) INTO @cnt FROM events_test.event_log WHERE ev_nm = @evname;
|
|
|
|
|
IF @cnt < 6 THEN
|
|
|
|
|
INSERT INTO events_test.event_log VALUES (NULL,@evname,@cnt+1,current_timestamp());
|
|
|
|
|
COMMIT;
|
|
|
|
|
END IF;
|
|
|
|
|
SELECT COUNT(*) INTO @cnt FROM events_test.event_log WHERE ev_nm = @evname;
|
|
|
|
|
IF @cnt < 6 THEN
|
|
|
|
|
INSERT INTO events_test.event_log VALUES (NULL,@evname,@cnt+1,current_timestamp());
|
|
|
|
|
ROLLBACK;
|
|
|
|
|
END IF;
|
2007-06-27 08:06:37 +02:00
|
|
|
|
END;|
|
|
|
|
|
DELIMITER ;|
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# 1. Show that the new created event is runnable and gets executed within a
|
|
|
|
|
# reasonable time like 4 seconds. Till ~ 2 seconds could pass on a heavy
|
|
|
|
|
# loaded testing box before something gets executed).
|
|
|
|
|
# Detection of execution is via the records inserted by the event.
|
|
|
|
|
--echo Sleep till the first INSERT into events_test.event_log occured
|
|
|
|
|
let $wait_timeout= 4;
|
|
|
|
|
let $wait_condition=
|
|
|
|
|
SELECT COUNT(*) > 0 FROM events_test.event_log;
|
|
|
|
|
--source include/wait_condition.inc
|
|
|
|
|
SELECT COUNT(*) > 0 AS "Expect 1" FROM events_test.event_log;
|
|
|
|
|
#
|
2007-06-27 08:06:37 +02:00
|
|
|
|
--echo connection default;
|
|
|
|
|
connection default;
|
|
|
|
|
DROP USER evtest1@localhost;
|
2008-11-04 12:27:21 +01:00
|
|
|
|
# 2. If we meet BUG#28924 again than a server crash happens within the next
|
|
|
|
|
# few seconds
|
|
|
|
|
# 3. Check that the event is never executed again
|
|
|
|
|
# It could be that an event execution was running before the DROP USER
|
|
|
|
|
# and all implicite actions belonging to this are completed.
|
|
|
|
|
# Lets assume that ~ 4 seconds waiting are enough for the event
|
|
|
|
|
# scheduler to detect that
|
|
|
|
|
--echo Sleep 4 seconds
|
|
|
|
|
sleep 4;
|
|
|
|
|
SELECT COUNT(*) INTO @row_cnt FROM events_test.event_log;
|
|
|
|
|
# Give the event mechanism ~ 4 seconds to do something wrong
|
|
|
|
|
# (execute the event of the dropped user -> inser rows).
|
|
|
|
|
--echo Sleep 4 seconds
|
|
|
|
|
sleep 4;
|
|
|
|
|
SELECT COUNT(*) > @row_cnt AS "Expect 0" FROM events_test.event_log;
|
|
|
|
|
#
|
|
|
|
|
# Cleanup
|
|
|
|
|
disconnect e1;
|
|
|
|
|
DROP EVENT events_test.ev_sched_1823;
|
|
|
|
|
DROP TABLE events_test.event_log;
|
2007-06-27 08:06:37 +02:00
|
|
|
|
SET GLOBAL event_scheduler = OFF;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2007-05-26 16:36:38 +02:00
|
|
|
|
|
2008-11-04 12:27:21 +01:00
|
|
|
|
|
2007-07-25 09:43:49 +02:00
|
|
|
|
#
|
|
|
|
|
# Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash.
|
|
|
|
|
#
|
|
|
|
|
SET GLOBAL event_scheduler= ON;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2007-07-25 09:43:49 +02:00
|
|
|
|
DELIMITER |;
|
|
|
|
|
CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
|
2008-11-04 12:27:21 +01:00
|
|
|
|
DO BEGIN
|
|
|
|
|
SELECT 1;
|
|
|
|
|
END;|
|
2007-07-25 09:43:49 +02:00
|
|
|
|
|
|
|
|
|
DELIMITER ;|
|
|
|
|
|
SET GLOBAL event_scheduler= OFF;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
2007-07-25 09:43:49 +02:00
|
|
|
|
DROP EVENT bug28641;
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
|
|
|
|
|
###########################################################################
|
|
|
|
|
|
|
|
|
|
--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;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
|
|
|
|
|
--echo
|
|
|
|
|
|
|
|
|
|
--echo # Waiting for the event scheduler to execute and drop event e1...
|
|
|
|
|
|
2008-11-04 12:27:21 +01:00
|
|
|
|
let $wait_timeout = 4;
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
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;
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/check_events_off.inc
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
|
|
|
|
|
--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
|
|
|
|
|
|
2008-02-07 11:47:39 +01:00
|
|
|
|
#
|
|
|
|
|
# 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, 'ALLOW_INVALID_DATES', 'INVALID_DATES') into @full_mode;
|
|
|
|
|
select name from mysql.event where name = 'p' and sql_mode = @full_mode;
|
|
|
|
|
drop event e1;
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
|
2009-03-11 21:30:56 +01:00
|
|
|
|
#
|
|
|
|
|
# Bug#36540: CREATE EVENT and ALTER EVENT statements fail with large server_id
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
SET @old_server_id = @@GLOBAL.server_id;
|
|
|
|
|
SET GLOBAL server_id = (1 << 32) - 1;
|
|
|
|
|
SELECT @@GLOBAL.server_id;
|
|
|
|
|
CREATE EVENT ev1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
|
|
|
|
|
SELECT event_name, originator FROM INFORMATION_SCHEMA.EVENTS;
|
|
|
|
|
DROP EVENT ev1;
|
|
|
|
|
SET GLOBAL server_id = @old_server_id;
|
|
|
|
|
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
###########################################################################
|
2008-11-04 12:27:21 +01:00
|
|
|
|
#
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
# End of tests
|
|
|
|
|
#
|
|
|
|
|
# !!! KEEP this section AT THE END of this file !!!
|
|
|
|
|
#
|
|
|
|
|
###########################################################################
|
|
|
|
|
|
2009-01-09 15:10:03 +01:00
|
|
|
|
# Ensure that all event executors have finished their work and cannot harm
|
|
|
|
|
# the next test.
|
|
|
|
|
--source include/no_running_events.inc
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
|
|
|
|
|
DROP DATABASE events_test;
|
2008-11-12 18:51:47 +01:00
|
|
|
|
# Restore the original state i.e to how it was when test started
|
|
|
|
|
# (option with no argument in events_bugs-master.opt turns the scheduler on).
|
2008-04-09 09:48:06 +02:00
|
|
|
|
SET GLOBAL event_scheduler= 'ON';
|
2009-01-09 15:10:03 +01:00
|
|
|
|
--source include/running_event_scheduler.inc
|
2009-01-23 13:22:05 +01:00
|
|
|
|
SET @@global.concurrent_insert= @concurrent_insert;
|
2008-04-09 09:48:06 +02:00
|
|
|
|
|
Patch for BUG#31111: --read-only crashes MySQL (events fail to load).
There actually were several problems here:
- WRITE-lock is required to load events from the mysql.event table,
but in the read-only mode an ordinary user can not acquire it;
- Security_context::master_access attribute was not properly
initialized in Security_context::init(), which led to differences
in behavior with and without debug configure options.
- if the server failed to load events from mysql.event, it forgot to
close the mysql.event table, that led to the coredump, described
in the bug report.
The patch is to fix all these problems:
- Use the super-user to acquire WRITE-lock on the mysql.even table;
- The WRITE-lock is acquired by the event scheduler in two cases:
- on initial loading of events from the database;
- when an event has been executed, so its attributes should
be updated.
Other cases when WRITE-lock is needed for the mysql.event table
happen under the user account. So, nothing should be changed there
for the read-only mode. The user is able to create/update/drop
an event only if he is a super-user.
- Initialize Security_context::master_access;
- Close the mysql.event table in case something went wrong.
mysql-test/r/events_bugs.result:
Update result file.
mysql-test/t/events_bugs.test:
A test case for BUG#31111: --read-only crashes MySQL (events fail
to load).
sql/event_data_objects.cc:
When the worker thread is going to drop event after the execution
we should do it under the super-user privileges in order to be able
to lock the mysql.event table for writing in the read-only mode.
This is a system operation, where user SQL can not be executed.
So, there is no risk in compromising security by dropping an event
under the super-user privileges.
sql/event_db_repository.cc:
1. Close tables if something went wrong in simple_open_n_lock_tables();
2. As soon as the system event scheduler thread is running under
the super-user privileges, we should always be able to acquire
WRITE-lock on the mysql.event table. However, let's have an assert
to check this.
sql/event_scheduler.cc:
Run the system event scheduler thread under the super-user privileges.
In particular, this is needed to be able to lock the mysql.event table
for writing when the server is running in the read-only mode.
The event scheduler executes only system operations and does not
execute user SQL (this is what the worker threads for). So, there
is no risk in compromising security by running the event scheduler
under the super-user privileges.
sql/events.cc:
Open the mysql.event table as the super user to be able to acquire
WRITE-lock in the read-only mode.
sql/sql_class.cc:
Initialize Security_context::master_acces.
2007-10-19 17:57:08 +02:00
|
|
|
|
# THIS MUST BE THE LAST LINE in this file.
|