diff --git a/mysql-test/r/func_sapdb.result b/mysql-test/r/func_sapdb.result index 3a8515c8831cdd233b01026113d308af753fcd59..516d1df1abc390fbea131db1c43b1836d0493867 100644 --- a/mysql-test/r/func_sapdb.result +++ b/mysql-test/r/func_sapdb.result @@ -282,3 +282,33 @@ TIMEDIFF(TIME('17:59:00'),TIME('17:00:00')), TIMEDIFF(TIME('17:00:00'),TIME('17:59:00')); 1Eq 1NEq1 1NEq2 2Eq 2NEq1 2NEq2 3Eq 3NEq1 3NEq2 Time0 Time00 Literal0000 TIMEDIFF(TIME('17:59:00'),TIME('17:00:00')) TIMEDIFF(TIME('17:00:00'),TIME('17:59:00')) 1 0 0 1 0 0 1 0 0 00:00:00 00:00:00 00:00:00 00:59:00 -00:59:00 +SELECT sec_to_time(3020399)=time('838:59:59'); +sec_to_time(3020399)=time('838:59:59') +1 +SELECT sec_to_time(-3020399)=time('-838:59:59'); +sec_to_time(-3020399)=time('-838:59:59') +1 +SELECT sec_to_time(-3020399)='-838:59:59'; +sec_to_time(-3020399)='-838:59:59' +1 +SELECT time(sec_to_time(-3020399))=time('-838:59:59'); +time(sec_to_time(-3020399))=time('-838:59:59') +1 +SELECT time(sec_to_time(-3020399))=time('-838:59:58'); +time(sec_to_time(-3020399))=time('-838:59:58') +0 +SELECT maketime(-1,0,1)='-01:00:01'; +maketime(-1,0,1)='-01:00:01' +1 +SELECT TIME(maketime(-1,0,1))=TIME('-01:00:01'); +TIME(maketime(-1,0,1))=TIME('-01:00:01') +1 +SELECT maketime(-1,0,1)=TIME('-01:00:01'); +maketime(-1,0,1)=TIME('-01:00:01') +1 +SELECT maketime(1,0,1)=TIME('01:00:01'); +maketime(1,0,1)=TIME('01:00:01') +1 +SELECT maketime(1,0,1)=TIME('01:00:02'); +maketime(1,0,1)=TIME('01:00:02') +0 diff --git a/mysql-test/t/func_sapdb.test b/mysql-test/t/func_sapdb.test index 1292c4757323515440c1236acae6a06a74ccc6ef..89eae5955aaf7374034a1ab6e8e10c9757b010e3 100644 --- a/mysql-test/t/func_sapdb.test +++ b/mysql-test/t/func_sapdb.test @@ -169,4 +169,26 @@ SELECT TIMEDIFF(TIME('17:00:00'),TIME('17:00:00'))=TIME('00:00:00') AS 1Eq, TIMEDIFF(TIME('17:59:00'),TIME('17:00:00')), TIMEDIFF(TIME('17:00:00'),TIME('17:59:00')); +# +# Bug#42661 - sec_to_time() and signedness +# + +SELECT sec_to_time(3020399)=TIME('838:59:59'); +SELECT sec_to_time(-3020399)=TIME('-838:59:59'); +SELECT sec_to_time(-3020399)='-838:59:59'; +SELECT time(sec_to_time(-3020399))=TIME('-838:59:59'); +SELECT time(sec_to_time(-3020399))=TIME('-838:59:58'); + +# +# Bug#42662 - maketime() and signedness +# + +# TIME(...) and CAST(... AS TIME) go through the same code-path here, +# but we'll explicitly show show that both work in case the ever changes. +SELECT maketime(-1,0,1)='-01:00:01'; +SELECT TIME(maketime(-1,0,1))=CAST('-01:00:01' AS TIME); +SELECT maketime(-1,0,1)=CAST('-01:00:01' AS TIME); +SELECT maketime(1,0,1)=CAST('01:00:01' AS TIME); +SELECT maketime(1,0,1)=CAST('01:00:02' AS TIME); + # End of 5.0 tests diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 22ca8a925db006ed83f1b9f5d5a3e60c8276ca5a..e8ead2aef7b79d8b29fbc4ee3ad6d10c4447ac7d 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1730,7 +1730,7 @@ longlong Item_func_sec_to_time::val_int() sec_to_time(arg_val, args[0]->unsigned_flag, <ime); return (ltime.neg ? -1 : 1) * - ((ltime.hour)*10000 + ltime.minute*100 + ltime.second); + (longlong) ((ltime.hour)*10000 + ltime.minute*100 + ltime.second); } @@ -2648,7 +2648,8 @@ longlong Item_time_typecast::val_int() null_value= 1; return 0; } - return ltime.hour * 10000L + ltime.minute * 100 + ltime.second; + return (ltime.neg ? -1 : 1) * + (longlong) ((ltime.hour)*10000 + ltime.minute*100 + ltime.second); } String *Item_time_typecast::val_str(String *str)