Changeset: 463215acd8d6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/463215acd8d6
Modified Files:
sql/backends/monet5/rel_physical.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_select.c
sql/server/rel_unnest.c
Branch: default
Log Message:
creating seperated (flattend) blocks for nested recursive unions is done in
rel_physical
diffs (116 lines):
diff --git a/sql/backends/monet5/rel_physical.c
b/sql/backends/monet5/rel_physical.c
--- a/sql/backends/monet5/rel_physical.c
+++ b/sql/backends/monet5/rel_physical.c
@@ -91,12 +91,22 @@ exp_timezone(visitor *v, sql_rel *rel, s
return e;
}
+static sql_rel *
+rel_add_ref4_rec_union(visitor *v, sql_rel *rel)
+{
+ (void)v;
+ if (is_recursive(rel))
+ rel = rel_dup(rel);
+ return rel;
+}
+
sql_rel *
rel_physical(mvc *sql, sql_rel *rel)
{
visitor v = { .sql = sql };
rel = rel_visitor_bottomup(&v, rel, &rel_add_orderby);
+ rel = rel_visitor_topdown(&v, rel, &rel_add_ref4_rec_union);
rel = rel_exp_visitor_topdown(&v, rel, &exp_timezone, true);
#ifdef HAVE_HGE
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1220,6 +1220,15 @@ exp_equal( sql_exp *e1, sql_exp *e2)
}
int
+is_conflict( sql_exp *e1, sql_exp *e2)
+{
+ if (e1->alias.label && e1->alias.label == e2->alias.label &&
+ e1->nid && e1->nid != e2->nid)
+ return 0;
+ return -1;
+}
+
+int
exp_match( sql_exp *e1, sql_exp *e2)
{
if (exp_cmp(e1, e2) == 0)
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -144,6 +144,7 @@ extern bool rel_find_nid(sql_rel *rel, i
extern int exp_cmp( sql_exp *e1, sql_exp *e2);
extern int exp_equal( sql_exp *e1, sql_exp *e2);
+extern int is_conflict( sql_exp *e1, sql_exp *e2);
extern int exp_refers( sql_exp *p, sql_exp *c);
extern sql_exp *exps_refers( sql_exp *p, list *exps);
extern int exp_match( sql_exp *e1, sql_exp *e2);
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
@@ -382,7 +382,7 @@ rel_with_query(sql_query *query, symbol
set_distinct(nrel);
rel_setop_n_ary_set_exps(sql, nrel,
rel_projections(sql, nrel, NULL, 0, 1), false);
set_processed(nrel);
- recursive_union->rel_view = rel_dup(nrel); /* extra
incref for independent flow */
+ recursive_union->rel_view = nrel;
}
if (!is_project(nrel->op)) {
if (is_topn(nrel->op) || is_sample(nrel->op)) {
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -889,17 +889,25 @@ push_up_project(mvc *sql, sql_rel *rel,
}
}
if (cexps) {
- sql_rel *p = l->l = rel_project(
sql->sa, l->l,
- rel_projections(sql, l->l,
NULL, 1, 1));
- p->exps =
list_distinct(list_merge(p->exps, cexps, (fdup)NULL), (fcmp)exp_equal,
(fdup)NULL);
- if (list_empty(nexps)) {
- rel->r = l; /* remove empty
project */
- } else {
- for (n = cexps->h; n; n =
n->next) { /* add pushed down renamed expressions */
- sql_exp *e = n->data;
- append(nexps,
exp_ref(sql, e));
+ list *exps = rel_projections(sql, l->l,
NULL, 1, 1);
+ bool dup = false;
+ for (node *n = cexps->h; n && !dup; n =
n->next)
+ /* do we have an expression
which will result in same alias but different origin */
+ if (list_find(exps, n->data,
(fcmp)&is_conflict))
+ dup = true;
+
+ if (!dup) {
+ exps =
list_distinct(list_merge(exps, cexps, (fdup)NULL), (fcmp)exp_equal, (fdup)NULL);
+ l->l = rel_project( sql->sa,
l->l, exps);
+ if (list_empty(nexps)) {
+ rel->r = l; /* remove
empty project */
+ } else {
+ for (n = cexps->h; n; n
= n->next) { /* add pushed down renamed expressions */
+ sql_exp *e =
n->data;
+ append(nexps,
exp_ref(sql, e));
+ }
+ r->exps = nexps;
}
- r->exps = nexps;
}
}
}
@@ -1600,6 +1608,8 @@ push_up_munion(mvc *sql, sql_rel *rel, l
sql_rel *r = iu->h->data;
set_recursive(r);
append(rlist, rel_dup(r));
+ if (is_project(r->op))
+ len = list_length(r->exps);
}
for(node *n = rec?iu->h->next:iu->h; n; n = n->next) {
sql_rel *sl = n->data;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]