diff --git a/mysql-test/r/events.result b/mysql-test/r/events.result index c3b94e580c2..cffeb8445c9 100644 --- a/mysql-test/r/events.result +++ b/mysql-test/r/events.result @@ -40,6 +40,15 @@ count(*) 0 drop event event3; drop table t_event3; +create event e_26 on schedule at '2017-01-01 00:00:00' disabled 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 +events_test e_26 set @a = 5 root@localhost 2017-01-01 00:00:00 DROP +drop event e_26; +create event e_26 on schedule at NULL disabled do set @a = 5; +ERROR HY000: Incorrect AT value: 'NULL' +create event e_26 on schedule at 'definitely not a datetime' disabled do set @a = 5; +ERROR HY000: Incorrect AT value: 'definitely not a datetime' set names utf8; create event задачка on schedule every 123 minute starts now() ends now() + interval 1 month do select 1; drop event задачка; diff --git a/mysql-test/t/events.test b/mysql-test/t/events.test index 3f9445fc845..35c76010bfa 100644 --- a/mysql-test/t/events.test +++ b/mysql-test/t/events.test @@ -32,6 +32,15 @@ select count(*) from t_event3; drop event event3; drop table t_event3; + +create event e_26 on schedule at '2017-01-01 00:00:00' disabled do set @a = 5; +select db, name, body, definer, convert_tz(execute_at, 'UTC', 'SYSTEM'), on_completion from mysql.event; +drop event e_26; +--error 1503 +create event e_26 on schedule at NULL disabled do set @a = 5; +--error 1503 +create event e_26 on schedule at 'definitely not a datetime' disabled do set @a = 5; + set names utf8; create event задачка on schedule every 123 minute starts now() ends now() + interval 1 month do select 1; drop event задачка; diff --git a/sql/event_timed.cc b/sql/event_timed.cc index 3b59bb33596..4e64ad2ee54 100644 --- a/sql/event_timed.cc +++ b/sql/event_timed.cc @@ -133,6 +133,7 @@ event_timed::init_body(THD *thd) 0 - OK EVEX_PARSE_ERROR - fix_fields failed EVEX_BAD_PARAMS - datetime is in the past + ER_WRONG_VALUE - wrong value for execute at */ int @@ -148,19 +149,19 @@ event_timed::init_execute_at(THD *thd, Item *expr) if (expr->fix_fields(thd, &expr)) DBUG_RETURN(EVEX_PARSE_ERROR); - if (expr->val_int() == MYSQL_TIMESTAMP_ERROR) - DBUG_RETURN(EVEX_BAD_PARAMS); - // let's check whether time is in the past thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp, (my_time_t) thd->query_start()); - if (expr->val_int() < TIME_to_ulonglong_datetime(&time_tmp)) - DBUG_RETURN(EVEX_BAD_PARAMS); if ((not_used= expr->get_date(<ime, TIME_NO_ZERO_DATE))) + DBUG_RETURN(ER_WRONG_VALUE); + + if (TIME_to_ulonglong_datetime(<ime) < + 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 @@ -292,8 +293,7 @@ int event_timed::init_starts(THD *thd, Item *new_starts) { my_bool not_used; - TIME ltime; - my_time_t my_time_tmp; + TIME ltime, time_tmp; DBUG_ENTER("event_timed::init_starts"); @@ -306,6 +306,14 @@ event_timed::init_starts(THD *thd, Item *new_starts) if ((not_used= new_starts->get_date(<ime, TIME_NO_ZERO_DATE))) DBUG_RETURN(EVEX_BAD_PARAMS); + // let's check whether time is in the past + thd->variables.time_zone->gmt_sec_to_TIME(&time_tmp, + (my_time_t) thd->query_start()); + + if (TIME_to_ulonglong_datetime(<ime) < + 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 diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 6cc5eec1afd..4c273258815 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5793,7 +5793,7 @@ ER_EVENT_DATA_TOO_LONG eng "Data for column '%s' too long" ER_DROP_INDEX_FK eng "Cannot drop index '%-.64s': needed in a foreign key constraint" - ger "Kann Index '%-.64s' nicht l�schen: wird f�r einen einen Fremdschl�ssel ben�tigt" + ger "Kann Index '%-.64s' nicht l�schen: wird f�r einen Fremdschl�ssel ben�tigt" ER_CANT_WRITE_LOCK_LOG_TABLE eng "You can't write-lock a log table. Only read access is possible." ER_CANT_READ_LOCK_LOG_TABLE diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 224b598e982..0c70726a6ea 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1436,6 +1436,16 @@ ev_schedule_time: EVERY_SYM expr interval yyerror(ER(ER_SYNTAX_ERROR)); YYABORT; break; + case ER_WRONG_VALUE: + { + char buff[120]; + String str(buff,(uint32) sizeof(buff), system_charset_info); + String *str2= $2->val_str(&str); + my_error(ER_WRONG_VALUE, MYF(0), "AT", + str2? str2->c_ptr():"NULL"); + YYABORT; + break; + } case EVEX_BAD_PARAMS: my_error(ER_EVENT_EXEC_TIME_IN_THE_PAST, MYF(0)); YYABORT;