Changeset: e635311223ff for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e635311223ff Modified Files: clients/mapiclient/dump.c gdk/gdk_analytic_bounds.c gdk/gdk_calc.c gdk/gdk_value.c monetdb5/modules/atoms/mtime_analytic.c sql/ChangeLog.Apr2019 sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_rank.c sql/server/rel_exp.c sql/server/rel_propagate.c sql/server/rel_select.c sql/server/sql_atom.c sql/server/sql_atom.h sql/server/sql_partition.c sql/storage/bat/bat_storage.c sql/storage/store.c sql/test/BugTracker-2014/Tests/acidity-fail.Bug-3635.py sql/test/analytics/Tests/analytics03.stable.err sql/test/analytics/Tests/analytics03.stable.out sql/test/merge-partitions/Tests/mergepart05.sql sql/test/merge-partitions/Tests/mergepart05.stable.err sql/test/merge-partitions/Tests/mergepart05.stable.out sql/test/merge-partitions/Tests/mergepart07.stable.err sql/test/testdb-reload/Tests/reload.stable.out sql/test/testdb/Tests/dump.stable.out sql/test/testdb/Tests/load.sql Branch: default Log Message:
Merge with Apr2019 branch. diffs (truncated from 1581 to 300 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -2702,14 +2702,20 @@ dump_database(Mapi mid, stream *toConsol maxv = mapi_fetch_field(shdl, 1); wnulls = mapi_fetch_field(shdl, 2); } - if (minv && maxv) { + if (minv || maxv) { mnstr_printf(toConsole, " FROM "); - squoted_print(toConsole, minv, '\''); + if (minv) + squoted_print(toConsole, minv, '\''); + else + mnstr_printf(toConsole, "RANGE MINVALUE"); mnstr_printf(toConsole, " TO "); - squoted_print(toConsole, maxv, '\''); + if (maxv) + squoted_print(toConsole, maxv, '\''); + else + mnstr_printf(toConsole, "RANGE MAXVALUE"); } if (strcmp(wnulls, "true") == 0) { - mnstr_printf(toConsole, " %s NULL VALUES", (minv && maxv) ? "WITH" : "FOR"); + mnstr_printf(toConsole, " %s NULL VALUES", (minv || maxv) ? "WITH" : "FOR"); } mapi_close_handle(shdl); } diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c --- a/gdk/gdk_analytic_bounds.c +++ b/gdk/gdk_analytic_bounds.c @@ -529,13 +529,13 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B lng limit; switch (tp2) { case TYPE_bte: - limit = (lng) (*(bte *) bound); + limit = is_bte_nil(*(bte *) bound) ? lng_nil : (lng) *(bte *) bound; break; case TYPE_sht: - limit = (lng) (*(sht *) bound); + limit = is_sht_nil(*(sht *) bound) ? lng_nil : (lng) *(sht *) bound; break; case TYPE_int: - limit = (lng) (*(int *) bound); + limit = is_int_nil(*(int *) bound) ? lng_nil : (lng) *(int *) bound; break; case TYPE_lng: limit = (lng) (*(lng *) bound); @@ -543,7 +543,7 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B default: goto bound_not_supported; } - if (limit == GDK_lng_max) { + if (is_lng_nil(limit)) { return GDKanalyticalallbounds(r, b, p, preceding); } else if (preceding) { ANALYTICAL_WINDOW_BOUNDS_BRANCHES_ROWS(_PRECEDING, limit); @@ -655,7 +655,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, switch (tp2) { case TYPE_bte:{ bte ll = (*(bte *) bound); - if (ll == GDK_bte_max) /* UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING cases, avoid overflow */ + if (is_bte_nil(ll)) /* UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING cases, avoid overflow */ return GDKanalyticalallbounds(r, b, p, preceding); else limit = (lng) ll; @@ -663,7 +663,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, } case TYPE_sht:{ sht ll = (*(sht *) bound); - if (ll == GDK_sht_max) + if (is_sht_nil(ll)) return GDKanalyticalallbounds(r, b, p, preceding); else limit = (lng) ll; @@ -671,7 +671,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, } case TYPE_int:{ int ll = (*(int *) bound); - if (ll == GDK_int_max) + if (is_int_nil(ll)) return GDKanalyticalallbounds(r, b, p, preceding); else limit = (lng) ll; @@ -679,7 +679,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, } case TYPE_lng:{ lng ll = (*(lng *) bound); - if (ll == GDK_lng_max) + if (is_lng_nil(ll)) return GDKanalyticalallbounds(r, b, p, preceding); else limit = (lng) ll; @@ -697,7 +697,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, } case TYPE_flt:{ flt limit = (*(flt *) bound); - if (limit == GDK_flt_max) { + if (is_flt_nil(limit)) { return GDKanalyticalallbounds(r, b, p, preceding); } else if (preceding) { ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_FLT(_PRECEDING, limit); @@ -708,7 +708,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, } case TYPE_dbl:{ dbl limit = (*(dbl *) bound); - if (limit == GDK_dbl_max) { + if (is_dbl_nil(limit)) { return GDKanalyticalallbounds(r, b, p, preceding); } else if (preceding) { ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_DBL(_PRECEDING, limit); @@ -720,7 +720,7 @@ GDKanalyticalrangebounds(BAT *r, BAT *b, #ifdef HAVE_HGE case TYPE_hge:{ hge limit = (*(hge *) bound); - if (limit == GDK_hge_max) { + if (is_hge_nil(limit)) { return GDKanalyticalallbounds(r, b, p, preceding); } else if (preceding) { ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(_PRECEDING, limit); @@ -804,13 +804,13 @@ GDKanalyticalgroupsbounds(BAT *r, BAT *b lng limit; switch (tp2) { case TYPE_bte: - limit = (lng) (*(bte *) bound); + limit = is_bte_nil(*(bte *) bound) ? lng_nil : (lng) *(bte *) bound; break; case TYPE_sht: - limit = (lng) (*(sht *) bound); + limit = is_sht_nil(*(sht *) bound) ? lng_nil : (lng) *(sht *) bound; break; case TYPE_int: - limit = (lng) (*(int *) bound); + limit = is_int_nil(*(int *) bound) ? lng_nil : (lng) *(int *) bound; break; case TYPE_lng: limit = (lng) (*(lng *) bound); @@ -818,7 +818,7 @@ GDKanalyticalgroupsbounds(BAT *r, BAT *b default: goto bound_not_supported; } - if (limit == GDK_lng_max) { + if (is_lng_nil(limit)) { return GDKanalyticalallbounds(r, b, p, preceding); } else if (preceding) { ANALYTICAL_WINDOW_BOUNDS_BRANCHES_GROUPS(_PRECEDING, limit); diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -14617,5 +14617,6 @@ VARconvert(ValPtr ret, const ValRecord * ATOMname(v->vtype), ATOMname(ret->vtype)); return GDK_FAIL; } + ret->len = ATOMlen(ret->vtype, VALptr(ret)); return nils == BUN_NONE ? GDK_FAIL : GDK_SUCCEED; } diff --git a/gdk/gdk_value.c b/gdk/gdk_value.c --- a/gdk/gdk_value.c +++ b/gdk/gdk_value.c @@ -74,17 +74,15 @@ VALset(ValPtr v, int t, ptr p) #endif case TYPE_str: v->val.sval = (str) p; - v->len = strLen((str) p); break; case TYPE_ptr: v->val.pval = *(ptr *) p; - v->len = ATOMlen(t, *(ptr *) p); break; default: v->val.pval = p; - v->len = ATOMlen(t, p); break; } + v->len = ATOMlen(v->vtype, VALptr(v)); return v; } @@ -163,6 +161,7 @@ VALcopy(ValPtr d, const ValRecord *s) return NULL; memcpy(d->val.pval, p, d->len); } + d->len = ATOMlen(d->vtype, VALptr(d)); return d; } @@ -219,8 +218,9 @@ VALinit(ValPtr d, int tpe, const void *s if (d->val.pval == NULL) return NULL; memcpy(d->val.pval, s, d->len); - break; + return d; } + d->len = ATOMlen(d->vtype, VALptr(d)); return d; } diff --git a/monetdb5/modules/atoms/mtime_analytic.c b/monetdb5/modules/atoms/mtime_analytic.c --- a/monetdb5/modules/atoms/mtime_analytic.c +++ b/monetdb5/modules/atoms/mtime_analytic.c @@ -15,67 +15,60 @@ */ #include "monetdb_config.h" +#include "mal_exception.h" #include "mtime.h" #include "mtime_private.h" -#define MTIME_SUB_WITH_CHECK(lft, rgt, TYPE, dst, min, max, on_overflow) \ - do { \ - if ((rgt) < 1) { \ - if ((max) + (rgt) < (lft)) \ - on_overflow; \ - else \ - (dst) = (TYPE) (lft) - (rgt); \ - } else { \ - if ((min) + (rgt) > (lft)) \ - on_overflow; \ - else \ - (dst) = (TYPE) (lft) - (rgt); \ - } \ - } while (0) - -#define MABSOLUTE(X) ((X) < 0 ? -(X) : (X)) - -#define DATE_RANGE_MONTH_DIFF(X,Y,R) \ - do { \ - MTIME_SUB_WITH_CHECK(X, Y, date, R, DATE_MIN, DATE_MAX, goto calc_overflow); \ - R = MABSOLUTE(R); \ - R /= 30; /* days in a month */ \ - R += (X != Y); /* in a '0' month interval, the rows don't belong to the same frame if the difference is less than one month */ \ - } while (0) +static inline date +date_add_month(date D, int M) +{ + date ret; + MTIMEdate_addmonths(&ret, &D, &M); + return ret; +} +static inline date +date_add_day(date D, int M) +{ + date ret; + MTIMEdate_adddays(&ret, &D, &M); + return ret; +} +static inline lng +timestamp_add_month(lng T, int M) +{ + timestamp ret, v; + v.alignment = T; + MTIMEtimestamp_add_month_interval_wrap(&ret, &v, &M); + return ret.alignment; +} +static inline lng +timestamp_add_msec(lng T, lng M) +{ + timestamp ret, v; + v.alignment = T; + MTIMEtimestamp_add(&ret, &v, &M); + return ret.alignment; +} +static inline daytime +daytime_add_msec(daytime D, lng M) +{ + daytime ret; + MTIMEtime_add_msec_interval_wrap(&ret, &D, &M); + return ret; +} -#define TIMESTAMP_RANGE_MONTH_DIFF(X,Y,R) \ - do { \ - MTIME_SUB_WITH_CHECK(X.days, Y.days, date, R, DATE_MIN, DATE_MAX, goto calc_overflow); \ - R = MABSOLUTE(R); \ - R /= 30; /* days in a month */ \ - R += (X.days != Y.days); /* same reason as above */ \ - } while (0) - -#define DAYTIME_RANGE_SEC_DIFF(X,Y,R) \ - do { \ - R = MABSOLUTE(X - Y); /* never overflows */ \ - } while (0) +#define date_sub_month(D,M) date_add_month(D,-(M)) +#define timestamp_sub_month(T,M) timestamp_add_month(T,-(M)) +#define daytime_sub_msec(D,M) daytime_add_msec(D, -(M)) +#define date_add_msec(D,M) date_add_day(D,(int) ((M)/(24*60*60*1000))) +#define date_sub_msec(D,M) date_add_day(D,(int) (-(M)/(24*60*60*1000))) +#define timestamp_sub_msec(T,M) timestamp_add_msec(T, -(M)) -#define DATE_RANGE_SEC_DIFF(X,Y,R) \ - do { \ - MTIME_SUB_WITH_CHECK(X, Y, date, R, DATE_MIN, DATE_MAX, goto calc_overflow); \ - R = MABSOLUTE(R); \ - R *= 86400000; /* days in milliseconds */ \ - } while (0) - -#define TIMESTAMP_RANGE_SEC_DIFF(X,Y,R) \ - do { \ - MTIME_SUB_WITH_CHECK(X.days, Y.days, date, R, DATE_MIN, DATE_MAX, goto calc_overflow); \ - R = MABSOLUTE(R); \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list