Loading mysql-test/r/type_datetime.result +10 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/type_datetime.test +10 −0 Original line number Diff line number Diff line Loading @@ -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 sql-common/my_time.c +7 −5 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } /* Loading @@ -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++; Loading @@ -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) { Loading @@ -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; Loading Loading
mysql-test/r/type_datetime.result +10 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/type_datetime.test +10 −0 Original line number Diff line number Diff line Loading @@ -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
sql-common/my_time.c +7 −5 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } /* Loading @@ -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++; Loading @@ -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) { Loading @@ -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; Loading