Changeset: b1d368bbd356 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b1d368bbd356 Modified Files: clients/Tests/exports.stable.out monetdb5/modules/atoms/mtime.c monetdb5/modules/atoms/mtime.mal Branch: default Log Message:
Added bulk implementations for mtime functions which may throw an exception diffs (298 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -1541,7 +1541,8 @@ str MTIMEdate_sub_msec_interval(date *re str MTIMEdate_sub_msec_interval_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEdate_submonths(date *ret, const date *v1, const int *v2); str MTIMEdate_submonths_bulk(bat *ret, const bat *bid1, const bat *bid2); -str MTIMEdate_to_str(str *ret, const date *d, const char *const *format); +str MTIMEdate_to_str(str *ret, const const date *v1, const const char *const *v2); +str MTIMEdate_to_str_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEdaytime_daytime(daytime *ret, const daytime *src); str MTIMEdaytime_daytime_bulk(bat *ret, const bat *bid); str MTIMEdaytime_diff_msec(lng *ret, const daytime *v1, const daytime *v2); @@ -1570,14 +1571,18 @@ str MTIMEsql_seconds(int *ret, const lng str MTIMEsql_seconds_bulk(bat *ret, const bat *bid); str MTIMEsql_year(int *ret, const int *src); str MTIMEsql_year_bulk(bat *ret, const bat *bid); -str MTIMEstr_to_date(date *ret, const char *const *s, const char *const *format); -str MTIMEstr_to_time(daytime *ret, const char *const *s, const char *const *format); -str MTIMEstr_to_timestamp(timestamp *ret, const char *const *s, const char *const *format); +str MTIMEstr_to_date(date *ret, const const char *const *v1, const const char *const *v2); +str MTIMEstr_to_date_bulk(bat *ret, const bat *bid1, const bat *bid2); +str MTIMEstr_to_time(daytime *ret, const const char *const *v1, const const char *const *v2); +str MTIMEstr_to_time_bulk(bat *ret, const bat *bid1, const bat *bid2); +str MTIMEstr_to_timestamp(timestamp *ret, const const char *const *v1, const const char *const *v2); +str MTIMEstr_to_timestamp_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEtime_add_msec_interval(daytime *ret, const daytime *v1, const lng *v2); str MTIMEtime_add_msec_interval_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEtime_sub_msec_interval(daytime *ret, const daytime *v1, const lng *v2); str MTIMEtime_sub_msec_interval_bulk(bat *ret, const bat *bid1, const bat *bid2); -str MTIMEtime_to_str(str *ret, const daytime *d, const char *const *format); +str MTIMEtime_to_str(str *ret, const const daytime *v1, const const char *const *v2); +str MTIMEtime_to_str_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEtimestamp_add_month_interval(timestamp *ret, const timestamp *v1, const int *v2); str MTIMEtimestamp_add_month_interval_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEtimestamp_add_msec_interval(timestamp *ret, const timestamp *v1, const lng *v2); @@ -1617,7 +1622,8 @@ str MTIMEtimestamp_sub_msec_interval(tim str MTIMEtimestamp_sub_msec_interval_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEtimestamp_timestamp(timestamp *ret, const timestamp *src); str MTIMEtimestamp_timestamp_bulk(bat *ret, const bat *bid); -str MTIMEtimestamp_to_str(str *ret, const timestamp *d, const char *const *format); +str MTIMEtimestamp_to_str(str *ret, const const timestamp *v1, const const char *const *v2); +str MTIMEtimestamp_to_str_bulk(bat *ret, const bat *bid1, const bat *bid2); str MTIMEtimestamp_year(int *ret, const timestamp *src); str MTIMEtimestamp_year_bulk(bat *ret, const bat *bid); str OIDXcreate(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c --- a/monetdb5/modules/atoms/mtime.c +++ b/monetdb5/modules/atoms/mtime.c @@ -49,12 +49,6 @@ mal_export str MTIMEdaytime_fromstr(dayt mal_export str MTIMEdaytime_fromseconds(daytime *ret, const lng *secs); mal_export str MTIMEdaytime_fromseconds_bulk(bat *ret, bat *bid); mal_export str MTIMElocal_timezone_msec(lng *ret); -mal_export str MTIMEstr_to_date(date *ret, const char *const *s, const char *const *format); -mal_export str MTIMEdate_to_str(str *ret, const date *d, const char *const *format); -mal_export str MTIMEstr_to_time(daytime *ret, const char *const *s, const char *const *format); -mal_export str MTIMEtime_to_str(str *ret, const daytime *d, const char *const *format); -mal_export str MTIMEstr_to_timestamp(timestamp *ret, const char *const *s, const char *const *format); -mal_export str MTIMEtimestamp_to_str(str *ret, const timestamp *d, const char *const *format); str MTIMEcurrent_date(date *ret) @@ -119,14 +113,17 @@ NAMEBULK(bat *ret, const bat *bid) return MAL_SUCCEED; \ } -#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC) \ +#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC, FUNC_CALL) \ mal_export str NAME(OUTTYPE *ret, const INTYPE1 *v1, const INTYPE2 *v2); \ mal_export str NAMEBULK(bat *ret, const bat *bid1, const bat *bid2); \ str \ NAME(OUTTYPE *ret, const INTYPE1 *v1, const INTYPE2 *v2) \ { \ - *ret = FUNC(*v1, *v2); \ - return MAL_SUCCEED; \ + str msg = MAL_SUCCEED; \ + do { \ + FUNC_CALL(FUNC, (*ret), *v1, *v2); \ + } while (0); \ + return msg; \ } \ str \ NAMEBULK(bat *ret, const bat *bid1, const bat *bid2) \ @@ -136,6 +133,7 @@ NAMEBULK(bat *ret, const bat *bid1, cons const INTYPE1 *src1; \ const INTYPE2 *src2; \ OUTTYPE *dst; \ + str msg = MAL_SUCCEED; \ \ b1 = BATdescriptor(*bid1); \ b2 = BATdescriptor(*bid2); \ @@ -144,25 +142,30 @@ NAMEBULK(bat *ret, const bat *bid1, cons BBPunfix(b1->batCacheid); \ if (b2) \ BBPunfix(b2->batCacheid); \ - throw(MAL, "batmtime." MALFUNC, \ + msg = createException(MAL, "batmtime." MALFUNC, \ SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); \ + goto bailout; \ } \ n = BATcount(b1); \ if (n != BATcount(b2)) { \ BBPunfix(b1->batCacheid); \ BBPunfix(b2->batCacheid); \ - throw(MAL, "batmtime." MALFUNC, "inputs not the same size"); \ + msg = createException(MAL, "batmtime." MALFUNC, \ + "inputs not the same size"); \ + goto bailout; \ } \ if ((bn = COLnew(b1->hseqbase, TYPE_##OUTTYPE, n, TRANSIENT)) == NULL) { \ BBPunfix(b1->batCacheid); \ BBPunfix(b2->batCacheid); \ - throw(MAL, "batmtime." MALFUNC, SQLSTATE(HY013) MAL_MALLOC_FAIL); \ + msg = createException(MAL, "batmtime." MALFUNC, \ + SQLSTATE(HY013) MAL_MALLOC_FAIL); \ + goto bailout; \ } \ src1 = Tloc(b1, 0); \ src2 = Tloc(b2, 0); \ dst = Tloc(bn, 0); \ for (BUN i = 0; i < n; i++) { \ - dst[i] = FUNC(src1[i], src2[i]); \ + FUNC_CALL(FUNC, (dst[i]), src1[i], src2[i]); \ } \ bn->tnonil = b1->tnonil & b2->tnonil; \ bn->tnil = b1->tnil | b2->tnil; \ @@ -170,14 +173,23 @@ NAMEBULK(bat *ret, const bat *bid1, cons bn->tsorted = n < 2; \ bn->trevsorted = n < 2; \ bn->tkey = false; \ - BBPunfix(b1->batCacheid); \ - BBPunfix(b2->batCacheid); \ - BBPkeepref(*ret = bn->batCacheid); \ - return MAL_SUCCEED; \ +bailout: \ + if (b1) \ + BBPunfix(b1->batCacheid); \ + if (b2) \ + BBPunfix(b2->batCacheid); \ + if (msg && bn) \ + BBPreclaim(bn); \ + else if (bn) \ + BBPkeepref(*ret = bn->batCacheid); \ + return msg; \ } -func2(MTIMEdate_diff, MTIMEdate_diff_bulk, "diff", date, date, int, date_diff) -func2(MTIMEdaytime_diff_msec, MTIMEdaytime_diff_msec_bulk, "diff", daytime, daytime, lng, daytime_diff) +#define func2_noexcept(FUNC, RET, PARAM1, PARAM2) RET = FUNC(PARAM1, PARAM2) +#define func2_except(FUNC, RET, PARAM1, PARAM2) msg = FUNC(&RET, PARAM1, PARAM2); if (msg) break; + +func2(MTIMEdate_diff, MTIMEdate_diff_bulk, "diff", date, date, int, date_diff, func2_noexcept) +func2(MTIMEdaytime_diff_msec, MTIMEdaytime_diff_msec_bulk, "diff", daytime, daytime, lng, daytime_diff, func2_noexcept) #define func2chk(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC) \ mal_export str NAME(OUTTYPE *ret, const INTYPE1 *v1, const INTYPE2 *v2); \ @@ -284,8 +296,8 @@ time_add_msec_interval(const daytime t, return daytime_nil; return daytime_add_usec_modulo(t, ms * 1000); } -func2(MTIMEtime_sub_msec_interval, MTIMEtime_sub_msec_interval_bulk, "time_sub_msec_interval", daytime, lng, daytime, time_sub_msec_interval) -func2(MTIMEtime_add_msec_interval, MTIMEtime_add_msec_interval_bulk, "time_add_msec_interval", daytime, lng, daytime, time_add_msec_interval) +func2(MTIMEtime_sub_msec_interval, MTIMEtime_sub_msec_interval_bulk, "time_sub_msec_interval", daytime, lng, daytime, time_sub_msec_interval, func2_noexcept) +func2(MTIMEtime_add_msec_interval, MTIMEtime_add_msec_interval_bulk, "time_add_msec_interval", daytime, lng, daytime, time_add_msec_interval, func2_noexcept) #define date_submonths(d, m) date_add_month(d, -m) #define date_addmonths(d, m) date_add_month(d, m) @@ -321,7 +333,7 @@ TSDIFF(timestamp t1, timestamp t2) } return diff; } -func2(MTIMEtimestamp_diff_msec, MTIMEtimestamp_diff_msec_bulk, "diff", timestamp, timestamp, lng, TSDIFF) +func2(MTIMEtimestamp_diff_msec, MTIMEtimestamp_diff_msec_bulk, "diff", timestamp, timestamp, lng, TSDIFF, func2_noexcept) static inline int timestamp_century(const timestamp t) @@ -629,51 +641,56 @@ str_to_timestamp(timestamp *ret, const c return MAL_SUCCEED; } -str -MTIMEstr_to_date(date *ret, const char *const *s, const char *const *format) +static inline str +str_to_date(date *ret, const char *const s, const char *const format) { + str msg = MAL_SUCCEED; timestamp ts; - str msg = str_to_timestamp(&ts, s, format, "date", "mtime.str_to_date"); - if (msg != MAL_SUCCEED) + if ((msg = str_to_timestamp(&ts, &s, &format, "date", "mtime.str_to_date")) != MAL_SUCCEED) return msg; *ret = timestamp_date(ts); return MAL_SUCCEED; } +func2(MTIMEstr_to_date, MTIMEstr_to_date_bulk, "str_to_date", const char *const, const char *const, date, str_to_date, func2_except) -str -MTIMEdate_to_str(str *ret, const date *d, const char *const *format) +static inline str +date_to_str(str *ret, const date d, const char *const format) { - timestamp ts = timestamp_create(*d, timestamp_daytime(timestamp_current())); - return timestamp_to_str(ret, &ts, format, "date", "mtime.date_to_str"); + timestamp ts = timestamp_create(d, timestamp_daytime(timestamp_current())); + return timestamp_to_str(ret, &ts, &format, "date", "mtime.date_to_str"); } +func2(MTIMEdate_to_str, MTIMEdate_to_str_bulk, "date_to_str", const date, const char *const, str, date_to_str, func2_except) -str -MTIMEstr_to_time(daytime *ret, const char *const *s, const char *const *format) +static inline str +str_to_time(daytime *ret, const char *const s, const char *const format) { + str msg = MAL_SUCCEED; timestamp ts; - str msg = str_to_timestamp(&ts, s, format, "time", "mtime.str_to_time"); - if (msg != MAL_SUCCEED) + if ((msg = str_to_timestamp(&ts, &s, &format, "time", "mtime.str_to_time")) != MAL_SUCCEED) return msg; *ret = timestamp_daytime(ts); return MAL_SUCCEED; } +func2(MTIMEstr_to_time, MTIMEstr_to_time_bulk, "str_to_time", const char *const, const char *const, daytime, str_to_time, func2_except) -str -MTIMEtime_to_str(str *ret, const daytime *d, const char *const *format) +static inline str +time_to_str(str *ret, const daytime d, const char *const format) { - timestamp ts = timestamp_create(timestamp_date(timestamp_current()), *d); - return timestamp_to_str(ret, &ts, format, "time", "mtime.time_to_str"); + timestamp ts = timestamp_create(timestamp_date(timestamp_current()), d); + return timestamp_to_str(ret, &ts, &format, "time", "mtime.time_to_str"); } +func2(MTIMEtime_to_str, MTIMEtime_to_str_bulk, "time_to_str", const daytime, const char *const, str, time_to_str, func2_except) -str -MTIMEstr_to_timestamp(timestamp *ret, const char *const *s, const char *const *format) +static inline str +str_to_timestamp_func(timestamp *ret, const char *const s, const char *const format) { - return str_to_timestamp(ret, s, format, "timestamp", "mtime.str_to_timestamp"); + return str_to_timestamp(ret, &s, &format, "timestamp", "mtime.str_to_timestamp"); } +func2(MTIMEstr_to_timestamp, MTIMEstr_to_timestamp_bulk, "str_to_timestamp", const char *const, const char *const, timestamp, str_to_timestamp_func, func2_except) -str -MTIMEtimestamp_to_str(str *ret, const timestamp *d, const char *const *format) +static inline str +timestamp_to_str_func(str *ret, const timestamp d, const char *const format) { - return timestamp_to_str(ret, d, format, - "timestamp", "mtime.timestamp_to_str"); + return timestamp_to_str(ret, &d, &format, "timestamp", "mtime.timestamp_to_str"); } +func2(MTIMEtimestamp_to_str, MTIMEtimestamp_to_str_bulk, "timestamp_to_str", const timestamp, const char *const, str, timestamp_to_str_func, func2_except) diff --git a/monetdb5/modules/atoms/mtime.mal b/monetdb5/modules/atoms/mtime.mal --- a/monetdb5/modules/atoms/mtime.mal +++ b/monetdb5/modules/atoms/mtime.mal @@ -466,26 +466,38 @@ comment "returns the number of milliseco command str_to_date(s:str, format:str) :date address MTIMEstr_to_date comment "create a date from the string, using the specified format (see man strptime)"; +command batmtime.str_to_date(s:bat[:str], format:bat[:str]) :bat[:date] +address MTIMEstr_to_date_bulk; command date_to_str(d:date, format:str) :str address MTIMEdate_to_str comment "create a string from the date, using the specified format (see man strftime)"; +command batmtime.date_to_str(d:bat[:str], format:bat[:str]) :bat[:str] +address MTIMEdate_to_str_bulk; command str_to_time(s:str, format:str) :daytime address MTIMEstr_to_time comment "create a time from the string, using the specified format (see man strptime)"; +command batmtime.str_to_time(s:bat[:str], format:bat[:str]) :bat[:daytime] +address MTIMEstr_to_time_bulk; command time_to_str(d:daytime, format:str) :str address MTIMEtime_to_str comment "create a string from the time, using the specified format (see man strftime)"; +command batmtime.time_to_str(d:bat[:daytime], format:bat[:str]) :bat[:str] +address MTIMEtime_to_str_bulk; command str_to_timestamp(s:str, format:str) :timestamp address MTIMEstr_to_timestamp comment "create a timestamp from the string, using the specified format (see man strptime)"; +command batmtime.str_to_timestamp(d:bat[:str], format:bat[:str]) :bat[:timestamp] +address MTIMEstr_to_timestamp_bulk; command timestamp_to_str(d:timestamp, format:str) :str address MTIMEtimestamp_to_str comment "create a string from the time, using the specified format (see man strftime)"; +command batmtime.timestamp_to_str(d:bat[:timestamp], format:bat[:str]) :bat[:str] +address MTIMEtimestamp_to_str_bulk; # @+ Utilities # The Monet V4 procs are converted into functions. _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list