mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
16f26d2aaf
The problem was that wrong structure of mysql.event was not detected and the server continued to use wrongly-structured data. The fix is to check the structure of mysql.event after opening before any use. That makes operations with events more strict -- some operations that might work before throw errors now. That seems to be Ok. Another side-effect of the patch is that if mysql.event is corrupted, unrelated DROP DATABASE statements issue an SQL warning about inability to open mysql.event table.
108 lines
3.9 KiB
Text
108 lines
3.9 KiB
Text
# Can't test with embedded server that doesn't support grants
|
|
-- source include/not_embedded.inc
|
|
|
|
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
|
|
|
|
#
|
|
# Test that when the server is restarted, it checks mysql.event table,
|
|
# and disables the scheduler if it's not up to date.
|
|
#
|
|
|
|
# Switch off the scheduler for now.
|
|
set global event_scheduler=off;
|
|
|
|
--disable_warnings
|
|
drop database if exists events_test;
|
|
--enable_warnings
|
|
create database events_test;
|
|
use events_test;
|
|
create table execution_log(name char(10));
|
|
|
|
create event abc1 on schedule every 1 second do
|
|
insert into execution_log value('abc1');
|
|
create event abc2 on schedule every 1 second do
|
|
insert into execution_log value('abc2');
|
|
create event abc3 on schedule every 1 second do
|
|
insert into execution_log value('abc3');
|
|
#
|
|
# There are various conditions when a server would regard mysql.event
|
|
# table as damaged:
|
|
# - the table has more column than specified in the compiled in value, but
|
|
# the version of the server which created the table is the same
|
|
# - the column count in the table is less than the compiled in value
|
|
# - some column has an incompatible type specification (for what is an
|
|
# incompatible type specification please refer to the comments in the source
|
|
#
|
|
# Unfortunately, in order to test a condition, we need to restart the
|
|
# server. Therefore, here we test only one simple case: changing the data
|
|
# type of the 'body' field to blob.
|
|
#
|
|
# First, let's do a backup to not depend on actual definition of mysql.event
|
|
create table event_like like mysql.event;
|
|
insert into event_like select * from mysql.event;
|
|
# Now let's alter the table and restart the server
|
|
alter table mysql.event
|
|
change column body body longtext character set utf8 collate utf8_bin;
|
|
--echo "Now we restart the server"
|
|
|
|
--source include/restart_mysqld.inc
|
|
|
|
use events_test;
|
|
# Event scheduler should be disabled: the system tables are damaged
|
|
select @@event_scheduler;
|
|
# Try various Event Scheduler operation and check the output.
|
|
--error ER_EVENTS_DB_ERROR
|
|
show events;
|
|
--error ER_EVENTS_DB_ERROR
|
|
select event_name from information_schema.events;
|
|
--error ER_EVENTS_DB_ERROR
|
|
show create event intact_check;
|
|
--error ER_EVENTS_DB_ERROR
|
|
drop event no_such_event;
|
|
--error ER_EVENTS_DB_ERROR
|
|
create event intact_check_1 on schedule every 5 hour do select 5;
|
|
--error ER_EVENTS_DB_ERROR
|
|
alter event intact_check_1 on schedule every 8 hour do select 8;
|
|
--error ER_EVENTS_DB_ERROR
|
|
alter event intact_check_1 rename to intact_check_2;
|
|
--error ER_EVENTS_DB_ERROR
|
|
drop event intact_check_1;
|
|
--error ER_EVENTS_DB_ERROR
|
|
drop event intact_check_2;
|
|
--error ER_EVENTS_DB_ERROR
|
|
drop event intact_check;
|
|
--error ER_EVENTS_DB_ERROR
|
|
set global event_scheduler=on;
|
|
--error ER_EVENTS_DB_ERROR
|
|
set global event_scheduler=off;
|
|
show variables like 'event_scheduler';
|
|
--echo Make sure that we still can create and drop databases,
|
|
--echo and no warnings are produced.
|
|
drop database if exists mysqltest_database_not_exists;
|
|
create database mysqltest_db1;
|
|
drop database mysqltest_db1;
|
|
--echo Restore the original mysql.event table
|
|
drop table mysql.event;
|
|
rename table event_like to mysql.event;
|
|
--echo Now let's restart the server again
|
|
|
|
--source include/restart_mysqld.inc
|
|
|
|
# We need this file primarily to make sure that the scheduler is restarted
|
|
# and enabled after we have restored mysql.event table.
|
|
# This is the final step of the "cleanup".
|
|
#
|
|
# Make sure also that events are executed OK after restart, just in case.
|
|
use events_test;
|
|
# Make sure the scheduler was started successfully
|
|
select @@event_scheduler;
|
|
let $wait_condition=select count(distinct name)=3 from execution_log;
|
|
--source include/wait_condition.inc
|
|
drop table execution_log;
|
|
# Will drop all events
|
|
drop database events_test;
|
|
|
|
let $wait_condition=
|
|
select count(*) = 0 from information_schema.processlist
|
|
where db='events_test' and command = 'Connect' and user=current_user();
|
|
--source include/wait_condition.inc
|