Changeset: 6c28ba904b00 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6c28ba904b00 Modified Files: sql/backends/monet5/sql_time.c sql/test/SQLancer/Tests/sqlancer04.sql sql/test/SQLancer/Tests/sqlancer04.stable.err sql/test/SQLancer/Tests/sqlancer04.stable.out Branch: Oct2020 Log Message:
My earlier fix was not correct. Converting an second interval into time never overflows, just rolls over, such as the addition operation on these types diffs (112 lines): diff --git a/sql/backends/monet5/sql_time.c b/sql/backends/monet5/sql_time.c --- a/sql/backends/monet5/sql_time.c +++ b/sql/backends/monet5/sql_time.c @@ -109,27 +109,17 @@ bailout: return msg; } -static inline str -second_interval_2_daytime_imp(daytime *res, lng next, +static inline daytime +second_interval_2_daytime_imp(lng next, #ifdef HAVE_HGE hge shift, hge divider, hge multiplier #else lng shift, lng divider, lng multiplier #endif ) { - daytime d = daytime_add_usec(daytime_create(0, 0, 0, 0), next * 1000); - if (is_daytime_nil(d)) { - str msg; - size_t len = 0; - char *str_val = NULL; - if (BATatoms[TYPE_lng].atomToStr(&str_val, &len, &next, false) < 0) - return createException(SQL, "batcalc.second_interval_2_daytime", SQLSTATE(HY013) MAL_MALLOC_FAIL); - msg = createException(SQL, "batcalc.second_interval_2_daytime", SQLSTATE(22003) "Overflow in conversion of second interval '%s' to time", str_val); - GDKfree(str_val); - return msg; - } - *res = daytime_2time_daytime_imp(d, shift, divider, multiplier); - return MAL_SUCCEED; + daytime d = daytime_add_usec(daytime_create(0, 0, 0, 0), (next % (24*60*60*1000)) * 1000); + assert(!is_daytime_nil(d)); + return daytime_2time_daytime_imp(d, shift, divider, multiplier); } str @@ -183,7 +173,7 @@ second_interval_2_daytime(Client cntxt, if (is_a_bat) { oid off = b->hseqbase; lng *restrict vals = (lng*) Tloc(b, 0); - for (BUN i = 0 ; i < q && !msg; i++) { + for (BUN i = 0 ; i < q ; i++) { BUN p = (BUN) (canditer_next(&ci) - off); lng next = vals[p]; @@ -191,15 +181,12 @@ second_interval_2_daytime(Client cntxt, ret[i] = daytime_nil; nils = true; } else { - msg = second_interval_2_daytime_imp(&(ret[i]), next, shift, divider, multiplier); + ret[i] = second_interval_2_daytime_imp(next, shift, divider, multiplier); } } } else { lng next = *(lng*)getArgReference(stk, pci, 1); - if (is_lng_nil(next)) - *ret = daytime_nil; - else - msg = second_interval_2_daytime_imp(ret, next, shift, divider, multiplier); + *ret = is_lng_nil(next) ? daytime_nil : second_interval_2_daytime_imp(next, shift, divider, multiplier); } bailout: diff --git a/sql/test/SQLancer/Tests/sqlancer04.sql b/sql/test/SQLancer/Tests/sqlancer04.sql --- a/sql/test/SQLancer/Tests/sqlancer04.sql +++ b/sql/test/SQLancer/Tests/sqlancer04.sql @@ -325,5 +325,8 @@ 2030212684.000 1699639666.000 select interval '-1680612084' second from t3 natural join (select t4.c0, (cast(r'*' as boolean)) = false from t2, t0, t4) as sub0 group by t3.c0; - --error, overflow in conversion to time + --empty ROLLBACK; + +select cast(interval '29578044' second as time); + -- 08:07:24 diff --git a/sql/test/SQLancer/Tests/sqlancer04.stable.err b/sql/test/SQLancer/Tests/sqlancer04.stable.err --- a/sql/test/SQLancer/Tests/sqlancer04.stable.err +++ b/sql/test/SQLancer/Tests/sqlancer04.stable.err @@ -59,10 +59,6 @@ MAPI = (monetdb) /var/tmp/mtest-316864/ QUERY = select coalesce(-1129107763, '1415606329') from (values(1),(2)) as t0(c0); ERROR = !value too long for type (var)char(10) CODE = 22001 -MAPI = (monetdb) /var/tmp/mtest-878466/.s.monetdb.33759 -QUERY = select interval '-1680612084' second from t3 natural join (select t4.c0, (cast(r'*' as boolean)) = false from t2, t0, t4) as sub0 group by t3.c0; -ERROR = !Overflow in conversion of second interval '29578044000' to time -CODE = 22003 # 09:44:50 > # 09:44:50 > "Done." diff --git a/sql/test/SQLancer/Tests/sqlancer04.stable.out b/sql/test/SQLancer/Tests/sqlancer04.stable.out --- a/sql/test/SQLancer/Tests/sqlancer04.stable.out +++ b/sql/test/SQLancer/Tests/sqlancer04.stable.out @@ -417,7 +417,18 @@ stdout of test 'sqlancer04` in directory #2030212684.000 #1699639666.000 [ 5 ] +#select interval '-1680612084' second from t3 natural join (select t4.c0, (cast(r'*' as boolean)) = false from t2, t0, t4) as sub0 group by t3.c0; +% .%13 # table_name +% %13 # name +% sec_interval # type +% 5 # length #ROLLBACK; +#select cast(interval '29578044' second as time); +% .%1 # table_name +% %1 # name +% time # type +% 8 # length +[ 08:07:24 ] # 09:44:50 > # 09:44:50 > "Done." _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list