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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list