Changeset: 605c3f65cc7a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=605c3f65cc7a
Modified Files:
gdk/gdk_batop.c
gdk/gdk_bbp.c
gdk/gdk_logger.c
gdk/gdk_orderidx.c
monetdb5/mal/mal_stack.c
sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out.int128
sql/benchmarks/tpch/LOCKED/Tests/02.stable.out
sql/benchmarks/tpch/Tests/01-22.stable.out
sql/benchmarks/tpch/Tests/01-22.stable.out.int128
sql/benchmarks/tpch/Tests/02.stable.out
sql/server/rel_optimizer.c
sql/server/rel_updates.c
sql/storage/store.c
sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
sql/test/BugTracker-2016/Tests/storagemodel.stable.out
sql/test/sql_xml/Tests/xml.reqtests
Branch: default
Log Message:
Merge with Dec2016 branch.
diffs (truncated from 593 to 300 lines):
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -74,8 +74,7 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
assert(b->ttype == TYPE_str);
/* only transient bats can use some other bat's string heap */
- assert(b->batRole == TRANSIENT ||
- b->tvheap->parentid == abs(b->batCacheid));
+ assert(b->batRole == TRANSIENT || b->tvheap->parentid == b->batCacheid);
if (n->batCount == 0 || (s && s->batCount == 0))
return GDK_SUCCEED;
ni = bat_iterator(n);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1297,7 +1297,7 @@ bm_subcommit(logger *lg, BAT *list_bid,
name,
(list_bid == catalog_bid) ?
BUNtvar(iter, p) : "snapshot");
assert(BBPindex(name));
- n[i++] = abs(BBPindex(name));
+ n[i++] = BBPindex(name);
}
}
/* now commit catalog, so it's also up to date on disk */
diff --git a/gdk/gdk_orderidx.c b/gdk/gdk_orderidx.c
--- a/gdk/gdk_orderidx.c
+++ b/gdk/gdk_orderidx.c
@@ -173,6 +173,7 @@ BATorderidx(BAT *b, int stable)
oid *restrict mv;
oid seq;
BUN p, q;
+ BAT *bn = NULL;
if (BATcheckorderidx(b))
return GDK_SUCCEED;
@@ -195,7 +196,7 @@ BATorderidx(BAT *b, int stable)
if (!BATtdense(b)) {
/* we need to sort a copy of the column so as not to
* change the original */
- BAT *bn = COLcopy(b, b->ttype, TRUE, TRANSIENT);
+ bn = COLcopy(b, b->ttype, TRUE, TRANSIENT);
if (bn == NULL) {
HEAPfree(m, 1);
GDKfree(m);
@@ -219,7 +220,11 @@ BATorderidx(BAT *b, int stable)
BATcount(bn), Tsize(bn), SIZEOF_OID,
bn->ttype);
}
- BBPunfix(bn->batCacheid);
+ /* we must unfix after releasing the lock since we
+ * might get deadlock otherwise (we're holding a lock
+ * based on b->batCacheid; unfix tries to get a lock
+ * based on bn->batCacheid, usually but (crucially)
+ * not always a different lock) */
}
b->torderidx = m;
@@ -227,6 +232,9 @@ BATorderidx(BAT *b, int stable)
persistOIDX(b);
MT_lock_unset(&GDKhashLock(b->batCacheid));
+ if (bn)
+ BBPunfix(bn->batCacheid);
+
return GDK_SUCCEED;
}
@@ -514,7 +522,10 @@ OIDXdestroy(BAT *b)
Heap *hp;
MT_lock_set(&GDKhashLock(b->batCacheid));
- if ((hp = b->torderidx) == (Heap *) 1) {
+ hp = b->torderidx;
+ b->torderidx = NULL;
+ MT_lock_unset(&GDKhashLock(b->batCacheid));
+ if (hp == (Heap *) 1) {
GDKunlink(BBPselectfarm(b->batRole, b->ttype,
orderidxheap),
BATDIR,
BBP_physical(b->batCacheid),
@@ -523,7 +534,5 @@ OIDXdestroy(BAT *b)
HEAPdelete(hp, BBP_physical(b->batCacheid),
"torderidx");
GDKfree(hp);
}
- b->torderidx = NULL;
- MT_lock_unset(&GDKhashLock(b->batCacheid));
}
}
diff --git a/monetdb5/mal/mal_stack.c b/monetdb5/mal/mal_stack.c
--- a/monetdb5/mal/mal_stack.c
+++ b/monetdb5/mal/mal_stack.c
@@ -115,6 +115,10 @@ clearStack(MalStkPtr s)
GDKfree(v->val.pval);
v->vtype = 0;
v->val.pval = NULL;
+ } else if (BATatoms[v->vtype].atomUnfix) {
+ BATatoms[v->vtype].atomUnfix(VALget(v));
+ v->vtype = 0;
+ v->val.pval = NULL;
}
s->stkbot = 0;
}
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1650,7 +1650,6 @@ rel_push_count_down(int *changes, mvc *s
r && !r->exps && r->op == op_join && !(rel_is_ref(r)) &&
((sql_exp *) rel->exps->h->data)->type == e_aggr &&
strcmp(((sql_subaggr *) ((sql_exp *)
rel->exps->h->data)->f)->aggr->base.name, "count") == 0) {
-/* TODO check for count(*) */
sql_exp *nce, *oce;
sql_rel *gbl, *gbr; /* Group By */
sql_rel *cp; /* Cross Product */
@@ -3631,97 +3630,6 @@ rel_push_aggr_down(int *changes, mvc *sq
}
/*
- * Rewrite group(project(join(A,Dict)[a.i==dict.i])[...dict.n])[dict.n][ ...
dict.n ]
- * into
- * project(join(groupby (A)[a.i],[a.i]), Dict)[a.i==dict.i])[dict.n]
- *
- */
-
-static sql_rel *
-rel_push_groupby_down(int *changes, mvc *sql, sql_rel *rel)
-{
- sql_rel *p = rel->l, *j = rel->l;
- list *gbe = rel->r;
-
- if (rel->op == op_groupby && gbe && p && p->op == op_project) {
- sql_rel *j = p->l;
- sql_rel *jl, *jr;
- node *n;
-
- if (!j || j->op != op_join || list_length(j->exps) != 1)
- return rel;
- jl = j->l;
- jr = j->r;
-
- /* check if jr is a dict with index and var still used */
- if (jr->op != op_basetable || jr->l || !jr->r ||
list_length(jr->exps) != 2)
- return rel;
-
- /* check if group by is done on dict column */
- for(n = gbe->h; n; n = n->next) {
- sql_exp *ge = n->data, *pe = NULL, *e = NULL;
-
- /* find group by exp in project, then in dict */
- pe = rel_find_exp(p, ge);
- if (pe) /* find project exp in right hand of join, ie
dict */
- e = rel_find_exp(jr, pe);
- if (pe && e) { /* Rewrite: join with dict after the
group by */
- list *pexps = rel_projections(sql, rel, NULL,
1, 1), *npexps;
- node *m;
- sql_exp *ne = j->exps->h->data; /* join exp */
- p->l = jl; /* Project now only on the left
side of the join */
-
- ne = ne->l; /* The left side of the compare
is the index of the left */
-
- /* find ge reference in new projection list */
- npexps = sa_list(sql->sa);
- for (m = pexps->h; m; m = m->next) {
- sql_exp *a = m->data;
-
- if (exp_refers(ge, a)) {
- sql_exp *sc = jr->exps->t->data;
- sql_exp *e =
exp_column(sql->sa, exp_relname(sc), exp_name(sc), exp_subtype(sc), sc->card,
has_nil(sc), is_intern(sc));
- exp_setname(sql->sa, e,
exp_relname(a), exp_name(a));
- a = e;
- }
- append(npexps, a);
- }
-
- /* find ge in aggr list */
- for (m = rel->exps->h; m; m = m->next) {
- sql_exp *a = m->data;
-
- if (exp_match_exp(a, ge) ||
exp_refers(ge, a)) {
- a = exp_column(sql->sa,
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne),
is_intern(ne));
- exp_setname(sql->sa, a,
exp_relname(ne), exp_name(ne));
- m->data = a;
- }
- }
-
- /* change alias pe, ie project out the index */
- pe->l = (void*)exp_relname(ne);
- pe->r = (void*)exp_name(ne);
- exp_setname(sql->sa, pe, exp_relname(ne),
exp_name(ne));
-
- /* change alias ge */
- ge->l = (void*)exp_relname(pe);
- ge->r = (void*)exp_name(pe);
- exp_setname(sql->sa, ge, exp_relname(pe),
exp_name(pe));
-
- /* zap both project and groupby name hash
tables (as we changed names above) */
- rel->exps->ht = NULL;
- ((list*)rel->r)->ht = NULL;
- p->exps->ht = NULL;
-
- /* add join */
- j->l = rel;
- rel = rel_project(sql->sa, j, npexps);
- (*changes)++;
- }
- }
- (void)sql;
- }
-/*
* More general
* groupby(
* [ outer ] join(
@@ -3743,6 +3651,13 @@ rel_push_groupby_down(int *changes, mvc
* ) [ B.c1 ] [ a1, a2, .. ]
* ) [ A.c1 = B.c1 ]
*/
+static sql_rel *
+gen_push_groupby_down(int *changes, mvc *sql, sql_rel *rel)
+{
+ sql_rel *j = rel->l;
+ list *gbe = rel->r;
+
+ (void)changes;
if (rel->op == op_groupby && list_length(gbe) == 1 &&
is_outerjoin(j->op)) {
sql_rel *jl = j->l, *jr = j->r, *cr;
sql_exp *gb = gbe->h->data, *e;
@@ -3812,6 +3727,99 @@ rel_push_groupby_down(int *changes, mvc
}
/*
+ * Rewrite group(project(join(A,Dict)[a.i==dict.i])[...dict.n])[dict.n][ ...
dict.n ]
+ * into
+ * project(join(groupby (A)[a.i],[a.i]), Dict)[a.i==dict.i])[dict.n]
+ *
+ */
+static sql_rel *
+rel_push_groupby_down(int *changes, mvc *sql, sql_rel *rel)
+{
+ sql_rel *p = rel->l;
+ list *gbe = rel->r;
+
+ if (rel->op == op_groupby && gbe && p && p->op == op_project) {
+ sql_rel *j = p->l;
+ sql_rel *jl, *jr;
+ node *n;
+
+ if (!j || j->op != op_join || list_length(j->exps) != 1)
+ return gen_push_groupby_down(changes, sql, rel);
+ jl = j->l;
+ jr = j->r;
+
+ /* check if jr is a dict with index and var still used */
+ if (jr->op != op_basetable || jr->l || !jr->r ||
list_length(jr->exps) != 2)
+ return gen_push_groupby_down(changes, sql, rel);
+
+ /* check if group by is done on dict column */
+ for(n = gbe->h; n; n = n->next) {
+ sql_exp *ge = n->data, *pe = NULL, *e = NULL;
+
+ /* find group by exp in project, then in dict */
+ pe = rel_find_exp(p, ge);
+ if (pe) /* find project exp in right hand of join, ie
dict */
+ e = rel_find_exp(jr, pe);
+ if (pe && e) { /* Rewrite: join with dict after the
group by */
+ list *pexps = rel_projections(sql, rel, NULL,
1, 1), *npexps;
+ node *m;
+ sql_exp *ne = j->exps->h->data; /* join exp */
+ p->l = jl; /* Project now only on the left
side of the join */
+
+ ne = ne->l; /* The left side of the compare
is the index of the left */
+
+ /* find ge reference in new projection list */
+ npexps = sa_list(sql->sa);
+ for (m = pexps->h; m; m = m->next) {
+ sql_exp *a = m->data;
+
+ if (exp_refers(ge, a)) {
+ sql_exp *sc = jr->exps->t->data;
+ sql_exp *e =
exp_column(sql->sa, exp_relname(sc), exp_name(sc), exp_subtype(sc), sc->card,
has_nil(sc), is_intern(sc));
+ exp_setname(sql->sa, e,
exp_relname(a), exp_name(a));
+ a = e;
+ }
+ append(npexps, a);
+ }
+
+ /* find ge in aggr list */
+ for (m = rel->exps->h; m; m = m->next) {
+ sql_exp *a = m->data;
+
+ if (exp_match_exp(a, ge) ||
exp_refers(ge, a)) {
+ a = exp_column(sql->sa,
exp_relname(ne), exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne),
is_intern(ne));
+ exp_setname(sql->sa, a,
exp_relname(ne), exp_name(ne));
+ m->data = a;
+ }
+ }
+
+ /* change alias pe, ie project out the index */
+ pe->l = (void*)exp_relname(ne);
+ pe->r = (void*)exp_name(ne);
+ exp_setname(sql->sa, pe, exp_relname(ne),
exp_name(ne));
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list