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