diff --git a/sql/event_data_objects.cc b/sql/event_data_objects.cc index 36f20c34200240c0e76ba37486da7e52537ae4b2..4a78c1affb0c949c9b87d46b8259c44138c269e9 100644 --- a/sql/event_data_objects.cc +++ b/sql/event_data_objects.cc @@ -1293,7 +1293,7 @@ bool get_next_time(const Time_zone *time_zone, my_time_t *next, time, and this will greatly reduce the effect of the optimization. So instead we keep the code simple and clean. */ - interval.month= diff_months - diff_months % months; + interval.month= (ulong) (diff_months - diff_months % months); next_time= add_interval(&local_start, time_zone, INTERVAL_MONTH, interval); if (next_time == 0) @@ -1301,7 +1301,7 @@ bool get_next_time(const Time_zone *time_zone, my_time_t *next, if (next_time <= time_now) { - interval.month= months; + interval.month= (ulong) months; next_time= add_interval(&local_start, time_zone, INTERVAL_MONTH, interval); if (next_time == 0) diff --git a/sql/event_queue.cc b/sql/event_queue.cc index bcfe0a222f1c1d4c5664c16cbce87a2bb8c3f3e9..0efd9bb85d13867ebc5f49e51fb5cb750cbafa4c 100644 --- a/sql/event_queue.cc +++ b/sql/event_queue.cc @@ -65,13 +65,10 @@ struct event_queue_param static int event_queue_element_compare_q(void *vptr, byte* a, byte *b) { - /* - Note that no overflow is possible here because both values are - non-negative, and subtraction is done in the signed my_time_t - type. - */ - return (((Event_queue_element *)a)->execute_at - - ((Event_queue_element *)b)->execute_at); + my_time_t lhs = ((Event_queue_element *)a)->execute_at; + my_time_t rhs = ((Event_queue_element *)b)->execute_at; + + return (lhs < rhs ? -1 : (lhs > rhs ? 1 : 0)); } @@ -580,8 +577,7 @@ Event_queue::get_top_for_execution_if_time(THD *thd, time or until signaled. Release LOCK_queue while waiting. */ struct timespec top_time; - top_time.tv_sec= next_activation_at; - top_time.tv_nsec= 0; + set_timespec(top_time, next_activation_at - thd->query_start()); cond_wait(thd, &top_time, queue_wait_msg, SCHED_FUNC, __LINE__); continue;