Changeset: 1a3b93a43eb6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1a3b93a43eb6
Modified Files:
        sql/server/rel_unnest.c
Branch: default
Log Message:

fixed unnesting where the depending table is used at both sides of the join, ie 
gave a cycle.


diffs (24 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
@@ -3798,9 +3798,17 @@ unnest(visitor *v, sql_rel *parent, sql_
                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->nr_outers = list_length(info->info->outer_refs);
-               rel->l = rel_crossproduct(v->sql->sa, d, rel->l,  
is_right(info->info->join->op) ? info->info->join->op : op_join);
+               if (!rel_in_rel(info->info->d, rel)) {
+                       rel = rel_inplace_project(v->sql->sa, rel, NULL, exps);
+                       rel->nr_outers = list_length(info->info->outer_refs);
+                       rel->l = rel_crossproduct(v->sql->sa, d, rel->l,  
is_right(info->info->join->op) ? info->info->join->op : op_join);
+               } else {
+                       sql_rel *nrel = rel_crossproduct(v->sql->sa, d, rel,  
is_right(info->info->join->op) ? info->info->join->op : op_join);
+                       nrel = rel_project(v->sql->sa, nrel, exps);
+                       nrel->nr_outers = list_length(info->info->outer_refs);
+                       rel_update_subrel(parent, rel, nrel);
+                       rel = nrel;
+               }
                return;
        }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to