Loading mysql-test/r/events_bugs.result +8 −0 Original line number Diff line number Diff line create database if not exists events_test; use events_test; set @a=3; CREATE PROCEDURE p_16 () CREATE EVENT e_16 ON SCHEDULE EVERY @a SECOND DO SET @a=5; call p_16(); Loading @@ -14,6 +15,13 @@ CALL p_16(); ERROR HY000: Event 'e_16' already exists DROP PROCEDURE p_16; DROP EVENT e_16; 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; ERROR HY000: Incorrect STARTS value: '99990101000000' create event e_55 on schedule every 10 minute ends 99990101000000 do drop table t; ERROR HY000: ENDS is either invalid or before STARTS set global event_scheduler=0; "Wait a bit to settle down" delete from mysql.event; Loading mysql-test/t/events_bugs.test +13 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,19 @@ DROP EVENT e_16; # END - BUG#16408: Events: crash for an event in a procedure # # # Start - 16396: Events: Distant-future dates become past dates # --error 1503 create event e_55 on schedule at 99990101000000 do drop table t; --error 1503 create event e_55 on schedule every 10 hour starts 99990101000000 do drop table t; --error 1521 create event e_55 on schedule every 10 minute ends 99990101000000 do drop table t; # # End - 16396: Events: Distant-future dates become past dates # # # Start - 16407: Events: Changes in sql_mode won't be taken into account # Loading sql/event_timed.cc +33 −8 Original line number Diff line number Diff line Loading @@ -151,6 +151,7 @@ Event_timed::init_execute_at(THD *thd, Item *expr) { my_bool not_used; TIME ltime; my_time_t t; TIME time_tmp; DBUG_ENTER("Event_timed::init_execute_at"); Loading @@ -174,12 +175,18 @@ Event_timed::init_execute_at(THD *thd, Item *expr) TIME_to_ulonglong_datetime(&time_tmp)) DBUG_RETURN(EVEX_BAD_PARAMS); /* This may result in a 1970-01-01 date if ltime is > 2037-xx-xx. CONVERT_TZ has similar problem. mysql_priv.h currently lists #define TIMESTAMP_MAX_YEAR 2038 (see TIME_to_timestamp()) */ my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd,<ime, ¬_used)); my_tz_UTC->gmt_sec_to_TIME(<ime,t=TIME_to_timestamp(thd,<ime,¬_used)); if (!t) { DBUG_PRINT("error", ("Execute AT after year 2037")); DBUG_RETURN(ER_WRONG_VALUE); } execute_at_null= FALSE; execute_at= ltime; Loading Loading @@ -302,6 +309,7 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval) RETURNS 0 OK EVEX_PARSE_ERROR fix_fields failed EVEX_BAD_PARAMS starts before now */ int Loading @@ -309,6 +317,7 @@ Event_timed::init_starts(THD *thd, Item *new_starts) { my_bool not_used; TIME ltime, time_tmp; my_time_t t; DBUG_ENTER("Event_timed::init_starts"); Loading @@ -329,10 +338,17 @@ Event_timed::init_starts(THD *thd, Item *new_starts) DBUG_RETURN(EVEX_BAD_PARAMS); /* This may result in a 1970-01-01 date if ltime is > 2037-xx-xx CONVERT_TZ has similar problem This may result in a 1970-01-01 date if ltime is > 2037-xx-xx. CONVERT_TZ has similar problem. mysql_priv.h currently lists #define TIMESTAMP_MAX_YEAR 2038 (see TIME_to_timestamp()) */ my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used)); my_tz_UTC->gmt_sec_to_TIME(<ime,t=TIME_to_timestamp(thd, <ime, ¬_used)); if (!t) { DBUG_PRINT("error", ("STARTS after year 2037")); DBUG_RETURN(EVEX_BAD_PARAMS); } starts= ltime; starts_null= FALSE; Loading @@ -359,6 +375,7 @@ Event_timed::init_starts(THD *thd, Item *new_starts) RETURNS 0 OK EVEX_PARSE_ERROR fix_fields failed ER_WRONG_VALUE starts distant date (after year 2037) EVEX_BAD_PARAMS ENDS before STARTS */ Loading @@ -367,6 +384,7 @@ Event_timed::init_ends(THD *thd, Item *new_ends) { TIME ltime, ltime_now; my_bool not_used; my_time_t t; DBUG_ENTER("Event_timed::init_ends"); Loading @@ -378,11 +396,18 @@ Event_timed::init_ends(THD *thd, Item *new_ends) DBUG_RETURN(EVEX_BAD_PARAMS); /* This may result in a 1970-01-01 date if ltime is > 2037-xx-xx ? CONVERT_TZ has similar problem ? This may result in a 1970-01-01 date if ltime is > 2037-xx-xx. CONVERT_TZ has similar problem. mysql_priv.h currently lists #define TIMESTAMP_MAX_YEAR 2038 (see TIME_to_timestamp()) */ DBUG_PRINT("info", ("get the UTC time")); my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used)); my_tz_UTC->gmt_sec_to_TIME(<ime,t=TIME_to_timestamp(thd, <ime, ¬_used)); if (!t) { DBUG_PRINT("error", ("ENDS after year 2037")); DBUG_RETURN(EVEX_BAD_PARAMS); } /* Check whether ends is after starts */ DBUG_PRINT("info", ("ENDS after STARTS?")); Loading Loading
mysql-test/r/events_bugs.result +8 −0 Original line number Diff line number Diff line create database if not exists events_test; use events_test; set @a=3; CREATE PROCEDURE p_16 () CREATE EVENT e_16 ON SCHEDULE EVERY @a SECOND DO SET @a=5; call p_16(); Loading @@ -14,6 +15,13 @@ CALL p_16(); ERROR HY000: Event 'e_16' already exists DROP PROCEDURE p_16; DROP EVENT e_16; 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; ERROR HY000: Incorrect STARTS value: '99990101000000' create event e_55 on schedule every 10 minute ends 99990101000000 do drop table t; ERROR HY000: ENDS is either invalid or before STARTS set global event_scheduler=0; "Wait a bit to settle down" delete from mysql.event; Loading
mysql-test/t/events_bugs.test +13 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,19 @@ DROP EVENT e_16; # END - BUG#16408: Events: crash for an event in a procedure # # # Start - 16396: Events: Distant-future dates become past dates # --error 1503 create event e_55 on schedule at 99990101000000 do drop table t; --error 1503 create event e_55 on schedule every 10 hour starts 99990101000000 do drop table t; --error 1521 create event e_55 on schedule every 10 minute ends 99990101000000 do drop table t; # # End - 16396: Events: Distant-future dates become past dates # # # Start - 16407: Events: Changes in sql_mode won't be taken into account # Loading
sql/event_timed.cc +33 −8 Original line number Diff line number Diff line Loading @@ -151,6 +151,7 @@ Event_timed::init_execute_at(THD *thd, Item *expr) { my_bool not_used; TIME ltime; my_time_t t; TIME time_tmp; DBUG_ENTER("Event_timed::init_execute_at"); Loading @@ -174,12 +175,18 @@ Event_timed::init_execute_at(THD *thd, Item *expr) TIME_to_ulonglong_datetime(&time_tmp)) DBUG_RETURN(EVEX_BAD_PARAMS); /* This may result in a 1970-01-01 date if ltime is > 2037-xx-xx. CONVERT_TZ has similar problem. mysql_priv.h currently lists #define TIMESTAMP_MAX_YEAR 2038 (see TIME_to_timestamp()) */ my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd,<ime, ¬_used)); my_tz_UTC->gmt_sec_to_TIME(<ime,t=TIME_to_timestamp(thd,<ime,¬_used)); if (!t) { DBUG_PRINT("error", ("Execute AT after year 2037")); DBUG_RETURN(ER_WRONG_VALUE); } execute_at_null= FALSE; execute_at= ltime; Loading Loading @@ -302,6 +309,7 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval) RETURNS 0 OK EVEX_PARSE_ERROR fix_fields failed EVEX_BAD_PARAMS starts before now */ int Loading @@ -309,6 +317,7 @@ Event_timed::init_starts(THD *thd, Item *new_starts) { my_bool not_used; TIME ltime, time_tmp; my_time_t t; DBUG_ENTER("Event_timed::init_starts"); Loading @@ -329,10 +338,17 @@ Event_timed::init_starts(THD *thd, Item *new_starts) DBUG_RETURN(EVEX_BAD_PARAMS); /* This may result in a 1970-01-01 date if ltime is > 2037-xx-xx CONVERT_TZ has similar problem This may result in a 1970-01-01 date if ltime is > 2037-xx-xx. CONVERT_TZ has similar problem. mysql_priv.h currently lists #define TIMESTAMP_MAX_YEAR 2038 (see TIME_to_timestamp()) */ my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used)); my_tz_UTC->gmt_sec_to_TIME(<ime,t=TIME_to_timestamp(thd, <ime, ¬_used)); if (!t) { DBUG_PRINT("error", ("STARTS after year 2037")); DBUG_RETURN(EVEX_BAD_PARAMS); } starts= ltime; starts_null= FALSE; Loading @@ -359,6 +375,7 @@ Event_timed::init_starts(THD *thd, Item *new_starts) RETURNS 0 OK EVEX_PARSE_ERROR fix_fields failed ER_WRONG_VALUE starts distant date (after year 2037) EVEX_BAD_PARAMS ENDS before STARTS */ Loading @@ -367,6 +384,7 @@ Event_timed::init_ends(THD *thd, Item *new_ends) { TIME ltime, ltime_now; my_bool not_used; my_time_t t; DBUG_ENTER("Event_timed::init_ends"); Loading @@ -378,11 +396,18 @@ Event_timed::init_ends(THD *thd, Item *new_ends) DBUG_RETURN(EVEX_BAD_PARAMS); /* This may result in a 1970-01-01 date if ltime is > 2037-xx-xx ? CONVERT_TZ has similar problem ? This may result in a 1970-01-01 date if ltime is > 2037-xx-xx. CONVERT_TZ has similar problem. mysql_priv.h currently lists #define TIMESTAMP_MAX_YEAR 2038 (see TIME_to_timestamp()) */ DBUG_PRINT("info", ("get the UTC time")); my_tz_UTC->gmt_sec_to_TIME(<ime, TIME_to_timestamp(thd, <ime, ¬_used)); my_tz_UTC->gmt_sec_to_TIME(<ime,t=TIME_to_timestamp(thd, <ime, ¬_used)); if (!t) { DBUG_PRINT("error", ("ENDS after year 2037")); DBUG_RETURN(EVEX_BAD_PARAMS); } /* Check whether ends is after starts */ DBUG_PRINT("info", ("ENDS after STARTS?")); Loading