Changeset: 7d00e277bd5e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7d00e277bd5e
Modified Files:
        sql/server/rel_unnest.c
Branch: unnest2
Log Message:

improved version of recursive cte


diffs (47 lines):

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
@@ -5511,7 +5511,7 @@ unnest(visitor *v, sql_rel *parent, sql_
        if (!rel)
                return ;
 
-       if (list_empty(acc)) { /* unnest ends add join with d */
+       if (list_empty(acc) && !rel_is_ref(rel)) { /* unnest ends add join with 
d */
                sql_rel *d = rel_project(v->sql->sa, rel_dup(info->info->d), 
rel_projections(v->sql, info->info->d, NULL, 1, 1));
                add_outers_repr(v, d, info, true);
                sql_rel *nrel = rel_crossproduct(v->sql->sa, d, rel,  op_join);
@@ -5523,6 +5523,15 @@ unnest(visitor *v, sql_rel *parent, sql_
                return ;
        }
        rel->used |= unnest_used;
+       if (list_empty(acc) && rel_is_ref(rel)) { /* unnest of ref needs 
inplace join with d */
+               sql_rel *d = rel_project(v->sql->sa, rel_dup(info->info->d), 
rel_projections(v->sql, info->info->d, NULL, 1, 1));
+               add_outers_repr(v, d, info, true);
+               list *exps = list_merge(rel_projections(v->sql, d, NULL, 0, 1), 
rel_projections(v->sql, rel, NULL, 0, 1), NULL);
+               rel = rel_inplace_project(v->sql->sa, rel, NULL, exps);
+               rel->l = rel_crossproduct(v->sql->sa, d, rel->l,  op_join);
+               //rel_update_subrel(parent, rel, nrel);
+               return;
+       }
 
        /* handle projection of freevar without lower relation */
        if (is_simple_project(rel->op) && !rel->l) {
@@ -5566,13 +5575,14 @@ unnest(visitor *v, sql_rel *parent, sql_
                assert(list_length(rels) == 2);
                sql_rel *base = rels->h->data;
                sql_rel *iter = rels->h->next->data;
-               //list *base_acc = accessing(v, base, acc);
                struct unnesting base_unnest = { .info = info->info };
-               list *base_acc = list_dup(acc, NULL);
+               list *base_acc = accessing(v, base, acc);
+               bool add_base = (list_empty(base_acc));
                unnest(v, rel, base, &base_unnest, base_acc);
-               //struct unnesting iter_unnest = { .info = info->info };
+               set_recursive(base);
                list *iter_acc = accessing(v, iter, acc);
-               //unnest(v, rel, iter, &iter_unnest, iter_acc);
+               if (add_base) /* make sure we unnest up till the base */
+                       append(iter_acc, base);
                unnest(v, rel, iter, info, iter_acc);
                rel->exps = add_outers(v, rel->exps, info, false);
                rel->exps = rewrite_columns(v, rel->exps, info);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to