diff --git a/mysql-test/r/events.result b/mysql-test/r/events.result index c3b94e580c21de39f0e28c04ee07ed4c06bb9eae..38c2d902ec1e7761ed97bd658dc12622afc136b7 100644 --- a/mysql-test/r/events.result +++ b/mysql-test/r/events.result @@ -4,8 +4,9 @@ drop event if exists event1; Warnings: Note 1305 Event event1 does not exist create event event1 on schedule every 15 minute starts now() ends date_add(now(), interval 5 hour) DO begin end; -alter event event1 rename to event2; -alter event event2 disabled; +alter event event1 rename to event2 enable; +alter event event2 disable; +alter event event2 enable; alter event event2 on completion not preserve; alter event event2 on schedule every 1 year on completion preserve rename to event3 comment "new comment" do begin select 1; end__ alter event event3 rename to event2; @@ -40,6 +41,15 @@ count(*) 0 drop event event3; drop table t_event3; +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 +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 3f9445fc84563b99f720b236636f5326c334b373..c92e247ef7fcf227b286c35c00f728122bcd4ace 100644 --- a/mysql-test/t/events.test +++ b/mysql-test/t/events.test @@ -2,8 +2,9 @@ create database if not exists events_test; use events_test; drop event if exists event1; create event event1 on schedule every 15 minute starts now() ends date_add(now(), interval 5 hour) DO begin end; -alter event event1 rename to event2; -alter event event2 disabled; +alter event event1 rename to event2 enable; +alter event event2 disable; +alter event event2 enable; alter event event2 on completion not preserve; delimiter __; alter event event2 on schedule every 1 year on completion preserve rename to event3 comment "new comment" do begin select 1; end__ @@ -32,6 +33,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' disable 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 3b59bb3359647ee08130afa39ab60441102be615..4e64ad2ee54547cf849467186f36b38119ef5a03 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/lex.h b/sql/lex.h index e0b4855abc3fcffe302e0c11f961ccd63346d032..3dfaa0cf6cb0b1a224ea0e1ea3d8046539636f28 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -168,7 +168,6 @@ static SYMBOL symbols[] = { { "DETERMINISTIC", SYM(DETERMINISTIC_SYM)}, { "DIRECTORY", SYM(DIRECTORY_SYM)}, { "DISABLE", SYM(DISABLE_SYM)}, - { "DISABLED", SYM(DISABLED_SYM)}, { "DISCARD", SYM(DISCARD)}, { "DISK", SYM(DISK_SYM)}, { "DISTINCT", SYM(DISTINCT)}, @@ -185,7 +184,6 @@ static SYMBOL symbols[] = { { "ELSE", SYM(ELSE)}, { "ELSEIF", SYM(ELSEIF_SYM)}, { "ENABLE", SYM(ENABLE_SYM)}, - { "ENABLED", SYM(ENABLED_SYM)}, { "ENCLOSED", SYM(ENCLOSED)}, { "END", SYM(END)}, { "ENDS", SYM(ENDS_SYM)}, diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index 6cc5eec1afd6296d52cf6a6e6aaa053ea55fa63c..4c273258815d1d4caebe2233446c7e6bce2142b6 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 224b598e9829e04104657d083c78c0e1432dfa99..a07bed584d09df6b7982cffc08cf6643aff3cec8 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -243,7 +243,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token DETERMINISTIC_SYM %token DIRECTORY_SYM %token DISABLE_SYM -%token DISABLED_SYM %token DISCARD %token DISK_SYM %token DISTINCT @@ -259,7 +258,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token ELSEIF_SYM %token ELT_FUNC %token ENABLE_SYM -%token ENABLED_SYM %token ENCLOSED %token ENCODE_SYM %token ENCRYPT @@ -1436,6 +1434,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; @@ -1446,14 +1454,14 @@ ev_schedule_time: EVERY_SYM expr interval ; opt_ev_status: /* empty */ {$<ulong_num>$= 0;} - | ENABLED_SYM + | ENABLE_SYM { LEX *lex=Lex; if (!lex->et_compile_phase) lex->et->status= MYSQL_EVENT_ENABLED; $<ulong_num>$= 1; } - | DISABLED_SYM + | DISABLE_SYM { LEX *lex=Lex; @@ -9302,7 +9310,7 @@ keyword_sp: | DELAY_KEY_WRITE_SYM {} | DES_KEY_FILE {} | DIRECTORY_SYM {} - | DISABLED_SYM {} + | DISABLE_SYM {} | DISCARD {} | DISK_SYM {} | DUMPFILE {} @@ -9322,9 +9330,7 @@ keyword_sp: | EXTENT_SIZE_SYM {} | FAST_SYM {} | FOUND_SYM {} - | DISABLE_SYM {} | ENABLE_SYM {} - | ENABLED_SYM {} | FULL {} | FILE_SYM {} | FIRST_SYM {}