List:Commits« Previous MessageNext Message »
From:Georgi Kodinov Date:June 3 2010 3:37pm
Subject:bzr commit into mysql-5.1-bugteam branch (Georgi.Kodinov:3414)
View as plain text  
#At file:///home/kgeorge/mysql/work/B52315-5.1-bugteam/ based on revid:davi.arnaut@stripped

 3414 Georgi Kodinov	2010-06-03 [merge]
      merge

    modified:
      mysql-test/r/variables.result
      mysql-test/t/variables.test
      sql/mysqld.cc
      sql/set_var.cc
      sql/set_var.h
      sql/sql_class.h
      sql/sql_parse.cc
=== modified file 'mysql-test/r/variables.result'
--- a/mysql-test/r/variables.result	2010-03-31 13:12:37 +0000
+++ b/mysql-test/r/variables.result	2010-06-03 15:36:45 +0000
@@ -1026,6 +1026,13 @@ hostname	#
 # Test 'myisam_mmap_size' option is not dynamic
 SET @@myisam_mmap_size= 500M;
 ERROR HY000: Variable 'myisam_mmap_size' is a read only variable
+#
+# Bug #52315: utc_date() crashes when system time > year 2037
+#
+SET TIMESTAMP=2*1024*1024*1024;
+#Should not crash
+SELECT UTC_DATE();
+SET TIMESTAMP=DEFAULT;
 End of 5.0 tests
 set join_buffer_size=1;
 Warnings:

=== modified file 'mysql-test/t/variables.test'
--- a/mysql-test/t/variables.test	2010-03-31 13:12:37 +0000
+++ b/mysql-test/t/variables.test	2010-06-03 15:36:45 +0000
@@ -785,6 +785,20 @@ show variables like 'hostname';
 --echo # Test 'myisam_mmap_size' option is not dynamic
 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
 SET @@myisam_mmap_size= 500M;
+
+
+--echo #
+--echo # Bug #52315: utc_date() crashes when system time > year 2037
+--echo #
+
+--error 0, ER_UNKNOWN_ERROR
+SET TIMESTAMP=2*1024*1024*1024;
+--echo #Should not crash
+--disable_result_log
+SELECT UTC_DATE();
+--enable_result_log
+SET TIMESTAMP=DEFAULT;
+
 --echo End of 5.0 tests
 
 #

=== modified file 'sql/mysqld.cc'
--- a/sql/mysqld.cc	2010-05-29 18:16:45 +0000
+++ b/sql/mysqld.cc	2010-06-03 15:36:45 +0000
@@ -3233,6 +3233,12 @@ static int init_common_variables(const c
 
   max_system_variables.pseudo_thread_id= (ulong)~0;
   server_start_time= flush_status_time= my_time(0);
+  /* TODO: remove this when my_time_t is 64 bit compatible */
+  if (server_start_time >= (time_t) MY_TIME_T_MAX)
+  {
+    sql_print_error("This MySQL server doesn't support dates later then 2038");
+    return 1;
+  }
   rpl_filter= new Rpl_filter;
   binlog_filter= new Rpl_filter;
   if (!rpl_filter || !binlog_filter)

=== modified file 'sql/set_var.cc'
--- a/sql/set_var.cc	2010-05-20 06:31:03 +0000
+++ b/sql/set_var.cc	2010-06-03 15:36:45 +0000
@@ -2718,10 +2718,26 @@ int set_var_collation_client::update(THD
 
 /****************************************************************************/
 
+bool sys_var_timestamp::check(THD *thd, set_var *var)
+{
+  time_t val;
+  var->save_result.ulonglong_value= var->value->val_int();
+  val= (time_t) var->save_result.ulonglong_value;
+  if (val < (time_t) MY_TIME_T_MIN || val > (time_t) MY_TIME_T_MAX)
+  {
+    my_message(ER_UNKNOWN_ERROR, 
+               "This version of MySQL doesn't support dates later than 2038",
+               MYF(0));
+    return TRUE;
+  }
+  return FALSE;
+}
+
+
 bool sys_var_timestamp::update(THD *thd,  set_var *var)
 {
   thd->set_time((time_t) var->save_result.ulonglong_value);
-  return 0;
+  return FALSE;
 }
 
 

=== modified file 'sql/set_var.h'
--- a/sql/set_var.h	2009-09-29 15:38:40 +0000
+++ b/sql/set_var.h	2010-06-03 15:36:45 +0000
@@ -662,6 +662,7 @@ public:
                     Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
     :sys_var(name_arg, NULL, binlog_status_arg)
   { chain_sys_var(chain); }
+  bool check(THD *thd, set_var *var);
   bool update(THD *thd, set_var *var);
   void set_default(THD *thd, enum_var_type type);
   bool check_type(enum_var_type type)    { return type == OPT_GLOBAL; }

=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h	2010-05-12 11:19:12 +0000
+++ b/sql/sql_class.h	2010-06-03 15:36:45 +0000
@@ -2031,6 +2031,11 @@ public:
   }
   void set_time_after_lock()  { utime_after_lock= my_micro_time(); }
   ulonglong current_utime()  { return my_micro_time(); }
+  /*TODO: this will be obsolete when we have support for 64 bit my_time_t */
+  inline bool	is_valid_time() 
+  { 
+    return (start_time < (time_t) MY_TIME_T_MAX); 
+  }
   inline ulonglong found_rows(void)
   {
     return limit_found_rows;

=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc	2010-06-01 11:48:24 +0000
+++ b/sql/sql_parse.cc	2010-06-03 15:36:45 +0000
@@ -994,6 +994,19 @@ bool dispatch_command(enum enum_server_c
   thd->enable_slow_log= TRUE;
   thd->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */
   thd->set_time();
+  if (!thd->is_valid_time())
+  {
+    /*
+     If the time has got past 2038 we need to shut this server down
+     We do this by making sure every command is a shutdown and we 
+     have enough privileges to shut the server down
+
+     TODO: remove this when we have full 64 bit my_time_t support
+    */
+    thd->security_ctx->master_access|= SHUTDOWN_ACL;
+    command= COM_SHUTDOWN;
+  }
+
   VOID(pthread_mutex_lock(&LOCK_thread_count));
   thd->query_id= global_query_id;
 


Attachment: [text/bzr-bundle] bzr/georgi.kodinov@oracle.com-20100603153645-3j042ihgpx2425hy.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Georgi.Kodinov:3414) Georgi Kodinov3 Jun