Commit cace147c authored by unknown's avatar unknown
Browse files

WL#3337 (Event scheduler new architecture) Fourth cut of refactoring

the parsing. Next step will be to refactor of usage of Event_timed 
during Events::create_event() and Events::update_event().

Disallow:
- CREATE EVENT ... DO CREATE EVENT ...;
- ALTER  EVENT ... DO CREATE EVENT ...;
- CREATE EVENT ... DO ALTER EVENT DO ....;
- CREATE PROCEDURE ... BEGIN CREATE EVENT ... END|

Allowed:
- CREATE EVENT ... DO DROP EVENT yyy;
- CREATE EVENT ... DO ALTER EVENT yyy;
  (the nested ALTER EVENT can have anything but DO clause)
- ALTER  EVENT ... DO ALTER EVENT yyy;
  (the nested ALTER EVENT can have anything but DO clause)
- ALTER  EVENT ... DO DROP EVENT yyy;
- CREATE PROCEDURE ... BEGIN ALTER EVENT ... END|
  (the nested ALTER EVENT can have anything but DO clause)
- CREATE PROCEDURE ... BEGIN DROP EVENT ... END|


mysql-test/r/events.result:
  update results
mysql-test/r/events_bugs.result:
  update results
mysql-test/t/events.test:
  use number as error, mysql-test-run does not like the name.
  will come back to this later, now it's enough to pass the test.
  disable nested events / events in SP, when the nested event has
  a body. If no body is provided, namely DROP EVENT or ALTER that
  changes the characteristics, then these are allowed.
mysql-test/t/events_bugs.test:
  use number as error, mysql-test-run does not like the name.
  will come back to this later, now it's enough to pass the test.
  disable nested events / events in SP, when the nested event has
  a body. If no body is provided, namely DROP EVENT or ALTER that
  changes the characteristics, then these are allowed.
sql/share/errmsg.txt:
  new message
sql/sql_yacc.yy:
  refactor CREATE EVENT parsing to fit into the structure
  CREATE DEFINER=xxx EVENT
  The actual definer part is not used, but parsed, for now.
  Disable nested CREATE EVENTS, CREATE EVENT inside CREATE PROCEDURE.
  And an event DDL with body inside an ALTER.
  This stops the following :
  - CREATE EVENT ... DO CREATE EVENT ...;
  - ALTER  EVENT ... DO CREATE EVENT ...;
  - CREATE EVENT ... DO ALTER EVENT DO ....;
  - CREATE PROCEDURE ... BEGIN CREATE EVENT ... END|
  This allows:
  - CREATE EVENT ... DO DROP EVENT yyy;
  - CREATE EVENT ... DO ALTER EVENT yyy;
    (the nested ALTER EVENT can have anything but DO clause)
  - ALTER  EVENT ... DO ALTER EVENT yyy;
    (the nested ALTER EVENT can have anything but DO clause)
  - ALTER  EVENT ... DO DROP EVENT yyy;
  - CREATE PROCEDURE ... BEGIN ALTER EVENT ... END|
    (the nested ALTER EVENT can have anything but DO clause)
  - CREATE PROCEDURE ... BEGIN DROP EVENT ... END|
parent ef9a97e6
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -85,13 +85,25 @@ SHOW EVENTS;
Db	Name	Definer	Type	Execute at	Interval value	Interval field	Starts	Ends	Status
events_test	event_starts_test	root@localhost	RECURRING	NULL	20	SECOND	#	#	ENABLED
DROP EVENT event_starts_test;
create table test_nested(a int);
create event e_43 on schedule every 1 second do set @a = 5;
set global event_scheduler = 1;
alter event e_43 do alter event e_43 do set @a = 4;
ERROR HY000: Recursivity of EVENT DDL statements is forbidden when body is present
alter event e_43 do
begin
alter event e_43 on schedule every 5 minute;
insert into test_nested values(1);
end|
set global event_scheduler = 1;
select db, name, body, status, interval_field, interval_value from mysql.event;
db	name	body	status	interval_field	interval_value
events_test	e_43	set @a = 4	ENABLED	SECOND	1
events_test	e_43	begin
alter event e_43 on schedule every 5 minute;
insert into test_nested values(1);
end	ENABLED	MINUTE	5
drop event e_43;
drop table test_nested;
"Let's check whether we can use non-qualified names"
create table non_qualif(a int);
create event non_qualif_ev on schedule every 10 minute do insert into non_qualif values (800219);
@@ -358,7 +370,7 @@ root localhost events_test Connect User lock select get_lock("test_lock2_1", 20)
drop event закачка21;
create table t_16 (s1 int);
create trigger t_16_bi before insert on t_16 for each row create event  e_16 on schedule every 1 second do set @a=5;
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
ERROR HY000: Recursivity of EVENT DDL statements is forbidden when body is present
drop table t_16;
create event white_space
on schedule every 10 hour
+1 −12
Original line number Diff line number Diff line
@@ -17,18 +17,7 @@ DROP EVENT ДОЛЕН_регистър_утф8;
SET NAMES latin1;
set @a=3;
CREATE PROCEDURE p_16 () CREATE EVENT e_16 ON SCHEDULE EVERY @a SECOND DO SET @a=5;
call p_16();
"Here we used to crash!"
call p_16();
ERROR HY000: Event 'e_16' already exists
call p_16();
ERROR HY000: Event 'e_16' already exists
DROP EVENT e_16;
CALL p_16();
CALL p_16();
ERROR HY000: Event 'e_16' already exists
DROP PROCEDURE p_16;
DROP EVENT e_16;
ERROR HY000: Recursivity of EVENT DDL statements is forbidden when body is present
create event e_55 on schedule at 99990101000000 do drop table t;
ERROR HY000: Incorrect AT value: '99990101000000'
create event e_55 on schedule every 10 hour starts 99990101000000 do drop table t;
+13 −4
Original line number Diff line number Diff line
@@ -81,14 +81,23 @@ SHOW EVENTS;
DROP EVENT event_starts_test;
#
#
create table test_nested(a int);
create event e_43 on schedule every 1 second do set @a = 5;
set global event_scheduler = 1;
--sleep 2
--error 1562
alter event e_43 do alter event e_43 do set @a = 4;
--sleep 2
delimiter |;
alter event e_43 do
begin
  alter event e_43 on schedule every 5 minute;
  insert into test_nested values(1);
end|
delimiter ;|
set global event_scheduler = 1;
--sleep 1
select db, name, body, status, interval_field, interval_value from mysql.event;
drop event e_43;
--sleep 1
drop table test_nested;

--echo "Let's check whether we can use non-qualified names"
create table non_qualif(a int);
@@ -315,7 +324,7 @@ drop event закачка21;
# Bug #16410  Events: CREATE EVENT is legal in a CREATE TRIGGER statement
#
create table t_16 (s1 int);
--error 1422
--error 1562
create trigger t_16_bi before insert on t_16 for each row create event  e_16 on schedule every 1 second do set @a=5;
drop table t_16;
#
+1 −12
Original line number Diff line number Diff line
@@ -30,19 +30,8 @@ SET NAMES latin1;
# START - BUG#16408: Events: crash for an event in a procedure
#
set @a=3;
--error 1562
CREATE PROCEDURE p_16 () CREATE EVENT e_16 ON SCHEDULE EVERY @a SECOND DO SET @a=5;
call p_16();
--echo "Here we used to crash!"
--error ER_EVENT_ALREADY_EXISTS
call p_16();
--error ER_EVENT_ALREADY_EXISTS
call p_16();
DROP EVENT e_16;
CALL p_16();
--error ER_EVENT_ALREADY_EXISTS
CALL p_16();
DROP PROCEDURE p_16;
DROP EVENT e_16;
#
# END   - BUG#16408: Events: crash for an event in a procedure
#
+3 −0
Original line number Diff line number Diff line
@@ -5839,3 +5839,6 @@ ER_CANT_ACTIVATE_LOG
        eng "Cannot activate '%-.64s' log."
ER_RBR_NOT_AVAILABLE
        eng "The server was not built with row-based replication"
ER_EVENT_RECURSIVITY_FORBIDDEN
        eng "Recursivity of EVENT DDL statements is forbidden when body is present"
Loading