List:Commits« Previous MessageNext Message »
From:kpettersson Date:July 24 2007 12:28pm
Subject:bk commit into 5.1 tree (thek:1.2556) BUG#28641
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of thek. When thek does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-07-24 14:28:20+02:00, thek@adventure.(none) +7 -0
  Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash.
  
  Creating an EVENT to be executed in a calendar time close of the end of the 
  interval of defined calendar times, would cause the server to crash. The
  expected behavior is to accept all calendar times within the interval and reject all
  other values without crashing.
  
  This patch replaces the function 'sec_to_epoch_TIME' with the Time_zone API.
  This function was broken because it invoked the internal function 'sec_to_epoch'
  without respecting the restrictions on the function parameters.

  mysql-test/r/events_bugs.result@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +14 -0
    Added test case

  mysql-test/t/events_bugs.test@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +25 -0
    Added test case

  sql/event_data_objects.cc@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +5 -4
    Replaced function 'sec_since_epoch_TIME' since it was implemented as
    a wrapper around an sec_since_epoch without taking parameter restrictions
    into account.

  sql/event_db_repository.cc@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +4 -4
    Replaced my_tz_UTC object with my_tz_OFFSET0 object because the latter
    doesn't supply us with a bijective MYSQL_TIME<->my_time_t translation.

  sql/event_queue.cc@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +1 -1
    Replaced my_tz_UTC object with my_tz_OFFSET0 object because the latter
    doesn't supply us with a bijective MYSQL_TIME<->my_time_t translation.

  sql/tztime.cc@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +2 -13
    Remove function 'sec_since_epoch_TIME' since it was implemented as
    a wrapper around 'sec_since_epoch' without taking parameter restrictions
    into account.
    
    Added static Time_zone object for UTC+0 time zone.

  sql/tztime.h@stripped, 2007-07-24 14:28:18+02:00, thek@adventure.(none) +1 -0
    Include extern pointer to static Time_zone object.

diff -Nrup a/mysql-test/r/events_bugs.result b/mysql-test/r/events_bugs.result
--- a/mysql-test/r/events_bugs.result	2007-07-17 11:09:58 +02:00
+++ b/mysql-test/r/events_bugs.result	2007-07-24 14:28:18 +02:00
@@ -611,3 +611,17 @@ id	ev_nm	ev_cnt
 DROP TABLE event_log;
 SET GLOBAL event_scheduler = OFF;
 DROP DATABASE events_test;
+DROP TABLE IF EXISTS event_log;
+SET GLOBAL event_scheduler= ON;
+CREATE TABLE event_log (id int KEY AUTO_INCREMENT, ev_nm char(40), ev_cnt int, ev_tm timestamp) ENGINE=MyISAM;
+SET @ev_base_date = 20281224180000;
+CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
+            DO BEGIN
+SET @evname = 'bug28641';
+SET @cnt = 0;
+SELECT count(*) into @cnt from event_log where ev_nm = @evname ;
+INSERT INTO event_log VALUES (NULL,@evname,@cnt+1,current_timestamp());
+END;|
+SET GLOBAL event_scheduler= OFF;
+DROP EVENT bug28641;
+DROP TABLE event_log;
diff -Nrup a/mysql-test/t/events_bugs.test b/mysql-test/t/events_bugs.test
--- a/mysql-test/t/events_bugs.test	2007-07-01 20:00:23 +02:00
+++ b/mysql-test/t/events_bugs.test	2007-07-24 14:28:18 +02:00
@@ -722,3 +722,28 @@ let $wait_condition=
 --source include/wait_condition.inc
 
 DROP DATABASE events_test;
+
+
+#
+# Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash.
+#
+
+--disable_warnings
+DROP TABLE IF EXISTS event_log;
+--enable_warnings
+SET GLOBAL event_scheduler= ON;
+eval CREATE TABLE event_log (id int KEY AUTO_INCREMENT, ev_nm char(40), ev_cnt int, ev_tm timestamp) ENGINE=MyISAM; 
+SET @ev_base_date = 20281224180000;
+DELIMITER |;
+CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
+            DO BEGIN
+               SET @evname = 'bug28641';
+               SET @cnt = 0;
+               SELECT count(*) into @cnt from event_log where ev_nm = @evname ;
+               INSERT INTO event_log VALUES (NULL,@evname,@cnt+1,current_timestamp());
+               END;|
+
+DELIMITER ;|
+SET GLOBAL event_scheduler= OFF;
+DROP EVENT bug28641;
+DROP TABLE event_log;
diff -Nrup a/sql/event_data_objects.cc b/sql/event_data_objects.cc
--- a/sql/event_data_objects.cc	2007-07-01 23:35:47 +02:00
+++ b/sql/event_data_objects.cc	2007-07-24 14:28:18 +02:00
@@ -979,17 +979,18 @@ Event_queue_element::load_from_row(THD *
     DBUG_RETURN(TRUE);
 
   starts_null= table->field[ET_FIELD_STARTS]->is_null();
+  my_bool in_dst_gap= FALSE;
   if (!starts_null)
   {
     table->field[ET_FIELD_STARTS]->get_date(&time, TIME_NO_ZERO_DATE);
-    starts= sec_since_epoch_TIME(&time);
+    starts= my_tz_OFFSET0->TIME_to_gmt_sec(&time,&in_dst_gap);
   }
 
   ends_null= table->field[ET_FIELD_ENDS]->is_null();
   if (!ends_null)
   {
     table->field[ET_FIELD_ENDS]->get_date(&time, TIME_NO_ZERO_DATE);
-    ends= sec_since_epoch_TIME(&time);
+    ends= my_tz_OFFSET0->TIME_to_gmt_sec(&time,&in_dst_gap);
   }
 
   if (!table->field[ET_FIELD_INTERVAL_EXPR]->is_null())
@@ -1007,7 +1008,7 @@ Event_queue_element::load_from_row(THD *
     if (table->field[ET_FIELD_EXECUTE_AT]->get_date(&time,
                                                     TIME_NO_ZERO_DATE))
       DBUG_RETURN(TRUE);
-    execute_at= sec_since_epoch_TIME(&time);
+    execute_at= my_tz_OFFSET0->TIME_to_gmt_sec(&time,&in_dst_gap);
   }
 
   /*
@@ -1039,7 +1040,7 @@ Event_queue_element::load_from_row(THD *
   {
     table->field[ET_FIELD_LAST_EXECUTED]->get_date(&time,
                                                    TIME_NO_ZERO_DATE);
-    last_executed= sec_since_epoch_TIME(&time);
+    last_executed= my_tz_OFFSET0->TIME_to_gmt_sec(&time,&in_dst_gap);
   }
   last_executed_changed= FALSE;
 
diff -Nrup a/sql/event_db_repository.cc b/sql/event_db_repository.cc
--- a/sql/event_db_repository.cc	2007-06-28 19:34:48 +02:00
+++ b/sql/event_db_repository.cc	2007-07-24 14:28:18 +02:00
@@ -250,7 +250,7 @@ mysql_event_fill_row(THD *thd,
     if (!et->starts_null)
     {
       MYSQL_TIME time;
-      my_tz_UTC->gmt_sec_to_TIME(&time, et->starts);
+      my_tz_OFFSET0->gmt_sec_to_TIME(&time, et->starts);
 
       fields[ET_FIELD_STARTS]->set_notnull();
       fields[ET_FIELD_STARTS]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
@@ -259,7 +259,7 @@ mysql_event_fill_row(THD *thd,
     if (!et->ends_null)
     {
       MYSQL_TIME time;
-      my_tz_UTC->gmt_sec_to_TIME(&time, et->ends);
+      my_tz_OFFSET0->gmt_sec_to_TIME(&time, et->ends);
 
       fields[ET_FIELD_ENDS]->set_notnull();
       fields[ET_FIELD_ENDS]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
@@ -278,7 +278,7 @@ mysql_event_fill_row(THD *thd,
     fields[ET_FIELD_ENDS]->set_null();
 
     MYSQL_TIME time;
-    my_tz_UTC->gmt_sec_to_TIME(&time, et->execute_at);
+    my_tz_OFFSET0->gmt_sec_to_TIME(&time, et->execute_at);
 
     fields[ET_FIELD_EXECUTE_AT]->set_notnull();
     fields[ET_FIELD_EXECUTE_AT]->
@@ -1004,7 +1004,7 @@ update_timing_fields_for_event(THD *thd,
   if (update_last_executed)
   {
     MYSQL_TIME time;
-    my_tz_UTC->gmt_sec_to_TIME(&time, last_executed);
+    my_tz_OFFSET0->gmt_sec_to_TIME(&time, last_executed);
 
     fields[ET_FIELD_LAST_EXECUTED]->set_notnull();
     fields[ET_FIELD_LAST_EXECUTED]->store_time(&time,
diff -Nrup a/sql/event_queue.cc b/sql/event_queue.cc
--- a/sql/event_queue.cc	2007-06-01 09:43:51 +02:00
+++ b/sql/event_queue.cc	2007-07-24 14:28:18 +02:00
@@ -740,7 +740,7 @@ Event_queue::dump_internal_status()
   printf("WOC             : %s\n", waiting_on_cond? "YES":"NO");
 
   MYSQL_TIME time;
-  my_tz_UTC->gmt_sec_to_TIME(&time, next_activation_at);
+  my_tz_OFFSET0->gmt_sec_to_TIME(&time, next_activation_at);
   if (time.year != 1970)
     printf("Next activation : %04d-%02d-%02d %02d:%02d:%02d\n",
            time.year, time.month, time.day, time.hour, time.minute, time.second);
diff -Nrup a/sql/tztime.cc b/sql/tztime.cc
--- a/sql/tztime.cc	2007-05-24 00:39:26 +02:00
+++ b/sql/tztime.cc	2007-07-24 14:28:18 +02:00
@@ -807,19 +807,6 @@ sec_since_epoch(int year, int mon, int m
          SECS_PER_MIN + sec;
 }
 
-
- /*
-  Works like sec_since_epoch but expects MYSQL_TIME structure as parameter.
-*/
-
-my_time_t
-sec_since_epoch_TIME(MYSQL_TIME *t)
-{
-  return sec_since_epoch(t->year, t->month, t->day,
-                         t->hour, t->minute, t->second);
-}
-
-
 /*
   Converts local time in broken down MYSQL_TIME representation to my_time_t
   representation.
@@ -1425,7 +1412,9 @@ Time_zone_offset::get_name() const
 
 static Time_zone_utc tz_UTC;
 static Time_zone_system tz_SYSTEM;
+static Time_zone_offset tz_OFFSET0(0);
 
+Time_zone *my_tz_OFFSET0= &tz_OFFSET0;
 Time_zone *my_tz_UTC= &tz_UTC;
 Time_zone *my_tz_SYSTEM= &tz_SYSTEM;
 
diff -Nrup a/sql/tztime.h b/sql/tztime.h
--- a/sql/tztime.h	2007-05-16 12:49:38 +02:00
+++ b/sql/tztime.h	2007-07-24 14:28:18 +02:00
@@ -59,6 +59,7 @@ public:
 
 extern Time_zone * my_tz_UTC;
 extern Time_zone * my_tz_SYSTEM;
+extern Time_zone * my_tz_OFFSET0;
 extern Time_zone * my_tz_find(THD *thd, const String *name);
 extern my_bool     my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap);
 extern void        my_tz_free();
Thread
bk commit into 5.1 tree (thek:1.2556) BUG#28641kpettersson24 Jul