diff options
author | unknown <kroki/tomash@moonlight.home> | 2007-03-16 17:31:07 +0300 |
---|---|---|
committer | unknown <kroki/tomash@moonlight.home> | 2007-03-16 17:31:07 +0300 |
commit | 086fba76272c2350b71c93e4343ab5fb3ea5d7da (patch) | |
tree | 8922072c4b428d1e321673d0ec9e460b316a9c07 /sql/event_data_objects.h | |
parent | 783b7748370880c8ba4ff80e76d27209efb369f6 (diff) | |
download | mariadb-git-086fba76272c2350b71c93e4343ab5fb3ea5d7da.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.
client/mysqldump.c:
Before every CREATE EVENT, output its time zone.
mysql-test/include/wait_condition.inc:
Add optional $wait_timeout parameter.
mysql-test/lib/init_db.sql:
Add time_zone column.
mysql-test/r/events.result:
Update result.
mysql-test/r/events_bugs.result:
Update result.
mysql-test/r/events_grant.result:
Update result.
mysql-test/r/events_restart_phase1.result:
Update result.
mysql-test/r/events_scheduling.result:
Update result.
mysql-test/r/mysqldump.result:
Update result.
mysql-test/r/ps.result:
Update result.
mysql-test/r/system_mysql_db.result:
Update result.
mysql-test/t/events.test:
Remove STARTS from the result, as it depends on current time.
mysql-test/t/events_bugs.test:
Time in the past is no longer an error.
mysql-test/t/events_restart_phase1.test:
Fill new column 'time_zone' in mysql.event.
mysql-test/t/events_scheduling.test:
Cleanup: disable event scheduler.
scripts/mysql_create_system_tables.sh:
Add new column 'time_zone' to mysql.event.
scripts/mysql_fix_privilege_tables.sql:
Add new column 'time_zone' to mysql.event.
sql/event_data_objects.cc:
The essence of the change is the following:
- for internal times use my_time_t instead of TIME. Assignment and
comparison is done now on plain numbers.
- in init_execute_at(), init_starts(), init_ends() convert given time
to number of seconds since Epoch (aka Unix time, in UTC).
- handle time_zone field loading and storing.
- in get_next_time(), Unix time is converted back to event time zone,
interval is added, and the result is converted to UTC again.
- fix Event_timed::get_create_event() to report STARTS and ENDS.
- before executing the event body we set thread time zone to the
event time zone.
sql/event_data_objects.h:
Add time_zone member to Event_basic class.
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_db_repository.cc:
Add time_zone column handling.
Give a warning and do not create an event if its execution time is in
the past, and ON COMPLETION NOT PRESERVE is set, because such an event
should be dropped by that time. Also, do not allow ALTER EVENT to
set execution time in the past when ON COMPLETION NOT PRESERVE is set.
sql/event_db_repository.h:
Add enum member for new time zone column.
sql/event_queue.cc:
Replace handling of broken down times with simple handling of
my_time_t.
sql/event_queue.h:
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_scheduler.cc:
Add TODO comment.
sql/events.cc:
Send time_zone column for SHOW CREATE EVENT.
sql/share/errmsg.txt:
Update error message, and add two more errors.
sql/sql_show.cc:
Add TIME_ZONE column to the output of SHOW EVENTS.
mysql-test/r/events_time_zone.result:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/r/events_time_zone.result
mysql-test/t/events_time_zone.test:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/t/events_time_zone.test
Diffstat (limited to 'sql/event_data_objects.h')
-rw-r--r-- | sql/event_data_objects.h | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/sql/event_data_objects.h b/sql/event_data_objects.h index 4346b0eb5b8..8e013e40400 100644 --- a/sql/event_data_objects.h +++ b/sql/event_data_objects.h @@ -58,15 +58,20 @@ public: LEX_STRING name; LEX_STRING definer;// combination of user and host + Time_zone *time_zone; + Event_basic(); virtual ~Event_basic(); virtual int - load_from_row(TABLE *table) = 0; + load_from_row(THD *thd, TABLE *table) = 0; protected: bool load_string_fields(Field **fields, ...); + + bool + load_time_zone(THD *thd, const LEX_STRING tz_name); }; @@ -92,11 +97,11 @@ public: enum enum_on_completion on_completion; enum enum_status status; - TIME last_executed; - TIME execute_at; - TIME starts; - TIME ends; + my_time_t last_executed; + my_time_t execute_at; + my_time_t starts; + my_time_t ends; my_bool starts_null; my_bool ends_null; my_bool execute_at_null; @@ -112,7 +117,7 @@ public: virtual ~Event_queue_element(); virtual int - load_from_row(TABLE *table); + load_from_row(THD *thd, TABLE *table); bool compute_next_execution_time(); @@ -168,7 +173,7 @@ public: init(); virtual int - load_from_row(TABLE *table); + load_from_row(THD *thd, TABLE *table); int get_create_event(THD *thd, String *buf); @@ -192,7 +197,7 @@ public: virtual ~Event_job_data(); virtual int - load_from_row(TABLE *table); + load_from_row(THD *thd, TABLE *table); int execute(THD *thd); @@ -224,6 +229,11 @@ public: }; enum enum_on_completion on_completion; enum enum_status status; + /* + do_not_create will be set if STARTS time is in the past and + on_completion == ON_COMPLETION_DROP. + */ + bool do_not_create; const uchar *body_begin; @@ -237,9 +247,9 @@ public: Item* item_ends; Item* item_execute_at; - TIME starts; - TIME ends; - TIME execute_at; + my_time_t starts; + my_time_t ends; + my_time_t execute_at; my_bool starts_null; my_bool ends_null; my_bool execute_at_null; @@ -284,6 +294,9 @@ private: void report_bad_value(const char *item_name, Item *bad_item); + void + check_if_in_the_past(THD *thd, my_time_t ltime_utc); + Event_parse_data(const Event_parse_data &); /* Prevent use of these */ void operator=(Event_parse_data &); }; |