diff options
author | kroki/tomash@moonlight.home <> | 2007-03-16 17:31:07 +0300 |
---|---|---|
committer | kroki/tomash@moonlight.home <> | 2007-03-16 17:31:07 +0300 |
commit | 6d8f6b5bfd6351142164b1f85b613ea133d478d3 (patch) | |
tree | 8922072c4b428d1e321673d0ec9e460b316a9c07 /sql/events.cc | |
parent | 245668efb034aa55a5c34978f9e7a081dabb1ea2 (diff) | |
download | mariadb-git-6d8f6b5bfd6351142164b1f85b613ea133d478d3.tar.gz |
BUG#16420: Events: timestamps become UTC
BUG#26429: SHOW CREATE EVENT is incorrect for an event that
STARTS NOW()
BUG#26431: Impossible to re-create an event from backup if its
STARTS clause is in the past
WL#3698: Events: execution in local time zone
The problem was that local times specified by the user in AT, STARTS
and ENDS of CREATE EVENT/ALTER EVENT statement were converted to UTC,
and the original time zone was forgotten. This way, event scheduler
couldn't honor Daylight Saving Time shifts, and times shown to the
user were also in UTC. Additionally, CREATE EVENT didn't allow times
in the past, thus preventing straightforward event restoration from
old backups.
This patch reworks event scheduler time computations, performing them
in the time zone associated with the event. Also it allows times to
be in the past.
The patch adds time_zone column to mysql.event table.
NOTE: The patch is almost final, but the bug#9953 should be pushed
first.
Diffstat (limited to 'sql/events.cc')
-rw-r--r-- | sql/events.cc | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sql/events.cc b/sql/events.cc index f73dc97e7c2..88014ee34af 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -326,7 +326,8 @@ Events::create_event(THD *thd, Event_parse_data *parse_data, bool if_not_exists) pthread_mutex_lock(&LOCK_event_metadata); /* On error conditions my_error() is called so no need to handle here */ - if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists))) + if (!(ret= db_repository->create_event(thd, parse_data, if_not_exists)) && + !parse_data->do_not_create) { Event_queue_element *new_element; @@ -527,6 +528,10 @@ Events::show_create_event(THD *thd, LEX_STRING dbname, LEX_STRING name) field_list.push_back(new Item_empty_string("sql_mode", sql_mode_len)); + const String *tz_name= et->time_zone->get_name(); + field_list.push_back(new Item_empty_string("time_zone", + tz_name->length())); + field_list.push_back(new Item_empty_string("Create Event", show_str.length())); @@ -539,6 +544,8 @@ Events::show_create_event(THD *thd, LEX_STRING dbname, LEX_STRING name) protocol->store((char*) sql_mode_str, sql_mode_len, scs); + protocol->store((char*) tz_name->ptr(), tz_name->length(), scs); + protocol->store(show_str.c_ptr(), show_str.length(), scs); ret= protocol->write(); send_eof(thd); @@ -942,7 +949,7 @@ Events::load_events_from_db(THD *thd) } DBUG_PRINT("info", ("Loading event from row.")); - if ((ret= et->load_from_row(table))) + if ((ret= et->load_from_row(thd, table))) { sql_print_error("SCHEDULER: Error while loading from mysql.event. " "Table probably corrupted"); @@ -967,7 +974,7 @@ Events::load_events_from_db(THD *thd) Event_job_data temp_job_data; DBUG_PRINT("info", ("Event %s loaded from row. ", et->name.str)); - temp_job_data.load_from_row(table); + temp_job_data.load_from_row(thd, table); /* We load only on scheduler root just to check whether the body |