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]

Reply via email to