109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								# 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
							 |