From: Date: November 16 2007 5:43pm Subject: bk commit into 5.0 tree (tnurnberg:1.2549) BUG#32180 List-Archive: http://lists.mysql.com/commits/37972 X-Bug: 32180 Message-Id: <200711161643.lAGGhHV8024289@white.intern.koehntopp.de> Below is the list of changes that have just been committed into a local 5.0 repository of tnurnberg. When tnurnberg 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-11-16 17:43:15+01:00, tnurnberg@stripped +3 -0 Bug #32180: DATE_ADD treats datetime numeric argument as DATE instead of DATETIME This is a regression from 2007-05-18 when code to zero out the returned struct was added to number_to_datetime(); zero for time_type corresponds to MYSQL_TIMESTAMP_DATE. We now explicitly set the type we return (MYSQL_TIMESTAMP_DATETIME). mysql-test/r/func_time.result@stripped, 2007-11-16 17:43:13+01:00, tnurnberg@stripped +12 -0 show that DATE_ADD() behaves the same for YYYYMMDDhhmmss given as string and as integer. mysql-test/t/func_time.test@stripped, 2007-11-16 17:43:14+01:00, tnurnberg@stripped +10 -0 show that DATE_ADD() behaves the same for YYYYMMDDhhmmss given as string and as integer. sql-common/my_time.c@stripped, 2007-11-16 17:43:14+01:00, tnurnberg@stripped +8 -1 explictly set return type in number_to_datetime() diff -Nrup a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result --- a/mysql-test/r/func_time.result 2007-10-09 14:58:07 +02:00 +++ b/mysql-test/r/func_time.result 2007-11-16 17:43:13 +01:00 @@ -1270,4 +1270,16 @@ select concat(a,ifnull(min(date_format(n ERROR HY000: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation 'concat' set lc_time_names=en_US; drop table t1; +select DATE_ADD('20071108181000', INTERVAL 1 DAY); +DATE_ADD('20071108181000', INTERVAL 1 DAY) +2007-11-09 18:10:00 +select DATE_ADD(20071108181000, INTERVAL 1 DAY); +DATE_ADD(20071108181000, INTERVAL 1 DAY) +2007-11-09 18:10:00 +select DATE_ADD('20071108', INTERVAL 1 DAY); +DATE_ADD('20071108', INTERVAL 1 DAY) +2007-11-09 +select DATE_ADD(20071108, INTERVAL 1 DAY); +DATE_ADD(20071108, INTERVAL 1 DAY) +2007-11-09 End of 5.0 tests diff -Nrup a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test --- a/mysql-test/t/func_time.test 2007-10-09 14:58:07 +02:00 +++ b/mysql-test/t/func_time.test 2007-11-16 17:43:14 +01:00 @@ -787,4 +787,14 @@ select concat(a,ifnull(min(date_format(n set lc_time_names=en_US; drop table t1; +# +# Bug#32180: DATE_ADD treats datetime numeric argument as DATE +# instead of DATETIME +# + +select DATE_ADD('20071108181000', INTERVAL 1 DAY); +select DATE_ADD(20071108181000, INTERVAL 1 DAY); +select DATE_ADD('20071108', INTERVAL 1 DAY); +select DATE_ADD(20071108, INTERVAL 1 DAY); + --echo End of 5.0 tests diff -Nrup a/sql-common/my_time.c b/sql-common/my_time.c --- a/sql-common/my_time.c 2007-05-18 06:13:24 +02:00 +++ b/sql-common/my_time.c 2007-11-16 17:43:14 +01:00 @@ -1113,9 +1113,14 @@ longlong number_to_datetime(longlong nr, long part1,part2; *was_cut= 0; + bzero((char*) time_res, sizeof(*time_res)); + time_res->time_type=MYSQL_TIMESTAMP_DATE; if (nr == LL(0) || nr >= LL(10000101000000)) + { + time_res->time_type=MYSQL_TIMESTAMP_DATETIME; goto ok; + } if (nr < 101) goto err; if (nr <= (YY_PART_YEAR-1)*10000L+1231L) @@ -1139,6 +1144,9 @@ longlong number_to_datetime(longlong nr, } if (nr < 101000000L) goto err; + + time_res->time_type=MYSQL_TIMESTAMP_DATETIME; + if (nr <= (YY_PART_YEAR-1)*LL(10000000000)+LL(1231235959)) { nr= nr+LL(20000000000000); /* YYMMDDHHMMSS, 2000-2069 */ @@ -1152,7 +1160,6 @@ longlong number_to_datetime(longlong nr, ok: part1=(long) (nr/LL(1000000)); part2=(long) (nr - (longlong) part1*LL(1000000)); - bzero((char*) time_res, sizeof(*time_res)); time_res->year= (int) (part1/10000L); part1%=10000L; time_res->month= (int) part1 / 100; time_res->day= (int) part1 % 100;