Changeset: e581dd6398ed for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e581dd6398ed Added Files: sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.sql sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-not-null-not-in.Bug-6562.sql Modified Files: gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_join.c sql/backends/monet5/UDF/capi/capi.c sql/backends/monet5/sql_statistics.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_privileges.c sql/test/BugTracker-2017/Tests/statistics_nils_not_eq_zero.Bug-6331.stable.err sql/test/BugTracker-2018/Tests/All sql/test/BugTracker-2018/Tests/truncate_tmp_tables.Bug-6543.stable.err testing/Mtest.py.in tools/merovingian/daemon/forkmserver.c tools/merovingian/daemon/merovingian.c tools/merovingian/utils/properties.c Branch: default Log Message:
Merge with Mar2018 branch. diffs (truncated from 752 to 300 lines): diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -2048,6 +2048,7 @@ BATassertProps(BAT *b) /* tseqbase must correspond to actual value */ assert(* (oid *) BUNtail(bi, 0) == b->tseqbase); } + assert(b->tseqbase + b->batCount <= GDK_oid_max); } /* a column cannot both have and not have NILs */ assert(!b->tnil || !b->tnonil); diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -877,10 +877,8 @@ headheapinit(oid *hseq, const char *buf, if (strcmp(type, "void") != 0) GDKfatal("BBPinit: head column must be VOID (ID = %d).", (int) bid); -#if SIZEOF_OID < SIZEOF_LNG if (base > (uint64_t) GDK_oid_max) GDKfatal("BBPinit: head seqbase out of range (ID = %d, seq = %" PRIu64 ").", (int) bid, base); -#endif *hseq = (oid) base; return n; } @@ -1088,7 +1086,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver #endif if (first != 0) - GDKfatal("BBPinit: first != 0 (ID = %" PRIu64 ").", batid); + GDKfatal("BBPinit: first != 0 (ID = %" PRIu64 ").", + batid); bid = (bat) batid; if (batid >= (uint64_t) ATOMIC_GET(BBPsize, BBPsizeLock)) { @@ -1097,7 +1096,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver BBPextend(0, false); } if (BBP_desc(bid) != NULL) - GDKfatal("BBPinit: duplicate entry in BBP.dir (ID = %" PRIu64 ").", batid); + GDKfatal("BBPinit: duplicate entry in BBP.dir (ID = " + "%" PRIu64 ").", batid); bn = GDKzalloc(sizeof(BAT)); if (bn == NULL) GDKfatal("BBPinit: cannot allocate memory for BAT."); @@ -1114,10 +1114,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver if (bbpversion <= GDKLIBRARY_HEADED) { nread += headheapinit(&bn->hseqbase, buf + nread, bid); } else { -#if SIZEOF_OID < SIZEOF_LNG if (base > (uint64_t) GDK_oid_max) GDKfatal("BBPinit: head seqbase out of range (ID = %" PRIu64 ", seq = %" PRIu64 ").", batid, base); -#endif bn->hseqbase = (oid) base; } nread += heapinit(bn, buf + nread, &Thashash, "T", bbpversion, bid, filename); diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -461,13 +461,36 @@ selectjoin(BAT *r1, BAT *r2, BAT *l, BAT static gdk_return mergejoin_void(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr, - bool nil_on_miss, bool only_misses, lng t0) + bool nil_on_miss, bool only_misses, lng t0, bool swapped) { oid lo, hi; BUN cnt, i; const oid *lvals; oid o, seq; + ALGODEBUG fprintf(stderr, "#mergejoin_void(l=%s#" BUNFMT "[%s]%s%s%s," + "r=%s#" BUNFMT "[%s]%s%s%s,sl=%s#" BUNFMT "%s%s%s," + "sr=%s#" BUNFMT "%s%s%s," + "nil_on_miss=%d,only_misses=%d)%s\n", + BATgetId(l), BATcount(l), ATOMname(l->ttype), + l->tsorted ? "-sorted" : "", + l->trevsorted ? "-revsorted" : "", + l->tkey ? "-key" : "", + BATgetId(r), BATcount(r), ATOMname(r->ttype), + r->tsorted ? "-sorted" : "", + r->trevsorted ? "-revsorted" : "", + r->tkey ? "-key" : "", + sl ? BATgetId(sl) : "NULL", sl ? BATcount(sl) : 0, + sl && sl->tsorted ? "-sorted" : "", + sl && sl->trevsorted ? "-revsorted" : "", + sl && sl->tkey ? "-key" : "", + sr ? BATgetId(sr) : "NULL", sr ? BATcount(sr) : 0, + sr && sr->tsorted ? "-sorted" : "", + sr && sr->trevsorted ? "-revsorted" : "", + sr && sr->tkey ? "-key" : "", + nil_on_miss, only_misses, + swapped ? " swapped" : ""); + /* r is dense, and if there is a candidate list, it too is * dense. This means we don't have to do any searches, we * only need to compare ranges to know whether a value from l @@ -2281,13 +2304,13 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT * value */ nr = 1; } - if (lcand && - nl > 1 && - lcand[-1] != lcand[-1 - (ssize_t) nl] + nl) { - /* not all values in the range are - * candidates */ - lskipped = true; - } + } + if (lcand && + nl > 1 && + lcand[-1] != lcand[-1 - (ssize_t) nl] + nl) { + /* not all values in the range are + * candidates */ + lskipped = true; } /* make space: nl values in l match nr values in r, so * we need to add nl * nr values in the results */ @@ -2401,7 +2424,11 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT r2->tseqbase = oid_nil; } } - if (lskipped) + /* if there is a left candidate list, it may + * be that the next value added isn't + * consecutive with the last one */ + if (lskipped || + (lcand && ((oid *) r1->T.heap.base)[r1->batCount - 1] + 1 != lcand[-(ssize_t)nl])) r1->tseqbase = oid_nil; } @@ -3799,7 +3826,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT *l, B lcount > 0 && rcount > 0) { /* use special implementation for dense right-hand side */ return mergejoin_void(r1, r2, l, r, sl, sr, - nil_on_miss, only_misses, t0); + nil_on_miss, only_misses, t0, false); } else if ((BATordered(r) || BATordered_rev(r)) && (BATtdense(r) || lcount < 1024 || @@ -3994,10 +4021,10 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA return selectjoin(r2, r1, r, l, sr, sl, nil_matches, t0, true); } else if (BATtdense(r) && (sr == NULL || BATtdense(sr))) { /* use special implementation for dense right-hand side */ - return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0); + return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0, false); } else if (BATtdense(l) && (sl == NULL || BATtdense(sl))) { /* use special implementation for dense right-hand side */ - return mergejoin_void(r2, r1, r, l, sr, sl, false, false, t0); + return mergejoin_void(r2, r1, r, l, sr, sl, false, false, t0, true); } else if ((BATordered(l) || BATordered_rev(l)) && (BATordered(r) || BATordered_rev(r))) { /* both sorted */ diff --git a/sql/backends/monet5/UDF/capi/capi.c b/sql/backends/monet5/UDF/capi/capi.c --- a/sql/backends/monet5/UDF/capi/capi.c +++ b/sql/backends/monet5/UDF/capi/capi.c @@ -448,6 +448,10 @@ static str CUDFeval(Client cntxt, MalBlk allocated_regions[tid] = NULL; + if (!GDKgetenv_istrue("embedded_c") && !GDKgetenv_isyes("embedded_c")) + throw(MAL, "cudf.eval", "Embedded C has not been enabled. " + "Start server with --set embedded_c=true"); + // we need to be able to catch segfaults and bus errors // so we can work with mprotect to prevent UDFs from changing // the input data diff --git a/sql/backends/monet5/sql_statistics.c b/sql/backends/monet5/sql_statistics.c --- a/sql/backends/monet5/sql_statistics.c +++ b/sql/backends/monet5/sql_statistics.c @@ -112,6 +112,8 @@ sql_analyze(Client cntxt, MalBlkPtr mb, if (tbl && strcmp(bt->name, tbl)) continue; + if (t->persistence != SQL_PERSIST) + throw(SQL, "analyze", SQLSTATE(42S02) "Table '%s' is not persistent", bt->name); tfnd = 1; if (isTable(t) && t->columns.set) for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) { diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -506,7 +506,7 @@ rel_label( mvc *sql, sql_rel *r, int all return r; } -void +sql_exp * rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e) { assert(is_project(rel->op)); @@ -523,8 +523,9 @@ rel_project_add_exp( mvc *sql, sql_rel * if (e->card > rel->card) rel->card = e->card; } else if (rel->op == op_groupby) { - (void) rel_groupby_add_aggr(sql, rel, e); + return rel_groupby_add_aggr(sql, rel, e); } + return e; } void @@ -1282,7 +1283,7 @@ static sql_rel * set_intern(e); e->p = prop_create(sql->sa, PROP_HASHCOL, e->p); *exp = exp_label(sql->sa, e, ++sql->label); - rel_project_add_exp(sql, rel, e); + (void) rel_project_add_exp(sql, rel, e); return rel; } diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -52,7 +52,7 @@ extern sql_rel *rel_topn(sql_allocator * extern sql_rel *rel_sample(sql_allocator *sa, sql_rel *l, list *exps ); extern sql_rel *rel_label( mvc *sql, sql_rel *r, int all); -extern void rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e); +extern sql_exp *rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e); extern void rel_select_add_exp(sql_allocator *sa, sql_rel *l, sql_exp *e); extern void rel_join_add_exp(sql_allocator *sa, sql_rel *rel, sql_exp *e); extern sql_exp *rel_groupby_add_aggr(mvc *sql, sql_rel *rel, sql_exp *e); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2076,14 +2076,14 @@ rel_logical_value_exp(mvc *sql, sql_rel if (!l) { l = *rel = rel_project(sql->sa, NULL, new_exp_list(sql->sa)); - rel_project_add_exp(sql, l, ls); + ls = rel_project_add_exp(sql, l, ls); } else if (f == sql_sel) { /* allways add left side in case of selections phase */ if (!l->processed) { /* add all expressions to the project */ l->exps = list_merge(l->exps, rel_projections(sql, l->l, NULL, 1, 1), (fdup)NULL); l->exps = list_distinct(l->exps, (fcmp)exp_equal, (fdup)NULL); } if (!(rls = rel_find_exp(l, ls)) || rls == ls /* constant atom */) - rel_project_add_exp(sql, l, ls); + ls = rel_project_add_exp(sql, l, ls); } rs = rel_lastexp(sql, r); if (r->card > CARD_ATOM) { @@ -2128,7 +2128,7 @@ rel_logical_value_exp(mvc *sql, sql_rel if (!left) { left = *rel; if (outer && !outer->l && !list_empty(outer->exps) && needproj) { - rel_project_add_exp(sql, left, l); + l = rel_project_add_exp(sql, left, l); l = exp_column(sql->sa, exp_relname(l), exp_name(l), exp_subtype(l), l->card, has_nil(l), is_intern(l)); } } @@ -2174,7 +2174,7 @@ rel_logical_value_exp(mvc *sql, sql_rel } if (r && z && is_project(z->op) && z->l) { sql_rel *gp = z->l; - rel_project_add_exp(sql, z, r); + r = rel_project_add_exp(sql, z, r); reset_processed(gp); r = exp_column(sql->sa, exp_relname(r), exp_name(r), exp_subtype(r), r->card, has_nil(r), is_intern(r)); left = z; @@ -2673,7 +2673,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, sql_rel *in = rel_crossproduct(sql->sa, rel_dup(left), right, op_join); right = rel_project(sql->sa, in, rel_projections(sql, right, NULL, 1, 1)); - rel_project_add_exp(sql, right, roident); + roident = rel_project_add_exp(sql, right, roident); rident = exp_column(sql->sa, exp_relname(rident), exp_name(rident), exp_subtype(rident), rident->card, has_nil(rident), is_intern(rident)); roident = exp_column(sql->sa, exp_relname(roident), exp_name(roident), exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident)); } @@ -2685,14 +2685,14 @@ rel_logical_exp(mvc *sql, sql_rel *rel, if (!r) return NULL; - rel_project_add_exp(sql, rel, r); + r = rel_project_add_exp(sql, rel, r); rident = r; rident = exp_column(sql->sa, exp_relname(lident), exp_name(lident), exp_subtype(lident), lident->card, has_nil(lident), is_intern(lident)); } rel = rel_project(sql->sa, rel, NULL); - rel_project_add_exp(sql, rel, r); + r = rel_project_add_exp(sql, rel, r); if (rident) { - rel_project_add_exp(sql, rel, rident); + rident = rel_project_add_exp(sql, rel, rident); if (rident == roident) roident = exp_column(sql->sa, exp_relname(roident), exp_name(roident), exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident)); rident = exp_column(sql->sa, exp_relname(rident), exp_name(rident), exp_subtype(rident), rident->card, has_nil(rident), is_intern(rident)); @@ -2723,9 +2723,9 @@ rel_logical_exp(mvc *sql, sql_rel *rel, if (correlated) { rl = rel_dup(left); rl = rel_project(sql->sa, rl, NULL); - rel_project_add_exp(sql, rl, r); + r = rel_project_add_exp(sql, rl, r); if (roident) { - rel_project_add_exp(sql, rl, roident); + roident = rel_project_add_exp(sql, rl, roident); roident = exp_column(sql->sa, exp_relname(roident), exp_name(roident), exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident)); } } else { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list