List:Commits« Previous MessageNext Message »
From:ramil Date:November 22 2006 11:06am
Subject:bk commit into 4.1 tree (ramil:1.2556)
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of ram. When ram 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, 2006-11-22 14:06:37+04:00, ramil@stripped +2 -0
  Merge rkalimullin@stripped:/home/bk/mysql-4.1-maint
  into  mysql.com:/usr/home/ram/work/bug21789/my41-bug21789
  MERGE: 1.2510.60.1

  mysql-test/r/date_formats.result@stripped, 2006-11-22 14:06:33+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.22.1.1

  sql-common/my_time.c@stripped, 2006-11-22 14:06:33+04:00, ramil@stripped +0 -0
    Auto merged
    MERGE: 1.15.1.1

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	ramil
# Host:	myoffice.izhnet.ru
# Root:	/usr/home/ram/work/bug21789/my41-bug21789/RESYNC

--- 1.24/mysql-test/r/date_formats.result	2006-11-22 14:06:42 +04:00
+++ 1.25/mysql-test/r/date_formats.result	2006-11-22 14:06:42 +04:00
@@ -181,12 +181,12 @@ date	format	datetime
 2003-01-02 02:11:12.12345AM	%Y-%m-%d %h:%i:%S.%f %p	2003-01-02 02:11:12.123450
 2003-01-02 12:11:12.12345 am	%Y-%m-%d %h:%i:%S.%f%p	2003-01-02 00:11:12.123450
 2003-01-02 11:11:12Pm	%Y-%m-%d %h:%i:%S%p	2003-01-02 23:11:12
-10:20:10	%H:%i:%s	0000-00-00 10:20:10
-10:20:10	%h:%i:%s.%f	0000-00-00 10:20:10
-10:20:10	%T	0000-00-00 10:20:10
-10:20:10AM	%h:%i:%s%p	0000-00-00 10:20:10
-10:20:10AM	%r	0000-00-00 10:20:10
-10:20:10.44AM	%h:%i:%s.%f%p	0000-00-00 10:20:10.440000
+10:20:10	%H:%i:%s	0000-00-00 00:00:00
+10:20:10	%h:%i:%s.%f	0000-00-00 00:00:00
+10:20:10	%T	0000-00-00 00:00:00
+10:20:10AM	%h:%i:%s%p	0000-00-00 00:00:00
+10:20:10AM	%r	0000-00-00 00:00:00
+10:20:10.44AM	%h:%i:%s.%f%p	0000-00-00 00:00:00
 15-01-2001 12:59:58	%d-%m-%Y %H:%i:%S	2001-01-15 12:59:58
 15 September 2001	%d %M %Y	2001-09-15 00:00:00
 15 SEPTEMB 2001	%d %M %Y	2001-09-15 00:00:00
@@ -203,6 +203,13 @@ Tuesday 52 2001	%W %V %X	2002-01-01 00:0
 15-01-2001	%d-%m-%Y %H:%i:%S	2001-01-15 00:00:00
 15-01-20	%d-%m-%y	2020-01-15 00:00:00
 15-2001-1	%d-%Y-%c	2001-01-15 00:00:00
+Warnings:
+Warning	1292	Truncated incorrect datetime value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect datetime value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect datetime value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect datetime value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect datetime value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect datetime value: '0000-00-00 10:20:10.440000'
 select date,format,DATE(str_to_date(date, format)) as date2 from t1;
 date	format	date2
 2003-01-02 10:11:12	%Y-%m-%d %H:%i:%S	2003-01-02
@@ -243,12 +250,12 @@ date	format	time
 2003-01-02 02:11:12.12345AM	%Y-%m-%d %h:%i:%S.%f %p	02:11:12.123450
 2003-01-02 12:11:12.12345 am	%Y-%m-%d %h:%i:%S.%f%p	00:11:12.123450
 2003-01-02 11:11:12Pm	%Y-%m-%d %h:%i:%S%p	23:11:12
-10:20:10	%H:%i:%s	10:20:10
-10:20:10	%h:%i:%s.%f	10:20:10
-10:20:10	%T	10:20:10
-10:20:10AM	%h:%i:%s%p	10:20:10
-10:20:10AM	%r	10:20:10
-10:20:10.44AM	%h:%i:%s.%f%p	10:20:10.440000
+10:20:10	%H:%i:%s	NULL
+10:20:10	%h:%i:%s.%f	NULL
+10:20:10	%T	NULL
+10:20:10AM	%h:%i:%s%p	NULL
+10:20:10AM	%r	NULL
+10:20:10.44AM	%h:%i:%s.%f%p	NULL
 15-01-2001 12:59:58	%d-%m-%Y %H:%i:%S	12:59:58
 15 September 2001	%d %M %Y	00:00:00
 15 SEPTEMB 2001	%d %M %Y	00:00:00
@@ -265,6 +272,13 @@ Tuesday 52 2001	%W %V %X	00:00:00
 15-01-2001	%d-%m-%Y %H:%i:%S	00:00:00
 15-01-20	%d-%m-%y	00:00:00
 15-2001-1	%d-%Y-%c	00:00:00
+Warnings:
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10.440000'
 select date,format,concat(TIME(str_to_date(date, format))) as time2 from t1;
 date	format	time2
 2003-01-02 10:11:12	%Y-%m-%d %H:%i:%S	10:11:12
@@ -274,12 +288,12 @@ date	format	time2
 2003-01-02 02:11:12.12345AM	%Y-%m-%d %h:%i:%S.%f %p	02:11:12.123450
 2003-01-02 12:11:12.12345 am	%Y-%m-%d %h:%i:%S.%f%p	00:11:12.123450
 2003-01-02 11:11:12Pm	%Y-%m-%d %h:%i:%S%p	23:11:12
-10:20:10	%H:%i:%s	10:20:10
-10:20:10	%h:%i:%s.%f	10:20:10
-10:20:10	%T	10:20:10
-10:20:10AM	%h:%i:%s%p	10:20:10
-10:20:10AM	%r	10:20:10
-10:20:10.44AM	%h:%i:%s.%f%p	10:20:10.440000
+10:20:10	%H:%i:%s	NULL
+10:20:10	%h:%i:%s.%f	NULL
+10:20:10	%T	NULL
+10:20:10AM	%h:%i:%s%p	NULL
+10:20:10AM	%r	NULL
+10:20:10.44AM	%h:%i:%s.%f%p	NULL
 15-01-2001 12:59:58	%d-%m-%Y %H:%i:%S	12:59:58
 15 September 2001	%d %M %Y	00:00:00
 15 SEPTEMB 2001	%d %M %Y	00:00:00
@@ -296,6 +310,13 @@ Tuesday 52 2001	%W %V %X	00:00:00
 15-01-2001	%d-%m-%Y %H:%i:%S	00:00:00
 15-01-20	%d-%m-%y	00:00:00
 15-2001-1	%d-%Y-%c	00:00:00
+Warnings:
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10'
+Warning	1292	Truncated incorrect time value: '0000-00-00 10:20:10.440000'
 select concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d'));
 concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d'))
 2003-01-02 08:11:02.123456

--- 1.16/sql-common/my_time.c	2006-11-22 14:06:42 +04:00
+++ 1.17/sql-common/my_time.c	2006-11-22 14:06:42 +04:00
@@ -405,8 +405,10 @@ err:
                         There may be an optional [.second_part] after seconds
    length               Length of str
    l_time               Store result here
-   was_cut              Set to 1 if value was cut during conversion or to 0
-                        otherwise.
+   warning              Set MYSQL_TIME_WARN_TRUNCATED flag if the input string
+                        was cut during conversion, and/or
+                        MYSQL_TIME_WARN_OUT_OF_RANGE flag, if the value is
+                        out of range.
 
    NOTES
      Because of the extra days argument, this function can only
@@ -417,16 +419,16 @@ err:
      1  error
 */
 
-bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time,
-                 int *was_cut)
+bool str_to_time(const char *str, uint length, MYSQL_TIME *l_time, int *warning)
 {
-  long date[5],value;
+  ulong date[5];
+  ulonglong value;
   const char *end=str+length, *end_of_days;
   bool found_days,found_hours;
   uint state;
 
   l_time->neg=0;
-  *was_cut= 0;
+  *warning= 0;
   for (; str != end && my_isspace(&my_charset_latin1,*str) ; str++)
     length--;
   if (str != end && *str == '-')
@@ -441,13 +443,16 @@ bool str_to_time(const char *str, uint l
   /* Check first if this is a full TIMESTAMP */
   if (length >= 12)
   {                                             /* Probably full timestamp */
+    int was_cut;
     enum enum_mysql_timestamp_type
       res= str_to_datetime(str, length, l_time,
-                           (TIME_FUZZY_DATE | TIME_DATETIME_ONLY), was_cut);
+                           (TIME_FUZZY_DATE | TIME_DATETIME_ONLY), &was_cut);
     if ((int) res >= (int) MYSQL_TIMESTAMP_ERROR)
+    {
+      if (was_cut)
+        *warning|= MYSQL_TIME_WARN_TRUNCATED;
       return res == MYSQL_TIMESTAMP_ERROR;
-    /* We need to restore was_cut flag since str_to_datetime can modify it */
-    *was_cut= 0;
+    }
   }
 
   /* Not a timestamp. Try to get this as a DAYS_TO_SECOND string */
@@ -527,7 +532,7 @@ fractional:
     if (field_length > 0)
       value*= (long) log_10_int[field_length];
     else if (field_length < 0)
-      *was_cut= 1;
+      *warning|= MYSQL_TIME_WARN_TRUNCATED;
     date[4]=value;
   }
   else
@@ -541,10 +546,7 @@ fractional:
        ((str[1] == '-' || str[1] == '+') &&
         (end - str) > 2 &&
         my_isdigit(&my_charset_latin1, str[2]))))
-  {
-    *was_cut= 1;
     return 1;
-  }
 
   if (internal_format_positions[7] != 255)
   {
@@ -563,12 +565,12 @@ fractional:
     }
   }
 
-  /* Some simple checks */
-  if (date[2] >= 60 || date[3] >= 60)
-  {
-    *was_cut= 1;
+  /* Integer overflow checks */
+  if (date[0] > UINT_MAX || date[1] > UINT_MAX ||
+      date[2] > UINT_MAX || date[3] > UINT_MAX ||
+      date[4] > UINT_MAX)
     return 1;
-  }
+  
   l_time->year=         0;                      /* For protocol::store_time */
   l_time->month=        0;
   l_time->day=          date[0];
@@ -578,6 +580,10 @@ fractional:
   l_time->second_part=  date[4];
   l_time->time_type= MYSQL_TIMESTAMP_TIME;
 
+  /* Check if the value is valid and fits into TIME range */
+  if (check_time_range(l_time, warning))
+    return 1;
+  
   /* Check if there is garbage at end of the TIME specification */
   if (str != end)
   {
@@ -585,7 +591,7 @@ fractional:
     {
       if (!my_isspace(&my_charset_latin1,*str))
       {
-        *was_cut= 1;
+        *warning|= MYSQL_TIME_WARN_TRUNCATED;
         break;
       }
     } while (++str != end);
@@ -595,6 +601,47 @@ fractional:
 
 
 /*
+  Check 'time' value to lie in the TIME range
+
+  SYNOPSIS:
+    check_time_range()
+    time     pointer to TIME value
+    warning  set MYSQL_TIME_WARN_OUT_OF_RANGE flag if the value is out of range
+
+  DESCRIPTION
+  If the time value lies outside of the range [-838:59:59, 838:59:59],
+  set it to the closest endpoint of the range and set
+  MYSQL_TIME_WARN_OUT_OF_RANGE flag in the 'warning' variable.
+
+  RETURN
+    0        time value is valid, but was possibly truncated
+    1        time value is invalid
+*/
+
+int check_time_range(struct st_mysql_time *time, int *warning) 
+{
+  longlong hour;
+
+  if (time->minute >= 60 || time->second >= 60)
+    return 1;
+
+  hour= time->hour + (24*time->day);
+  if (hour <= TIME_MAX_HOUR &&
+      (hour != TIME_MAX_HOUR || time->minute != TIME_MAX_MINUTE ||
+       time->second != TIME_MAX_SECOND || !time->second_part))
+    return 0;
+
+  time->day= 0;
+  time->hour= TIME_MAX_HOUR;
+  time->minute= TIME_MAX_MINUTE;
+  time->second= TIME_MAX_SECOND;
+  time->second_part= 0;
+  *warning|= MYSQL_TIME_WARN_OUT_OF_RANGE;
+  return 0;
+}
+
+
+/*
   Prepare offset of system time zone from UTC for my_system_gmt_sec() func.
 
   SYNOPSIS
@@ -779,7 +826,7 @@ void set_zero_time(MYSQL_TIME *tm, enum 
 int my_time_to_str(const MYSQL_TIME *l_time, char *to)
 {
   uint extra_hours= 0;
-  return my_sprintf(to, (to, "%s%02d:%02d:%02d",
+  return my_sprintf(to, (to, "%s%02u:%02u:%02u",
                          (l_time->neg ? "-" : ""),
                          extra_hours+ l_time->hour,
                          l_time->minute,
@@ -788,7 +835,7 @@ int my_time_to_str(const MYSQL_TIME *l_t
 
 int my_date_to_str(const MYSQL_TIME *l_time, char *to)
 {
-  return my_sprintf(to, (to, "%04d-%02d-%02d",
+  return my_sprintf(to, (to, "%04u-%02u-%02u",
                          l_time->year,
                          l_time->month,
                          l_time->day));
@@ -796,7 +843,7 @@ int my_date_to_str(const MYSQL_TIME *l_t
 
 int my_datetime_to_str(const MYSQL_TIME *l_time, char *to)
 {
-  return my_sprintf(to, (to, "%04d-%02d-%02d %02d:%02d:%02d",
+  return my_sprintf(to, (to, "%04u-%02u-%02u %02u:%02u:%02u",
                          l_time->year,
                          l_time->month,
                          l_time->day,
Thread
bk commit into 4.1 tree (ramil:1.2556)ramil22 Nov