Commit cd0f12b5 authored by unknown's avatar unknown
Browse files

Merge mysql.com:/home/jimw/my/mysql-4.1-7308

into  mysql.com:/home/jimw/my/mysql-4.1-clean

parents 82f674f9 015165ad
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -153,3 +153,13 @@ dt
0000-00-00 00:00:00
0000-00-00 00:00:00
drop table t1;
create table t1 (dt datetime);
insert into t1 values ("20010101T010101");
insert into t1 values ("2001-01-01T01:01:01");
insert into t1 values ("2001-1-1T1:01:01");
select * from t1;
dt
2001-01-01 01:01:01
2001-01-01 01:01:01
2001-01-01 01:01:01
drop table t1;
+10 −0
Original line number Diff line number Diff line
@@ -102,4 +102,14 @@ insert into t1 values ("00-00-00"), ("00-00-00 00:00:00");
select * from t1;
drop table t1;

#
# Bug #7308: ISO-8601 date format not handled correctly
#
create table t1 (dt datetime);
insert into t1 values ("20010101T010101");
insert into t1 values ("2001-01-01T01:01:01");
insert into t1 values ("2001-1-1T1:01:01");
select * from t1;
drop table t1;

# End of 4.1 tests
+7 −5
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
  {
    /* Found date in internal format (only numbers like YYYYMMDD) */
    year_length= (digits == 4 || digits == 8 || digits >= 14) ? 4 : 2;
    field_length=year_length-1;
    field_length= year_length;
    is_internal_format= 1;
    format_position= internal_format_positions;
  }
@@ -177,6 +177,8 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
        start_loop= 5;                         /* Start with first date part */
      }
    }

    field_length= format_position[0] == 0 ? 4 : 2;
  }

  /*
@@ -201,7 +203,7 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
    const char *start= str;
    ulong tmp_value= (uint) (uchar) (*str++ - '0');
    while (str != end && my_isdigit(&my_charset_latin1,str[0]) &&
           (!is_internal_format || field_length--))
           --field_length)
    {
      tmp_value=tmp_value*10 + (ulong) (uchar) (*str - '0');
      str++;
@@ -215,8 +217,8 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
    date[i]=tmp_value;
    not_zero_date|= tmp_value;

    /* Length-1 of next field */
    field_length= format_position[i+1] == 0 ? 3 : 1;
    /* Length of next field */
    field_length= format_position[i+1] == 0 ? 4 : 2;

    if ((last_field_pos= str) == end)
    {
@@ -234,7 +236,7 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
      if (*str == '.')                          /* Followed by part seconds */
      {
        str++;
        field_length= 5;                        /* 5 digits after first (=6) */
        field_length= 6;                        /* 6 digits */
      }
      continue;