Changeset: 6325899d0bc4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6325899d0bc4
Modified Files:
sql/server/rel_optimizer.c
Branch: Oct2020
Log Message:
Don't create an extra projection if the optimizer is not going to do anything.
Also removed superfluous 'subquery' flag checks at rel_optimizer. At debug
builds assert the the number of level optimizations to be less than 20
diffs (170 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1498,31 +1498,21 @@ rel_push_func_down(visitor *v, sql_rel *
{
if ((is_select(rel->op) || is_joinop(rel->op)) && rel->l && rel->exps
&& !(rel_is_ref(rel))) {
list *exps = rel->exps;
-
- if (is_select(rel->op) && list_length(rel->exps) <= 1) /*
only push down when thats useful */
+ sql_rel *l = rel->l, *r = rel->r;
+
+ /* only push down when is useful */
+ if ((is_select(rel->op) && list_length(rel->exps) <= 1) ||
rel_is_ref(l) || (is_joinop(rel->op) && rel_is_ref(r)))
return rel;
if (exps_can_push_func(exps, rel) && exps_need_push_down(exps))
{
- sql_rel *nrel;
- sql_rel *l = rel->l, *ol = l;
- sql_rel *r = rel->r, *or = r;
+ sql_rel *nrel, *ol = l, *or = r;
visitor nv = { .sql = v->sql, .parent = v->parent };
/* we need a full projection, group by's and unions
cannot be extended
* with more expressions */
- if (rel_is_ref(l))
- return rel;
- if (l->op != op_project) {
- if (is_subquery(l))
- return rel;
+ if (!is_simple_project(l->op))
rel->l = l = rel_project(v->sql->sa, l,
rel_projections(v->sql, l, NULL, 1, 1));
- }
- if (is_joinop(rel->op) && rel_is_ref(r))
- return rel;
- if (is_joinop(rel->op) && r->op != op_project) {
- if (is_subquery(r))
- return rel;
+ if (is_joinop(rel->op) && !is_simple_project(r->op))
rel->r = r = rel_project(v->sql->sa, r,
rel_projections(v->sql, r, NULL, 1, 1));
- }
nrel = rel_project(v->sql->sa, rel,
rel_projections(v->sql, rel, NULL, 1, 1));
if (!(exps = exps_push_single_func_down(&nv, rel, l, r,
exps)))
@@ -1538,26 +1528,18 @@ rel_push_func_down(visitor *v, sql_rel *
v->changes += nv.changes;
}
}
- if (rel->op == op_project && rel->l && rel->exps) {
+ if (is_simple_project(rel->op) && rel->l && rel->exps) {
sql_rel *pl = rel->l;
if (is_joinop(pl->op) && exps_can_push_func(rel->exps, rel)) {
- node *n;
sql_rel *l = pl->l, *r = pl->r;
- list *nexps;
-
- if (l->op != op_project) {
- if (is_subquery(l))
- return rel;
+ list *nexps = new_exp_list(v->sql->sa);
+
+ if (!is_simple_project(l->op))
pl->l = l = rel_project(v->sql->sa, l,
rel_projections(v->sql, l, NULL, 1, 1));
- }
- if (is_joinop(rel->op) && r->op != op_project) {
- if (is_subquery(r))
- return rel;
+ if (is_joinop(rel->op) && !is_simple_project(r->op))
pl->r = r = rel_project(v->sql->sa, r,
rel_projections(v->sql, r, NULL, 1, 1));
- }
- nexps = new_exp_list(v->sql->sa);
- for ( n = rel->exps->h; n; n = n->next) {
+ for (node *n = rel->exps->h; n; n = n->next) {
sql_exp *e = n->data;
int mustl = 0, mustr = 0;
@@ -4069,7 +4051,6 @@ rel_push_aggr_down(visitor *v, sql_rel *
if (ul->op == op_groupby || ur->op == op_groupby)
return rel;
- rel->subquery = 0;
/* distinct should be done over the full result */
for (n = g->exps->h; n; n = n->next) {
sql_exp *e = n->data;
@@ -5059,7 +5040,6 @@ rel_push_join_down_union(visitor *v, sql
if (is_semi(rel->op) && is_union(l->op) && je &&
!find_prop(je->p, PROP_JOINIDX))
return rel;
- ol->subquery = or->subquery = 0;
if ((is_union(l->op) && !need_distinct(l)) && !is_union(r->op)){
sql_rel *nl, *nr;
sql_rel *ll = rel_dup(l->l), *lr = rel_dup(l->r);
@@ -5459,10 +5439,6 @@ rel_push_select_down_union(visitor *v, s
ul = u->l;
ur = u->r;
- rel->subquery = 0;
- u->subquery = 0;
- ul->subquery = 0;
- ur->subquery = 0;
ul = rel_dup(ul);
ur = rel_dup(ur);
if (!is_project(ul->op))
@@ -5594,8 +5570,6 @@ rel_push_project_down_union(visitor *v,
if ((is_project(ul->op) && !ul->l) || (is_project(ur->op) &&
!ur->l))
return rel;
- rel->subquery = 0;
- u->subquery = 0;
ul = rel_dup(ul);
ur = rel_dup(ur);
@@ -6294,7 +6268,6 @@ rel_remove_join(visitor *v, sql_rel *rel
rel->l = l;
rel->r = NULL;
/* wrap in a project including, the constant columns */
- l->subquery = 0;
rel = rel_project(v->sql->sa, rel,
rel_projections(v->sql, l, NULL, 1, 1));
list_merge(rel->exps, r->exps, (fdup)NULL);
}
@@ -6328,7 +6301,6 @@ rel_remove_join(visitor *v, sql_rel *rel
rel->l = l;
rel->r = NULL;
/* wrap in a project including, the dict/index columns */
- l->subquery = 0;
rel = rel_project(v->sql->sa, rel, rel_projections(v->sql, l,
NULL, 1, 1));
list_merge(rel->exps, r->exps, (fdup)NULL);
}
@@ -6359,7 +6331,6 @@ rel_remove_join(visitor *v, sql_rel *rel
v->changes++;
rel->l = l;
rel->r = NULL;
- l->subquery = 0;
}
}
return rel;
@@ -6392,8 +6363,7 @@ rel_push_project_up(visitor *v, sql_rel
(is_select(rel->op) && l->op != op_project) ||
(is_join(rel->op) && ((l->op != op_project && r->op !=
op_project) || is_topn(r->op))) ||
((l->op == op_project && (!l->l || l->r ||
project_unsafe(l,is_select(rel->op)))) ||
- (is_join(rel->op) && (is_subquery(r) ||
- (r->op == op_project && (!r->l || r->r ||
project_unsafe(r,0)))))))
+ (is_join(rel->op) && (r->op == op_project && (!r->l || r->r
|| project_unsafe(r,0))))))
return rel;
if (l->op == op_project && l->l) {
@@ -7226,7 +7196,6 @@ rel_add_projects(mvc *sql, sql_rel *rel)
if (rel->l) {
sql_rel *l = rel->l;
- l->subquery = 0;
if (!is_project(l->op) && !need_distinct(rel))
l = rel_project(sql->sa, l,
rel_projections(sql, l, NULL, 1, 1));
rel->l = rel_add_projects(sql, l);
@@ -7234,7 +7203,6 @@ rel_add_projects(mvc *sql, sql_rel *rel)
if (rel->r) {
sql_rel *r = rel->r;
- r->subquery = 0;
if (!is_project(r->op) && !need_distinct(rel))
r = rel_project(sql->sa, r,
rel_projections(sql, r, NULL, 1, 1));
rel->r = rel_add_projects(sql, r);
@@ -9745,5 +9713,8 @@ rel_optimizer(mvc *sql, sql_rel *rel, in
rel = rel_keep_renames(sql, rel);
for( ;rel && level < 20 && changes; level++)
rel = optimize_rel(sql, rel, &changes, level, value_based_opt);
+#ifndef NDEBUG
+ assert(level < 20);
+#endif
return rel;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list