List:Commits« Previous MessageNext Message »
From:konstantin Date:April 5 2007 4:47pm
Subject:bk commit into 5.1 tree (kostja:1.2556) BUG#23631
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of kostja. When kostja does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-04-05 20:47:22+04:00, kostja@vajra.(none) +12 -0
  Post-merge and post-review fixes for the patch for
  Bug#23631 "Events: SHOW VARIABLES doesn't work when mysql.event 
  is damaged:

  mysql-test/r/events.result@stripped, 2007-04-05 20:47:17+04:00, kostja@vajra.(none) +8 -8
    Update results (a post-merge fix)

  mysql-test/r/events_bugs.result@stripped, 2007-04-05 20:47:17+04:00, kostja@vajra.(none) +32 -32
    Update results (a post-merge fix)

  mysql-test/r/events_scheduling.result@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +31 -19
    Update results (a post-merge fix)

  mysql-test/t/events_scheduling.test@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +58 -19
    Make sure this test has no races.

  sql/event_data_objects.cc@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +64 -8
    Manual post-merge fix for the events replication patch.

  sql/event_data_objects.h@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +1 -1
    A post-merge fix.

  sql/event_db_repository.cc@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +7 -0
    A post-merge fix.

  sql/event_scheduler.cc@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +1 -22
    We should drop the event inside ::execute since there we have
    the right credentials to do so (otherwise Events::drop_event
    returns "access denied" error).

  sql/events.cc@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +6 -6
    A post-review fix for: rename start_or_stop_event_scheduler
    to switch_event_scheduler_state.

  sql/events.h@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +1 -1
    A post-review fix for: rename start_or_stop_event_scheduler
    to switch_event_scheduler_state.

  sql/set_var.cc@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +1 -1
    A post-review fix for: rename start_or_stop_event_scheduler
    to switch_event_scheduler_state.

  sql/sql_yacc.yy@stripped, 2007-04-05 20:47:18+04:00, kostja@vajra.(none) +0 -2
    Remove unused declaratoins.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	kostja
# Host:	vajra.(none)
# Root:	/opt/local/work/mysql-5.1-c1

--- 1.559/sql/sql_yacc.yy	2007-04-03 14:30:03 +04:00
+++ 1.560/sql/sql_yacc.yy	2007-04-05 20:47:18 +04:00
@@ -948,7 +948,6 @@
 %token  SIGNED_SYM
 %token  SIMPLE_SYM                    /* SQL-2003-N */
 %token  SLAVE
-%token  SLAVESIDE_DISABLE_SYM         
 %token  SMALLINT                      /* SQL-2003-R */
 %token  SNAPSHOT_SYM
 %token  SOCKET_SYM
@@ -10004,7 +10003,6 @@
 	| SIMPLE_SYM		{}
 	| SHARE_SYM		{}
 	| SHUTDOWN		{}
-	| SLAVESIDE_DISABLE_SYM {} 
 	| SNAPSHOT_SYM		{}
 	| SOUNDS_SYM		{}
 	| SQL_CACHE_SYM		{}

--- 1.51/mysql-test/r/events.result	2007-04-05 15:37:58 +04:00
+++ 1.52/mysql-test/r/events.result	2007-04-05 20:47:17 +04:00
@@ -197,7 +197,7 @@
 Event	sql_mode	time_zone	Create Event
-insert into mysql.event (db, name, body, definer, interval_value, interval_field) values (database(), "root22", "select 1", user(), 100, "SECOND_MICROSECOND");
+insert into mysql.event (db, name, body, definer, interval_value, interval_field, originator) values (database(), "root22", "select 1", user(), 100, "SECOND_MICROSECOND", 1);
 show create event root22;
 ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
 SHOW EVENTS;
@@ -231,8 +231,8 @@
 the actual schedule and body are not.
 CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing";
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	intact_check	root@localhost	SYSTEM	RECURRING	NULL	10	#	#	NULL	ENABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	intact_check	root@localhost	SYSTEM	RECURRING	NULL	10	#	#	NULL	ENABLED	1
 Try to alter mysql.event: the server should fail to load
 event information after mysql.event was tampered with.
 
@@ -241,8 +241,8 @@
 
 ALTER TABLE mysql.event ADD dummy INT;
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	intact_check	root@localhost	SYSTEM	RECURRING	NULL	10	#	#	NULL	ENABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	intact_check	root@localhost	SYSTEM	RECURRING	NULL	10	#	#	NULL	ENABLED	1
 SELECT event_name FROM INFORMATION_SCHEMA.events;
 event_name
 intact_check
@@ -330,7 +330,7 @@
 DROP EVENT no_such_event;
 ERROR HY000: Unknown event 'no_such_event'
 CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
-ERROR HY000: Column count of mysql.event is wrong. Expected 17, found 15. The table is probably corrupted
+ERROR HY000: Column count of mysql.event is wrong. Expected 18, found 16. The table is probably corrupted
 ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
 ERROR HY000: Unknown event 'intact_check_1'
 ALTER EVENT intact_check_1 RENAME TO intact_check_2;
@@ -400,7 +400,7 @@
 CREATE TABLE mysql.event like event_like;
 DROP TABLE event_like;
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
 create event e_26 on schedule at '2017-01-01 00:00:00' disable do set @a = 5;
 select db, name, body, definer, convert_tz(execute_at, 'UTC', 'SYSTEM'), on_completion from mysql.event;
 db	name	body	definer	convert_tz(execute_at, 'UTC', 'SYSTEM')	on_completion
@@ -512,7 +512,7 @@
 SHOW EVENTS FROM ``;
 ERROR 42000: Incorrect database name ''
 SHOW EVENTS FROM `events\\test`;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
 
 LOCK TABLES mode.
 

--- 1.29/mysql-test/r/events_bugs.result	2007-04-05 15:36:49 +04:00
+++ 1.30/mysql-test/r/events_bugs.result	2007-04-05 20:47:17 +04:00
@@ -390,30 +390,30 @@
 SET TIMESTAMP= UNIX_TIMESTAMP('2005-12-31 23:58:59');
 CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY DO SELECT 1;
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	+00:00	RECURRING	NULL	1	DAY	2005-12-31 23:58:59	NULL	ENABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	+00:00	RECURRING	NULL	1	DAY	2005-12-31 23:58:59	NULL	ENABLED	1
 SET TIME_ZONE= '-01:00';
 ALTER EVENT e1 ON SCHEDULE EVERY 1 DAY STARTS '2000-01-01 00:00:00';
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	-01:00	RECURRING	NULL	1	DAY	2000-01-01 00:00:00	NULL	ENABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	-01:00	RECURRING	NULL	1	DAY	2000-01-01 00:00:00	NULL	ENABLED	1
 SET TIME_ZONE= '+02:00';
 ALTER EVENT e1 ON SCHEDULE AT '2000-01-02 00:00:00'
   ON COMPLETION PRESERVE DISABLE;
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	+02:00	ONE TIME	2000-01-02 00:00:00	NULL	NULL	NULL	NULL	DISABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	+02:00	ONE TIME	2000-01-02 00:00:00	NULL	NULL	NULL	NULL	DISABLED	1
 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;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	-03:00	RECURRING	NULL	1	DAY	2005-12-31 20:58:59	2030-01-03 00:00:00	DISABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	-03:00	RECURRING	NULL	1	DAY	2005-12-31 20:58:59	2030-01-03 00:00:00	DISABLED	1
 SET TIME_ZONE= '+04:00';
 ALTER EVENT e1 DO SELECT 2;
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	-03:00	RECURRING	NULL	1	DAY	2005-12-31 20:58:59	2030-01-03 00:00:00	ENABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	-03:00	RECURRING	NULL	1	DAY	2005-12-31 20:58:59	2030-01-03 00:00:00	ENABLED	1
 DROP EVENT e1;
 SET TIME_ZONE='+05:00';
 CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO
@@ -427,15 +427,15 @@
 CREATE EVENT e3 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO
 SELECT 1;
 SELECT * FROM INFORMATION_SCHEMA.EVENTS ORDER BY event_name;
-EVENT_CATALOG	EVENT_SCHEMA	EVENT_NAME	DEFINER	TIME_ZONE	EVENT_BODY	EVENT_DEFINITION	EVENT_TYPE	EXECUTE_AT	INTERVAL_VALUE	INTERVAL_FIELD	SQL_MODE	STARTS	ENDS	STATUS	ON_COMPLETION	CREATED	LAST_ALTERED	LAST_EXECUTED	EVENT_COMMENT
-NULL	events_test	e1	root@localhost	+05:00	SQL	SELECT 1	RECURRING	NULL	1	DAY		2006-01-01 00:00:00	NULL	ENABLED	NOT PRESERVE	2005-12-31 23:58:59	2005-12-31 23:58:59	NULL	
-NULL	events_test	e2	root@localhost	-05:00	SQL	SELECT 1	RECURRING	NULL	1	DAY		2006-01-01 00:00:00	NULL	ENABLED	NOT PRESERVE	2005-12-31 23:59:00	2005-12-31 23:59:00	NULL	
-NULL	events_test	e3	root@localhost	+00:00	SQL	SELECT 1	RECURRING	NULL	1	DAY		2006-01-01 00:00:00	NULL	ENABLED	NOT PRESERVE	2005-12-31 23:59:01	2005-12-31 23:59:01	NULL	
-SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	+05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED
-events_test	e2	root@localhost	-05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED
-events_test	e3	root@localhost	+00:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED
+EVENT_CATALOG	EVENT_SCHEMA	EVENT_NAME	DEFINER	TIME_ZONE	EVENT_BODY	EVENT_DEFINITION	EVENT_TYPE	EXECUTE_AT	INTERVAL_VALUE	INTERVAL_FIELD	SQL_MODE	STARTS	ENDS	STATUS	ON_COMPLETION	CREATED	LAST_ALTERED	LAST_EXECUTED	EVENT_COMMENT	ORIGINATOR
+NULL	events_test	e1	root@localhost	+05:00	SQL	SELECT 1	RECURRING	NULL	1	DAY		2006-01-01 00:00:00	NULL	ENABLED	NOT PRESERVE	2005-12-31 23:58:59	2005-12-31 23:58:59	NULL		1
+NULL	events_test	e2	root@localhost	-05:00	SQL	SELECT 1	RECURRING	NULL	1	DAY		2006-01-01 00:00:00	NULL	ENABLED	NOT PRESERVE	2005-12-31 23:59:00	2005-12-31 23:59:00	NULL		1
+NULL	events_test	e3	root@localhost	+00:00	SQL	SELECT 1	RECURRING	NULL	1	DAY		2006-01-01 00:00:00	NULL	ENABLED	NOT PRESERVE	2005-12-31 23:59:01	2005-12-31 23:59:01	NULL		1
+SHOW EVENTS;
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	+05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED	1
+events_test	e2	root@localhost	-05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED	1
+events_test	e3	root@localhost	+00:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED	1
 SHOW CREATE EVENT e1;
 Event	sql_mode	time_zone	Create Event
 e1		+05:00	CREATE EVENT `e1` ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO SELECT 1
@@ -475,10 +475,10 @@
 Warnings:
 Note	1584	Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. Event has not been created
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	+05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED
-events_test	e2	root@localhost	-05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED
-events_test	e3	root@localhost	+00:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	+05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED	1
+events_test	e2	root@localhost	-05:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED	1
+events_test	e3	root@localhost	+00:00	RECURRING	NULL	1	DAY	2006-01-01 00:00:00	NULL	ENABLED	1
 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;
@@ -511,15 +511,15 @@
 DO
 SELECT 1;
 SHOW EVENTS;
-Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
-events_test	e1	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED
-events_test	e2	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	NULL	ENABLED
-events_test	e3	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED
-events_test	e4	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED
-events_test	e5	root@localhost	+00:00	ONE TIME	1999-01-01 00:00:00	NULL	NULL	NULL	NULL	DISABLED
-events_test	e6	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	NULL	ENABLED
-events_test	e7	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED
-events_test	e8	root@localhost	+00:00	ONE TIME	1999-01-01 00:00:00	NULL	NULL	NULL	NULL	DISABLED
+Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator
+events_test	e1	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED	1
+events_test	e2	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	NULL	ENABLED	1
+events_test	e3	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED	1
+events_test	e4	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED	1
+events_test	e5	root@localhost	+00:00	ONE TIME	1999-01-01 00:00:00	NULL	NULL	NULL	NULL	DISABLED	1
+events_test	e6	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	NULL	ENABLED	1
+events_test	e7	root@localhost	+00:00	RECURRING	NULL	1	HOUR	1999-01-01 00:00:00	1999-01-02 00:00:00	DISABLED	1
+events_test	e8	root@localhost	+00:00	ONE TIME	1999-01-01 00:00:00	NULL	NULL	NULL	NULL	DISABLED	1
 DROP EVENT e8;
 DROP EVENT e7;
 DROP EVENT e6;

--- 1.11/mysql-test/r/events_scheduling.result	2007-04-05 15:36:49 +04:00
+++ 1.12/mysql-test/r/events_scheduling.result	2007-04-05 20:47:18 +04:00
@@ -44,44 +44,56 @@
 CREATE TABLE table_2(a int);
 CREATE TABLE table_3(a int);
 CREATE TABLE table_4(a int);
-CREATE TABLE T19170(s1 TIMESTAMP);
 SET GLOBAL event_scheduler=ON;
-CREATE EVENT two_sec ON SCHEDULE EVERY 2 SECOND DO INSERT INTO table_1 VALUES(1);
-CREATE EVENT start_n_end
-ON SCHEDULE EVERY 1 SECOND
+CREATE EVENT event_1 ON SCHEDULE EVERY 2 SECOND
+DO
+INSERT INTO table_1 VALUES (1);
+CREATE EVENT event_2 ON SCHEDULE EVERY 1 SECOND
 ENDS NOW() + INTERVAL 6 SECOND
 ON COMPLETION PRESERVE
-DO INSERT INTO table_2 VALUES(1);
-CREATE EVENT only_one_time ON SCHEDULE EVERY 2 SECOND ENDS NOW() + INTERVAL 1 SECOND DO INSERT INTO table_3 VALUES(1);
-CREATE EVENT two_time ON SCHEDULE EVERY 1 SECOND ENDS NOW() + INTERVAL 1 SECOND ON COMPLETION PRESERVE DO INSERT INTO table_4 VALUES(1);
+DO
+INSERT INTO table_2 VALUES (1);
+CREATE EVENT event_3 ON SCHEDULE EVERY 2 SECOND ENDS NOW() + INTERVAL 1 SECOND
+ON COMPLETION NOT PRESERVE
+DO
+INSERT INTO table_3 VALUES (1);
+CREATE EVENT event_4 ON SCHEDULE EVERY 1 SECOND ENDS NOW() + INTERVAL 1 SECOND
+ON COMPLETION PRESERVE
+DO
+INSERT INTO table_4 VALUES (1);
 SELECT IF(SUM(a) >= 4, 'OK', 'ERROR') FROM table_1;
 IF(SUM(a) >= 4, 'OK', 'ERROR')
 OK
 SELECT IF(SUM(a) >= 5, 'OK', 'ERROR') FROM table_2;
 IF(SUM(a) >= 5, 'OK', 'ERROR')
 OK
-SELECT IF(SUM(a) >  0, 'OK', 'ERROR') FROM table_3;
-IF(SUM(a) >  0, 'OK', 'ERROR')
+SELECT IF(SUM(a) >= 1, 'OK', 'ERROR') FROM table_3;
+IF(SUM(a) >= 1, 'OK', 'ERROR')
 OK
-SELECT IF(SUM(a) >  0, 'OK', 'ERROR') FROM table_4;
-IF(SUM(a) >  0, 'OK', 'ERROR')
+SELECT IF(SUM(a) >= 1, 'OK', 'ERROR') FROM table_4;
+IF(SUM(a) >= 1, 'OK', 'ERROR')
 OK
-DROP EVENT two_sec;
-SELECT IF(TIME_TO_SEC(TIMEDIFF(ENDS,STARTS))=6, 'OK', 'ERROR') FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='start_n_end' AND ENDS IS NOT NULL;
+SELECT IF(TIME_TO_SEC(TIMEDIFF(ENDS,STARTS))=6, 'OK', 'ERROR')
+FROM INFORMATION_SCHEMA.EVENTS
+WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='event_2';
 IF(TIME_TO_SEC(TIMEDIFF(ENDS,STARTS))=6, 'OK', 'ERROR')
 OK
-SELECT IF(LAST_EXECUTED-ENDS < 3, 'OK', 'ERROR') FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='start_n_end' AND ENDS IS NOT NULL;
+SELECT IF(LAST_EXECUTED-ENDS < 3, 'OK', 'ERROR')
+FROM INFORMATION_SCHEMA.EVENTS
+WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='event_2';
 IF(LAST_EXECUTED-ENDS < 3, 'OK', 'ERROR')
 OK
-DROP EVENT IF EXISTS events_test.start_n_end;
 "Already dropped because ended. Therefore an error."
-DROP EVENT only_one_time;
-ERROR HY000: Unknown event 'only_one_time'
+DROP EVENT event_3;
+ERROR HY000: Unknown event 'event_3'
+DROP EVENT event_1;
 "Should be preserved"
 SELECT EVENT_NAME, STATUS FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_NAME;
 EVENT_NAME	STATUS
-two_time	DISABLED
-DROP EVENT two_time;
+event_2	DISABLED
+event_4	DISABLED
+DROP EVENT event_2;
+DROP EVENT event_4;
 DROP TABLE table_1;
 DROP TABLE table_2;
 DROP TABLE table_3;

--- 1.13/mysql-test/t/events_scheduling.test	2007-04-05 15:36:49 +04:00
+++ 1.14/mysql-test/t/events_scheduling.test	2007-04-05 20:47:18 +04:00
@@ -34,34 +34,73 @@
 CREATE TABLE table_2(a int);
 CREATE TABLE table_3(a int);
 CREATE TABLE table_4(a int);
-CREATE TABLE T19170(s1 TIMESTAMP);
+
 SET GLOBAL event_scheduler=ON;
 # We need to have 2 to make it safe with valgrind. This is probably because
 # of when we calculate the timestamp value
-CREATE EVENT two_sec ON SCHEDULE EVERY 2 SECOND DO INSERT INTO table_1 VALUES(1);
-CREATE EVENT start_n_end
-  ON SCHEDULE EVERY 1 SECOND
-  ENDS NOW() + INTERVAL 6 SECOND
-  ON COMPLETION PRESERVE
-  DO INSERT INTO table_2 VALUES(1);
---sleep 5
-CREATE EVENT only_one_time ON SCHEDULE EVERY 2 SECOND ENDS NOW() + INTERVAL 1 SECOND DO INSERT INTO table_3 VALUES(1);
-CREATE EVENT two_time ON SCHEDULE EVERY 1 SECOND ENDS NOW() + INTERVAL 1 SECOND ON COMPLETION PRESERVE DO INSERT INTO table_4 VALUES(1);
---sleep 5
+CREATE EVENT event_1 ON SCHEDULE EVERY 2 SECOND
+DO
+  INSERT INTO table_1 VALUES (1);
+
+CREATE EVENT event_2 ON SCHEDULE EVERY 1 SECOND
+ENDS NOW() + INTERVAL 6 SECOND
+ON COMPLETION PRESERVE
+DO
+  INSERT INTO table_2 VALUES (1);
+
+CREATE EVENT event_3 ON SCHEDULE EVERY 2 SECOND ENDS NOW() + INTERVAL 1 SECOND
+ON COMPLETION NOT PRESERVE
+DO
+  INSERT INTO table_3 VALUES (1);
+
+CREATE EVENT event_4 ON SCHEDULE EVERY 1 SECOND ENDS NOW() + INTERVAL 1 SECOND
+ON COMPLETION PRESERVE
+DO
+  INSERT INTO table_4 VALUES (1);
+
+# Let event_1 insert at least 4 records into the table
+let $wait_condition=select count(*) >= 4 from table_1;
+--source include/wait_condition.inc
+
+# Let event_2 reach the end of its execution interval 
+let $wait_condition=select count(*) = 0 from information_schema.events
+where event_name='event_2' and status='enabled';
+--source include/wait_condition.inc
+
+# Let event_3, which is ON COMPLETION NOT PRESERVE execute and drop itself 
+let $wait_condition=select count(*) = 0 from information_schema.events
+where event_name='event_3';
+--source include/wait_condition.inc
+
+# Let event_4 reach the end of its execution interval 
+let $wait_condition=select count(*) = 0 from information_schema.events
+where event_name='event_4' and status='enabled';
+--source include/wait_condition.inc
+
+# check the data
+
 SELECT IF(SUM(a) >= 4, 'OK', 'ERROR') FROM table_1;
 SELECT IF(SUM(a) >= 5, 'OK', 'ERROR') FROM table_2;
-SELECT IF(SUM(a) >  0, 'OK', 'ERROR') FROM table_3;
-SELECT IF(SUM(a) >  0, 'OK', 'ERROR') FROM table_4;
-DROP EVENT two_sec;
-SELECT IF(TIME_TO_SEC(TIMEDIFF(ENDS,STARTS))=6, 'OK', 'ERROR') FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='start_n_end' AND ENDS IS NOT NULL;
-SELECT IF(LAST_EXECUTED-ENDS < 3, 'OK', 'ERROR') FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='start_n_end' AND ENDS IS NOT NULL;
-DROP EVENT IF EXISTS events_test.start_n_end;
+SELECT IF(SUM(a) >= 1, 'OK', 'ERROR') FROM table_3;
+SELECT IF(SUM(a) >= 1, 'OK', 'ERROR') FROM table_4;
+
+SELECT IF(TIME_TO_SEC(TIMEDIFF(ENDS,STARTS))=6, 'OK', 'ERROR')
+FROM INFORMATION_SCHEMA.EVENTS
+WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='event_2';
+
+SELECT IF(LAST_EXECUTED-ENDS < 3, 'OK', 'ERROR')
+FROM INFORMATION_SCHEMA.EVENTS
+WHERE EVENT_SCHEMA=DATABASE() AND EVENT_NAME='event_2';
+
 --echo "Already dropped because ended. Therefore an error."
 --error ER_EVENT_DOES_NOT_EXIST
-DROP EVENT only_one_time;
+DROP EVENT event_3;
+
+DROP EVENT event_1;
 --echo "Should be preserved"
 SELECT EVENT_NAME, STATUS FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_NAME;
-DROP EVENT two_time;
+DROP EVENT event_2;
+DROP EVENT event_4;
 DROP TABLE table_1;
 DROP TABLE table_2;
 DROP TABLE table_3;

--- 1.75/sql/events.cc	2007-04-05 15:49:42 +04:00
+++ 1.76/sql/events.cc	2007-04-05 20:47:18 +04:00
@@ -1041,14 +1041,14 @@
 */
 
 bool
-Events::start_or_stop_event_scheduler(enum_opt_event_scheduler start_or_stop)
+Events::switch_event_scheduler_state(enum_opt_event_scheduler new_state)
 {
   bool ret= FALSE;
 
-  DBUG_ENTER("Events::start_or_stop_event_scheduler");
+  DBUG_ENTER("Events::switch_event_scheduler_state");
 
-  DBUG_ASSERT(start_or_stop == Events::EVENTS_ON ||
-              start_or_stop == Events::EVENTS_OFF);
+  DBUG_ASSERT(new_state == Events::EVENTS_ON ||
+              new_state == Events::EVENTS_OFF);
 
   /*
     If the scheduler was disabled because there are no/bad
@@ -1068,7 +1068,7 @@
     goto end;
   }
 
-  if (start_or_stop == EVENTS_ON)
+  if (new_state == EVENTS_ON)
     ret= scheduler->start();
   else
     ret= scheduler->stop();
@@ -1079,7 +1079,7 @@
     goto end;
   }
 
-  opt_event_scheduler= start_or_stop;
+  opt_event_scheduler= new_state;
 
 end:
   pthread_mutex_unlock(&LOCK_event_metadata);

--- 1.54/sql/events.h	2007-04-05 15:24:29 +04:00
+++ 1.55/sql/events.h	2007-04-05 20:47:18 +04:00
@@ -99,7 +99,7 @@
   destroy_mutexes();
 
   static bool
-  start_or_stop_event_scheduler(enum enum_opt_event_scheduler start_or_stop);
+  switch_event_scheduler_state(enum enum_opt_event_scheduler new_state);
 
   static bool
   create_event(THD *thd, Event_parse_data *parse_data, bool if_exists);

--- 1.27/sql/event_db_repository.cc	2007-04-05 15:49:42 +04:00
+++ 1.28/sql/event_db_repository.cc	2007-04-05 20:47:18 +04:00
@@ -905,6 +905,13 @@
 
   DBUG_ENTER("Event_db_repository::update_timing_fields_for_event");
 
+  /*
+    Turn off row binlogging of event timing updates. These are not used
+    for RBR of events replicated to the slave.
+  */
+  if (thd->current_stmt_binlog_row_based)
+    thd->clear_current_stmt_binlog_row_based();
+
   if (open_event_table(thd, TL_WRITE, &table))
     goto end;
 

--- 1.40/sql/event_scheduler.cc	2007-04-05 15:24:29 +04:00
+++ 1.41/sql/event_scheduler.cc	2007-04-05 20:47:18 +04:00
@@ -309,7 +309,7 @@
 
   thd->enable_slow_log= TRUE;
 
-  ret= job_data->execute(thd);
+  ret= job_data->execute(thd, event->dropped);
 
   print_warnings(thd, job_data);
 
@@ -338,27 +338,6 @@
 end:
   delete job_data;
 
-  if (event->dropped)
-  {
-    sql_print_information("Event Scheduler: Dropping %s.%s",
-                          event->dbname.str, event->name.str);
-    /*
-      Using db_repository can lead to a race condition because we access
-      the table without holding LOCK_metadata.
-      Scenario:
-      1. CREATE EVENT xyz AT ...    (conn thread)
-      2. execute xyz                (worker)
-      3. CREATE EVENT XYZ EVERY ... (conn thread)
-      4. drop xyz                   (worker)
-      5. XYZ was just created on disk but `drop xyz` of the worker dropped it.
-         A consequent load to create Event_queue_element will fail.
-
-      If all operations are performed under LOCK_metadata there is no such
-      problem. However, this comes at the price of introduction bi-directional
-      association between class Events and class Event_worker_thread.
-    */
-    Events::drop_event(thd, event->dbname, event->name, FALSE);
-  }
   DBUG_PRINT("info", ("Done with Event %s.%s", event->dbname.str,
              event->name.str));
 

--- 1.94/sql/event_data_objects.cc	2007-04-05 15:42:40 +04:00
+++ 1.95/sql/event_data_objects.cc	2007-04-05 20:47:18 +04:00
@@ -99,7 +99,9 @@
 */
 
 Event_parse_data::Event_parse_data()
-  :on_completion(ON_COMPLETION_DROP), status(ENABLED), do_not_create(FALSE),
+  :on_completion(Event_basic::ON_COMPLETION_DROP),
+  status(Event_basic::ENABLED),
+  do_not_create(FALSE),
    item_starts(NULL), item_ends(NULL), item_execute_at(NULL),
    starts_null(TRUE), ends_null(TRUE), execute_at_null(TRUE),
    item_expression(NULL), expression(0)
@@ -241,7 +243,7 @@
   if (ltime_utc >= (my_time_t) thd->query_start())
     return;
 
-  if (on_completion == ON_COMPLETION_DROP)
+  if (on_completion == Event_basic::ON_COMPLETION_DROP)
   {
     switch (thd->lex->sql_command) {
     case SQLCOM_CREATE_EVENT:
@@ -258,9 +260,9 @@
 
     do_not_create= TRUE;
   }
-  else if (status == ENABLED)
+  else if (status == Event_basic::ENABLED)
   {
-    status= DISABLED;
+    status= Event_basic::DISABLED;
     push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
                  ER_EVENT_EXEC_TIME_IN_THE_PAST,
                  ER(ER_EVENT_EXEC_TIME_IN_THE_PAST));
@@ -589,6 +591,7 @@
 
   ret= init_execute_at(thd) || init_interval(thd) || init_starts(thd) ||
        init_ends(thd);
+  check_originator_id(thd);
   DBUG_RETURN(ret);
 }
 
@@ -635,6 +638,31 @@
 }
 
 
+/**
+  Set the originator id of the event to the server_id if executing on
+  the master or set to the server_id of the master if executing on 
+  the slave. If executing on slave, also set status to SLAVESIDE_DISABLED.
+
+  SYNOPSIS
+    Event_parse_data::check_originator_id()
+*/
+void Event_parse_data::check_originator_id(THD *thd)
+{
+  /* Disable replicated events on slave. */
+  if ((thd->system_thread == SYSTEM_THREAD_SLAVE_SQL) ||
+      (thd->system_thread == SYSTEM_THREAD_SLAVE_IO))
+  {
+    DBUG_PRINT("info", ("Invoked object status set to SLAVESIDE_DISABLED."));
+    if ((status == Event_basic::ENABLED) ||
+        (status == Event_basic::DISABLED))
+      status = Event_basic::SLAVESIDE_DISABLED;
+    originator = thd->server_id;
+  }
+  else
+    originator = server_id;
+}
+
+
 /*
   Constructor
 
@@ -1004,8 +1032,23 @@
     goto error;
 
   DBUG_PRINT("load_from_row", ("Event [%s] is [%s]", name.str, ptr));
-  status= (ptr[0]=='E'? Event_queue_element::ENABLED:
-                        Event_queue_element::DISABLED);
+
+  /* Set event status (ENABLED | SLAVESIDE_DISABLED | DISABLED) */
+  switch (ptr[0])
+  {
+  case 'E' :
+    status = Event_queue_element::ENABLED;
+    break;
+  case 'S' :
+    status = Event_queue_element::SLAVESIDE_DISABLED;
+    break;
+  case 'D' :
+    status = Event_queue_element::DISABLED;
+    break;
+  }
+  if ((ptr= get_field(&mem_root, table->field[ET_FIELD_ORIGINATOR])) == NullS)
+    goto error;
+  originator = table->field[ET_FIELD_ORIGINATOR]->val_int(); 
 
   /* ToDo : Andrey . Find a way not to allocate ptr on event_mem_root */
   if ((ptr= get_field(&mem_root,
@@ -1356,7 +1399,7 @@
                        (long) starts, (long) ends, (long) last_executed,
                        (long) this));
 
-  if (status == Event_queue_element::DISABLED)
+  if (status != Event_queue_element::ENABLED)
   {
     DBUG_PRINT("compute_next_execution_time",
                ("Event %s is DISABLED", name.str));
@@ -1708,6 +1751,8 @@
 
   if (status == Event_timed::ENABLED)
     buf->append(STRING_WITH_LEN("ENABLE"));
+  else if (status == Event_timed::SLAVESIDE_DISABLED)
+    buf->append(STRING_WITH_LEN("DISABLE ON SLAVE"));
   else
     buf->append(STRING_WITH_LEN("DISABLE"));
 
@@ -1765,7 +1810,7 @@
 */
 
 int
-Event_job_data::execute(THD *thd)
+Event_job_data::execute(THD *thd, bool drop)
 {
   Security_context save_ctx;
   /* this one is local and not needed after exec */
@@ -1804,6 +1849,17 @@
     DBUG_PRINT("error", ("%s@%s has no rights on %s", definer_user.str,
                definer_host.str, dbname.str));
     ret= -99;
+  }
+  if (drop)
+  {
+    sql_print_information("Event Scheduler: Dropping %s.%s",
+                          dbname.str, name.str);
+    /*
+      We must do it here since here we're under the right authentication
+      ID of the event definer
+    */
+    if (Events::drop_event(thd, dbname, name, FALSE))
+      ret= 1;
   }
 
   event_restore_security_context(thd, &save_ctx);

--- 1.21/sql/event_data_objects.h	2007-04-05 15:36:49 +04:00
+++ 1.22/sql/event_data_objects.h	2007-04-05 20:47:18 +04:00
@@ -184,7 +184,7 @@
   load_from_row(THD *thd, TABLE *table);
 
   int
-  execute(THD *thd);
+  execute(THD *thd, bool drop);
 
   int
   compile(THD *thd, MEM_ROOT *mem_root);

--- 1.225/sql/set_var.cc	2007-04-05 15:36:50 +04:00
+++ 1.226/sql/set_var.cc	2007-04-05 20:47:18 +04:00
@@ -4020,7 +4020,7 @@
     new_state=
     (enum Events::enum_opt_event_scheduler) var->save_result.ulong_value;
 
-  res= Events::start_or_stop_event_scheduler(new_state);
+  res= Events::switch_event_scheduler_state(new_state);
 
   DBUG_RETURN((bool) res);
 }
Thread
bk commit into 5.1 tree (kostja:1.2556) BUG#23631konstantin5 Apr