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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list