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]