Changeset: fe884f686c1d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/fe884f686c1d Modified Files: sql/server/rel_optimize_others.c sql/server/rel_optimize_sel.c Branch: balanced_union Log Message:
small fixes for munion and dce optimizer push munion down select diffs (94 lines): diff --git a/sql/server/rel_optimize_others.c b/sql/server/rel_optimize_others.c --- a/sql/server/rel_optimize_others.c +++ b/sql/server/rel_optimize_others.c @@ -491,6 +491,10 @@ rel_used(sql_rel *rel) if (is_join(rel->op) || is_set(rel->op) || is_semi(rel->op) || is_modify(rel->op)) { rel_used(rel->l); rel_used(rel->r); + } else if (rel->op == op_munion) { + list *l = rel->l; + for(node *n = l->h; n; n = n->next) + rel_used(n->data); } else if (is_topn(rel->op) || is_select(rel->op) || is_sample(rel->op)) { rel_used(rel->l); rel = rel->l; @@ -629,26 +633,27 @@ rel_mark_used(mvc *sql, sql_rel *rel, in case op_munion: assert(rel->l); - for (node *n = ((list*)rel->l)->h; n; n = n->next) { - // TODO: here we blindly follow the same logic as op_union. RE-evaluate - if (proj && (need_distinct(rel) || !rel->exps)) { - rel_used(rel); - if (!rel->exps) { + // TODO: here we blindly follow the same logic as op_union. RE-evaluate + if (proj && (need_distinct(rel) || !rel->exps)) { + rel_used(rel); + if (!rel->exps) { + for (node *n = ((list*)rel->l)->h; n; n = n->next) { rel_used(n->data); + rel_mark_used(sql, n->data, 0); } - rel_mark_used(sql, n->data, 0); - } else if (proj && !need_distinct(rel)) { + } + } else if (proj && !need_distinct(rel)) { + bool first = true; + for (node *n = ((list*)rel->l)->h; n; n = n->next) { sql_rel *l = n->data; positional_exps_mark_used(rel, l); rel_exps_mark_used(sql->sa, rel, l); rel_mark_used(sql, rel->l, 0); /* based on child check set expression list */ - if (is_project(l->op) && need_distinct(l)) + if (first && is_project(l->op) && need_distinct(l)) positional_exps_mark_used(l, rel); - positional_exps_mark_used(rel, n->data); - rel_exps_mark_used(sql->sa, rel, n->data); - rel_mark_used(sql, n->data, 0); + first = false; } } break; @@ -1038,6 +1043,7 @@ rel_add_projects(mvc *sql, sql_rel *rel) if (!is_project(r->op) && !need_distinct(rel)) r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 1)); r = rel_add_projects(sql, r); + n->data = r; } return rel; case op_topn: diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c --- a/sql/server/rel_optimize_sel.c +++ b/sql/server/rel_optimize_sel.c @@ -3468,6 +3468,29 @@ rel_push_select_down(visitor *v, sql_rel set_distinct(rel); v->changes++; } + if (is_select(rel->op) && r && is_munion(r->op) && !list_empty(r->exps) && !rel_is_ref(r) && !is_single(r) && !list_empty(exps)) { + sql_rel *u = r; + list *rels = u->l, *nrels = sa_list(v->sql->sa); + for(node *n = rels->h; n; n = n->next) { + sql_rel *ul = n->data; + ul = rel_dup(ul); + if (!is_project(ul->op)) + ul = rel_project(v->sql->sa, ul, + rel_projections(v->sql, ul, NULL, 1, 1)); + rel_rename_exps(v->sql, u->exps, ul->exps); + + /* introduce selects under the set */ + ul = rel_select(v->sql->sa, ul, NULL); + ul->exps = exps_copy(v->sql, exps); + set_processed(ul); + nrels = append(nrels, ul); + } + + rel = rel_inplace_setop_n_ary(v->sql, rel, nrels, u->op, rel_projections(v->sql, rel, NULL, 1, 1)); + if (need_distinct(u)) + set_distinct(rel); + v->changes++; + } return try_remove_empty_select(v, rel); } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org