Skip to content

Commit 1cc304e

Browse files
Dmitry ShulgaDmitry Shulga
authored andcommitted
Fixed bug#11764334 (formerly bug#57156): ALTER EVENT CHANGES
THE EVENT STATUS. Any ALTER EVENT statement on a disabled event enabled it back (unless this ALTER EVENT statement explicitly disabled the event). The problem was that during processing of an ALTER EVENT statement value of status field was overwritten unconditionally even if new value was not specified explicitly. As a consequence this field was set to default value for status which corresponds to ENABLE. The solution is to check if status field was explicitly specified in ALTER EVENT statement before assigning new value to status field.
1 parent 6d20340 commit 1cc304e

6 files changed

Lines changed: 50 additions & 9 deletions

File tree

mysql-test/r/events_bugs.result

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ SET TIME_ZONE= '+04:00';
419419
ALTER EVENT e1 DO SELECT 2;
420420
SHOW EVENTS;
421421
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
422-
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 latin1 latin1_swedish_ci latin1_swedish_ci
422+
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 latin1 latin1_swedish_ci latin1_swedish_ci
423423
DROP EVENT e1;
424424
SET TIME_ZONE='+05:00';
425425
CREATE EVENT e1 ON SCHEDULE EVERY 1 DAY STARTS '2006-01-01 00:00:00' DO
@@ -796,6 +796,20 @@ COUNT(*)
796796
DROP EVENT IF EXISTS event_Bug12546938;
797797
DROP TABLE table_bug12546938;
798798
SET GLOBAL EVENT_SCHEDULER = OFF;
799+
DROP DATABASE IF EXISTS event_test11764334;
800+
CREATE DATABASE event_test11764334;
801+
USE event_test11764334;
802+
CREATE EVENT ev1 ON SCHEDULE EVERY 3 SECOND DISABLE DO SELECT 1;
803+
SHOW EVENTS IN event_test11764334 WHERE NAME='ev1';
804+
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
805+
event_test11764334 ev1 root@localhost SYSTEM RECURRING NULL 3 SECOND 2011-06-09 19:59:01 NULL DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
806+
ALTER EVENT ev1 ON SCHEDULE EVERY 4 SECOND;
807+
SHOW EVENTS IN event_test11764334 WHERE NAME='ev1';
808+
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
809+
event_test11764334 ev1 root@localhost SYSTEM RECURRING NULL 4 SECOND 2011-06-09 19:59:01 NULL DISABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
810+
DROP EVENT ev1;
811+
DROP DATABASE event_test11764334;
812+
USE test;
799813
DROP DATABASE events_test;
800814
SET GLOBAL event_scheduler= 'ON';
801815
SET @@global.concurrent_insert= @concurrent_insert;

mysql-test/t/events_bugs.test

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,21 @@ DROP EVENT IF EXISTS event_Bug12546938;
12861286
DROP TABLE table_bug12546938;
12871287
SET GLOBAL EVENT_SCHEDULER = OFF;
12881288

1289+
#
1290+
# Bug#11764334 - 57156: ALTER EVENT CHANGES THE EVENT STATUS
1291+
#
1292+
--disable_warnings
1293+
DROP DATABASE IF EXISTS event_test11764334;
1294+
--enable_warnings
1295+
CREATE DATABASE event_test11764334;
1296+
USE event_test11764334;
1297+
CREATE EVENT ev1 ON SCHEDULE EVERY 3 SECOND DISABLE DO SELECT 1;
1298+
SHOW EVENTS IN event_test11764334 WHERE NAME='ev1';
1299+
ALTER EVENT ev1 ON SCHEDULE EVERY 4 SECOND;
1300+
SHOW EVENTS IN event_test11764334 WHERE NAME='ev1';
1301+
DROP EVENT ev1;
1302+
DROP DATABASE event_test11764334;
1303+
USE test;
12891304
###########################################################################
12901305
#
12911306
# End of tests

sql/event_db_repository.cc

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,16 @@ mysql_event_fill_row(THD *thd,
226226
if (fields[f_num= ET_FIELD_NAME]->store(et->name.str, et->name.length, scs))
227227
goto err_truncate;
228228

229-
/* both ON_COMPLETION and STATUS are NOT NULL thus not calling set_notnull()*/
229+
/* ON_COMPLETION field is NOT NULL thus not calling set_notnull()*/
230230
rs|= fields[ET_FIELD_ON_COMPLETION]->store((longlong)et->on_completion, TRUE);
231-
rs|= fields[ET_FIELD_STATUS]->store((longlong)et->status, TRUE);
231+
232+
/*
233+
Set STATUS value unconditionally in case of CREATE EVENT.
234+
For ALTER EVENT set it only if value of this field was changed.
235+
Since STATUS field is NOT NULL call to set_notnull() is not needed.
236+
*/
237+
if (!is_update || et->status_changed)
238+
rs|= fields[ET_FIELD_STATUS]->store((longlong)et->status, TRUE);
232239
rs|= fields[ET_FIELD_ORIGINATOR]->store((longlong)et->originator, TRUE);
233240

234241
/*
@@ -694,8 +701,6 @@ Event_db_repository::create_event(THD *thd, Event_parse_data *parse_data,
694701
if (mysql_event_fill_row(thd, table, parse_data, sp, saved_mode, FALSE))
695702
goto end;
696703

697-
table->field[ET_FIELD_STATUS]->store((longlong)parse_data->status, TRUE);
698-
699704
if ((ret= table->file->ha_write_row(table->record[0])))
700705
{
701706
table->file->print_error(ret, MYF(0));

sql/event_parse_data.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,8 @@ Event_parse_data::new_instance(THD *thd)
4646

4747
Event_parse_data::Event_parse_data()
4848
:on_completion(Event_parse_data::ON_COMPLETION_DEFAULT),
49-
status(Event_parse_data::ENABLED),
50-
do_not_create(FALSE),
51-
body_changed(FALSE),
49+
status(Event_parse_data::ENABLED), status_changed(false),
50+
do_not_create(FALSE), body_changed(FALSE),
5251
item_starts(NULL), item_ends(NULL), item_execute_at(NULL),
5352
starts_null(TRUE), ends_null(TRUE), execute_at_null(TRUE),
5453
item_expression(NULL), expression(0)
@@ -140,6 +139,7 @@ Event_parse_data::check_if_in_the_past(THD *thd, my_time_t ltime_utc)
140139
else if (status == Event_parse_data::ENABLED)
141140
{
142141
status= Event_parse_data::DISABLED;
142+
status_changed= true;
143143
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
144144
ER_EVENT_EXEC_TIME_IN_THE_PAST,
145145
ER(ER_EVENT_EXEC_TIME_IN_THE_PAST));
@@ -569,7 +569,10 @@ void Event_parse_data::check_originator_id(THD *thd)
569569
DBUG_PRINT("info", ("Invoked object status set to SLAVESIDE_DISABLED."));
570570
if ((status == Event_parse_data::ENABLED) ||
571571
(status == Event_parse_data::DISABLED))
572-
status = Event_parse_data::SLAVESIDE_DISABLED;
572+
{
573+
status= Event_parse_data::SLAVESIDE_DISABLED;
574+
status_changed= true;
575+
}
573576
originator = thd->server_id;
574577
}
575578
else

sql/event_parse_data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class Event_parse_data : public Sql_alloc
4949

5050
int on_completion;
5151
int status;
52+
bool status_changed;
5253
longlong originator;
5354
/*
5455
do_not_create will be set if STARTS time is in the past and

sql/sql_yacc.yy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,16 +2024,19 @@ opt_ev_status:
20242024
| ENABLE_SYM
20252025
{
20262026
Lex->event_parse_data->status= Event_parse_data::ENABLED;
2027+
Lex->event_parse_data->status_changed= true;
20272028
$$= 1;
20282029
}
20292030
| DISABLE_SYM ON SLAVE
20302031
{
20312032
Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED;
2033+
Lex->event_parse_data->status_changed= true;
20322034
$$= 1;
20332035
}
20342036
| DISABLE_SYM
20352037
{
20362038
Lex->event_parse_data->status= Event_parse_data::DISABLED;
2039+
Lex->event_parse_data->status_changed= true;
20372040
$$= 1;
20382041
}
20392042
;

0 commit comments

Comments
 (0)