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 -- [email protected]
To unsubscribe send an email to [email protected]