153 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			153 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								DROP DATABASE IF EXISTS mysqltest_db1;
							 | 
						||
| 
								 | 
							
								CREATE DATABASE mysqltest_db1;
							 | 
						||
| 
								 | 
							
								USE mysqltest_db1;
							 | 
						||
| 
								 | 
							
								SET GLOBAL EVENT_SCHEDULER= OFF;
							 | 
						||
| 
								 | 
							
								SET @save_time_zone= @@TIME_ZONE;
							 | 
						||
| 
								 | 
							
								CREATE TABLE t_step (step INT);
							 | 
						||
| 
								 | 
							
								INSERT INTO t_step VALUES (@step);
							 | 
						||
| 
								 | 
							
								CREATE FUNCTION round_to_step(i INT, n INT) RETURNS INT
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								DECLARE step INT;
							 | 
						||
| 
								 | 
							
								SELECT * INTO step FROM t_step;
							 | 
						||
| 
								 | 
							
								# We add 0.1 as a protection from inexact division.
							 | 
						||
| 
								 | 
							
								RETURN FLOOR((i % (step * n) + 0.1) / step);
							 | 
						||
| 
								 | 
							
								END//
							 | 
						||
| 
								 | 
							
								SET @step3= @step * 3;
							 | 
						||
| 
								 | 
							
								SET @step6= @step * 6;
							 | 
						||
| 
								 | 
							
								SET @unix_time= UNIX_TIMESTAMP() - 1;
							 | 
						||
| 
								 | 
							
								SET @unix_time= @unix_time - @unix_time % @step6;
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone VALUES (NULL, 'N');
							 | 
						||
| 
								 | 
							
								SET @tzid= LAST_INSERT_ID();
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition_type
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, 0, 0, 0, 'b16420_0');
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition_type
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, 1, @step3 - @step, 1, 'b16420_1');
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_name VALUES ('<TZ_NAME_1>', @tzid);
							 | 
						||
| 
								 | 
							
								CREATE TABLE t1 (count INT, unix_time INT, local_time INT, comment CHAR(80));
							 | 
						||
| 
								 | 
							
								CREATE TABLE t2 (count INT);
							 | 
						||
| 
								 | 
							
								INSERT INTO t2 VALUES (1);
							 | 
						||
| 
								 | 
							
								CREATE FUNCTION f1(comment CHAR(80)) RETURNS INT
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								DECLARE orig_tz CHAR(64);
							 | 
						||
| 
								 | 
							
								DECLARE unix_time INT;
							 | 
						||
| 
								 | 
							
								DECLARE local_now DATETIME;
							 | 
						||
| 
								 | 
							
								DECLARE utc_now DATETIME;
							 | 
						||
| 
								 | 
							
								DECLARE local_time INT;
							 | 
						||
| 
								 | 
							
								SET unix_time= UNIX_TIMESTAMP();
							 | 
						||
| 
								 | 
							
								SET local_now= FROM_UNIXTIME(unix_time);
							 | 
						||
| 
								 | 
							
								SET orig_tz= @@TIME_ZONE;
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE = '+00:00';
							 | 
						||
| 
								 | 
							
								SET utc_now= FROM_UNIXTIME(unix_time);
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= orig_tz;
							 | 
						||
| 
								 | 
							
								SET local_time = unix_time + TIMESTAMPDIFF(SECOND, utc_now, local_now);
							 | 
						||
| 
								 | 
							
								SET unix_time= round_to_step(unix_time, 6);
							 | 
						||
| 
								 | 
							
								SET local_time= round_to_step(local_time, 6);
							 | 
						||
| 
								 | 
							
								INSERT INTO t1 VALUES ((SELECT count FROM t2),
							 | 
						||
| 
								 | 
							
								unix_time, local_time, comment);
							 | 
						||
| 
								 | 
							
								RETURN 0;
							 | 
						||
| 
								 | 
							
								END//
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= '+00:00';
							 | 
						||
| 
								 | 
							
								CREATE EVENT e1 ON SCHEDULE EVERY @step SECOND
							 | 
						||
| 
								 | 
							
								STARTS FROM_UNIXTIME(@unix_time) DO SELECT f1("<e1>");
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= '<TZ_NAME_1>';
							 | 
						||
| 
								 | 
							
								CREATE EVENT e2 ON SCHEDULE EVERY @step SECOND
							 | 
						||
| 
								 | 
							
								STARTS FROM_UNIXTIME(@unix_time) DO SELECT f1("<e2>");
							 | 
						||
| 
								 | 
							
								SET GLOBAL EVENT_SCHEDULER= ON;
							 | 
						||
| 
								 | 
							
								SELECT SLEEP(@step / 2);
							 | 
						||
| 
								 | 
							
								SLEEP(@step / 2)
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								SET GLOBAL EVENT_SCHEDULER= OFF;
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 ORDER BY count, comment;
							 | 
						||
| 
								 | 
							
								count	unix_time	local_time	comment
							 | 
						||
| 
								 | 
							
								1	1	1	<e1>
							 | 
						||
| 
								 | 
							
								1	1	3	<e2>
							 | 
						||
| 
								 | 
							
								1	1	3	e2 should be executed
							 | 
						||
| 
								 | 
							
								2	2	2	<e1>
							 | 
						||
| 
								 | 
							
								2	2	4	<e2>
							 | 
						||
| 
								 | 
							
								2	2	4	e2 should be executed
							 | 
						||
| 
								 | 
							
								3	3	3	<e1>
							 | 
						||
| 
								 | 
							
								3	3	3	Second pass after backward -2 step shift, e2 should not be executed
							 | 
						||
| 
								 | 
							
								4	4	4	<e1>
							 | 
						||
| 
								 | 
							
								4	4	4	Second pass after backward -2 step shift, e2 should not be executed
							 | 
						||
| 
								 | 
							
								5	5	5	<e1>
							 | 
						||
| 
								 | 
							
								5	5	5	<e2>
							 | 
						||
| 
								 | 
							
								5	5	5	e2 should be executed
							 | 
						||
| 
								 | 
							
								6	0	0	<e1>
							 | 
						||
| 
								 | 
							
								6	0	2	<e2>
							 | 
						||
| 
								 | 
							
								6	0	2	Forward +2 step shift, local 0, 1 are skipped, e2 should be executed
							 | 
						||
| 
								 | 
							
								7	1	1	<e1>
							 | 
						||
| 
								 | 
							
								7	1	3	<e2>
							 | 
						||
| 
								 | 
							
								7	1	3	e2 should be executed
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= @save_time_zone;
							 | 
						||
| 
								 | 
							
								DROP EVENT e2;
							 | 
						||
| 
								 | 
							
								DROP EVENT e1;
							 | 
						||
| 
								 | 
							
								DROP FUNCTION f1;
							 | 
						||
| 
								 | 
							
								DROP TABLE t1, t2;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone_name            WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone_transition_type WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone_transition      WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone                 WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								ALTER TABLE mysql.time_zone AUTO_INCREMENT = 6;
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= '+00:00';
							 | 
						||
| 
								 | 
							
								CREATE TABLE t1 (event CHAR(2), dt DATE, offset INT);
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone VALUES (NULL, 'N');
							 | 
						||
| 
								 | 
							
								SET @tzid= LAST_INSERT_ID();
							 | 
						||
| 
								 | 
							
								SET @now= UNIX_TIMESTAMP();
							 | 
						||
| 
								 | 
							
								SET @offset_month_01= UNIX_TIMESTAMP('2030-01-31 12:00:00') - @now;
							 | 
						||
| 
								 | 
							
								SET @offset_month_02= UNIX_TIMESTAMP('2030-02-28 12:00:00') - @now - 5*@step;
							 | 
						||
| 
								 | 
							
								SET @offset_month_03= UNIX_TIMESTAMP('2030-03-31 12:00:00') - @now - 5*@step;
							 | 
						||
| 
								 | 
							
								SET @offset_month_04= UNIX_TIMESTAMP('2030-04-30 12:00:00') - @now - 13*@step;
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition_type
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, 0, @offset_month_01, 0, 'b16420_0');
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition_type
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, 1, @offset_month_02, 1, 'b16420_1');
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition_type
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, 2, @offset_month_03, 1, 'b16420_2');
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition_type
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, 3, @offset_month_04, 1, 'b16420_3');
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, @now, 0);
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, @now + 3 * @step, 1);
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, @now + 7 * @step, 2);
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_transition
							 | 
						||
| 
								 | 
							
								VALUES (@tzid, @now + 12 * @step, 3);
							 | 
						||
| 
								 | 
							
								INSERT INTO mysql.time_zone_name VALUES ('<TZ_NAME_2>', @tzid);
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= '<TZ_NAME_2>';
							 | 
						||
| 
								 | 
							
								SET GLOBAL EVENT_SCHEDULER= ON;
							 | 
						||
| 
								 | 
							
								SET GLOBAL EVENT_SCHEDULER= OFF;
							 | 
						||
| 
								 | 
							
								Below we should see the following:
							 | 
						||
| 
								 | 
							
								- On Jan 31 only e2 is executed, because we started later than
							 | 
						||
| 
								 | 
							
								e1 should have been executed.  Offset of e2 is 0 because of
							 | 
						||
| 
								 | 
							
								the late start, not 1.
							 | 
						||
| 
								 | 
							
								- The next execution is on Feb 28 (last day of Feb).  Both events
							 | 
						||
| 
								 | 
							
								are executed in their times, offsets are -1 and 1.
							 | 
						||
| 
								 | 
							
								- The next time is Mar 31.  Because the time of event
							 | 
						||
| 
								 | 
							
								execution was skipped over, events are executed right away,
							 | 
						||
| 
								 | 
							
								offsets are 2 and 2.
							 | 
						||
| 
								 | 
							
								- The next time is Apr 30.  Events are again executed in their
							 | 
						||
| 
								 | 
							
								appointed times, offsets are -1 and 1.
							 | 
						||
| 
								 | 
							
								SELECT * FROM t1 ORDER BY dt, event;
							 | 
						||
| 
								 | 
							
								event	dt	offset
							 | 
						||
| 
								 | 
							
								e2	2030-01-31	0
							 | 
						||
| 
								 | 
							
								e1	2030-02-28	-1
							 | 
						||
| 
								 | 
							
								e2	2030-02-28	1
							 | 
						||
| 
								 | 
							
								e1	2030-03-31	2
							 | 
						||
| 
								 | 
							
								e2	2030-03-31	2
							 | 
						||
| 
								 | 
							
								e1	2030-04-30	-1
							 | 
						||
| 
								 | 
							
								e2	2030-04-30	1
							 | 
						||
| 
								 | 
							
								DROP EVENT e2;
							 | 
						||
| 
								 | 
							
								DROP EVENT e1;
							 | 
						||
| 
								 | 
							
								DROP TABLE t1;
							 | 
						||
| 
								 | 
							
								SET TIME_ZONE= @save_time_zone;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone_name            WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone_transition_type WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone_transition      WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								DELETE FROM mysql.time_zone                 WHERE time_zone_id = @tzid;
							 | 
						||
| 
								 | 
							
								ALTER TABLE mysql.time_zone AUTO_INCREMENT = 6;
							 | 
						||
| 
								 | 
							
								DROP FUNCTION round_to_step;
							 | 
						||
| 
								 | 
							
								DROP TABLE t_step;
							 | 
						||
| 
								 | 
							
								DROP DATABASE mysqltest_db1;
							 | 
						||
| 
								 | 
							
								End of 5.1 tests.
							 |