Changeset: 6ca9a842453b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6ca9a842453b Modified Files: sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_unnest.c sql/server/rel_updates.c Branch: default Log Message:
Set new select relations as processed during optimization diffs (truncated from 421 to 300 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 @@ -1493,7 +1493,9 @@ rel_simplify_project_fk_join(mvc *sql, s } else { nr = rel_dup(r->r); } - return rel_select(sql->sa, nr, nje); + nr = rel_select(sql->sa, nr, nje); + set_processed(nr); + return nr; } static sql_rel * @@ -1568,7 +1570,9 @@ rel_simplify_count_fk_join(mvc *sql, sql } else { nr = rel_dup(r->r); } - return rel_select(sql->sa, nr, nje); + nr = rel_select(sql->sa, nr, nje); + set_processed(nr); + return nr; } /* @@ -4343,6 +4347,7 @@ rel_push_select_down(visitor *v, sql_rel sql_rel *l = rel_select(v->sql->sa, rel->l, NULL); l->exps = rel->exps; + set_processed(l); rel->exps = NULL; rel->l = l; v->changes++; @@ -4397,8 +4402,7 @@ rel_push_select_down(visitor *v, sql_rel /* push select through join */ if (is_select(rel->op) && r && is_join(r->op) && !rel_is_ref(r) && !is_single(r)){ - sql_rel *jl = r->l; - sql_rel *jr = r->r; + sql_rel *jl = r->l, *ojl = jl, *jr = r->r, *ojr = jr; int left = r->op == op_join || r->op == op_left; int right = r->op == op_join || r->op == op_right; @@ -4427,6 +4431,10 @@ rel_push_select_down(visitor *v, sql_rel } n = next; } + if (ojl != jl) + set_processed(jl); + if (ojr != jr) + set_processed(jr); } /* merge select and cross product ? */ @@ -4437,7 +4445,7 @@ rel_push_select_down(visitor *v, sql_rel if (exp_is_join(e, NULL) == 0) { if (!r->exps) - r->exps = new_exp_list(v->sql->sa); + r->exps = sa_list(v->sql->sa); append(r->exps, e); list_remove_node(exps, NULL, n); v->changes++; @@ -4447,31 +4455,29 @@ rel_push_select_down(visitor *v, sql_rel } if (is_select(rel->op) && r && r->op == op_project && !rel_is_ref(r) && !is_single(r)){ - sql_rel *pl = r->l; + sql_rel *pl = r->l, *opl = pl; /* we cannot push through window functions (for safety I disabled projects over DDL too) */ if (pl && pl->op != op_ddl && !exps_have_unsafe(r->exps, 0)) { /* introduce selects under the project (if needed) */ set_processed(pl); - if (pl && (is_select(pl->op) || is_join(pl->op) || is_semi(pl->op)) && !pl->exps) + if (!pl->exps) pl->exps = sa_list(v->sql->sa); for (n = exps->h; n;) { node *next = n->next; sql_exp *e = n->data, *ne = NULL; - if (e->type == e_cmp) { - ne = exp_push_down_prj(v->sql, e, r, pl); - - /* can we move it down */ - if (ne && ne != e && pl->exps) { - if (!(is_select(pl->op) && is_join(pl->op) && is_semi(pl->op)) || rel_is_ref(pl)) - r->l = pl = rel_select(v->sql->sa, pl, NULL); - rel_select_add_exp(v->sql->sa, pl, ne); - list_remove_node(exps, NULL, n); - v->changes++; - } + /* can we move it down */ + if (e->type == e_cmp && (ne = exp_push_down_prj(v->sql, e, r, pl)) && ne != e) { + if (!(is_select(pl->op) && is_join(pl->op) && is_semi(pl->op)) || rel_is_ref(pl)) + r->l = pl = rel_select(v->sql->sa, pl, NULL); + rel_select_add_exp(v->sql->sa, pl, ne); + list_remove_node(exps, NULL, n); + v->changes++; } n = next; } + if (opl != pl) + set_processed(pl); } } @@ -4493,8 +4499,10 @@ rel_push_select_down(visitor *v, sql_rel /* introduce selects under the set */ ul = rel_select(v->sql->sa, ul, NULL); ul->exps = exps_copy(v->sql, exps); + set_processed(ul); ur = rel_select(v->sql->sa, ur, NULL); ur->exps = exps_copy(v->sql, exps); + set_processed(ur); rel = rel_inplace_setop(v->sql, rel, ul, ur, u->op, rel_projections(v->sql, rel, NULL, 1, 1)); if (need_distinct(u)) @@ -4512,35 +4520,34 @@ rel_push_join_exps_down(visitor *v, sql_ if ((is_innerjoin(rel->op) || is_left(rel->op) || is_right(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) { int left = is_innerjoin(rel->op) || is_right(rel->op) || /*is_semi(rel->op)*/ rel->op == op_semi; int right = is_innerjoin(rel->op) || is_left(rel->op) || is_semi(rel->op); - + sql_rel *jl = rel->l, *ojl = jl, *jr = rel->r, *ojr = jr; + + set_processed(jl); + set_processed(jr); for (node *n = rel->exps->h; n;) { node *next = n->next; sql_exp *e = n->data; - if (left && rel_rebind_exp(v->sql, rel->l, e)) { /* select expressions on left */ - sql_rel *l = rel->l; - if (!is_select(l->op) || rel_is_ref(l)) { - set_processed(l); - rel->l = l = rel_select(v->sql->sa, rel->l, NULL); - } - rel_select_add_exp(v->sql->sa, rel->l, e); + if (left && rel_rebind_exp(v->sql, jl, e)) { /* select expressions on left */ + if (!is_select(jl->op) || rel_is_ref(jl)) + rel->l = jl = rel_select(v->sql->sa, jl, NULL); + rel_select_add_exp(v->sql->sa, jl, e); list_remove_node(rel->exps, NULL, n); v->changes++; } else if (right && ((rel->op != op_anti && rel->op != op_left) || (e->flag != mark_notin && e->flag != mark_in)) && - rel_rebind_exp(v->sql, rel->r, e)) { /* select expressions on right */ - sql_rel *r = rel->r; - if (!is_select(r->op) || rel_is_ref(r)) { - set_processed(r); - rel->r = r = rel_select(v->sql->sa, rel->r, NULL); - } - rel_select_add_exp(v->sql->sa, rel->r, e); + rel_rebind_exp(v->sql, jr, e)) { /* select expressions on right */ + if (!is_select(jr->op) || rel_is_ref(jr)) + rel->r = jr = rel_select(v->sql->sa, jr, NULL); + rel_select_add_exp(v->sql->sa, jr, e); list_remove_node(rel->exps, NULL, n); v->changes++; } n = next; } - if (is_join(rel->op) && list_empty(rel->exps)) - rel->exps = NULL; /* crossproduct */ + if (ojl != jl) + set_processed(jl); + if (ojr != jr) + set_processed(jr); } return rel; } @@ -4753,23 +4760,25 @@ rel_push_semijoin_down_or_up(visitor *v, } /* first push down the expressions involving only A */ if (rel->op == op_semi && rel->exps && rel->l) { + sql_rel *jl = rel->l, *ojl = jl; + + set_processed(jl); for (node *n = rel->exps->h; n;) { node *next = n->next; sql_exp *e = n->data; - if (n != rel->exps->h && e->type == e_cmp && rel_rebind_exp(v->sql, rel->l, e)) { - sql_rel *l = rel->l; - if (!is_select(l->op) || rel_is_ref(l)) { - set_processed(l); - rel->l = l = rel_select(v->sql->sa, rel->l, NULL); - } - rel_select_add_exp(v->sql->sa, rel->l, e); + if (n != rel->exps->h && e->type == e_cmp && rel_rebind_exp(v->sql, jl, e)) { + if (!is_select(jl->op) || rel_is_ref(jl)) + rel->l = jl = rel_select(v->sql->sa, jl, NULL); + rel_select_add_exp(v->sql->sa, jl, e); list_remove_node(rel->exps, NULL, n); if (level <= 0) v->changes++; } n = next; } + if (ojl != jl) + set_processed(jl); } if (rel->op == op_semi && rel->exps && rel->l) { operator_type op = rel->op, lop; @@ -8955,6 +8964,7 @@ merge_table_prune_and_unionize(visitor * list *converted = sa_list(v->sql->sa); nrel = rel_project_exp(v->sql, exp_atom_bool(v->sql->sa, 1)); nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa, 0)); + set_processed(nrel); for (node *n = mt_rel->exps->h ; n ; n = n->next) { sql_exp *e = n->data, *a = exp_atom(v->sql->sa, atom_general(v->sql->sa, exp_subtype(e), NULL)); @@ -8973,6 +8983,7 @@ merge_table_prune_and_unionize(visitor * } else if (info) { /* propagate select under union */ next = rel_select(v->sql->sa, next, NULL); next->exps = exps_copy(v->sql, info->sel->exps); + set_processed(next); } if (nrel) { @@ -9363,6 +9374,7 @@ rel_remove_union_partitions(visitor *v, list *converted = sa_list(v->sql->sa); sql_rel *nrel = rel_project_exp(v->sql, exp_atom_bool(v->sql->sa, 1)); nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa, 0)); + set_processed(nrel); for (node *n = rel->exps->h ; n ; n = n->next) { sql_exp *e = n->data, *a = exp_atom(v->sql->sa, atom_general(v->sql->sa, exp_subtype(e), NULL)); diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c --- a/sql/server/rel_propagate.c +++ b/sql/server/rel_propagate.c @@ -214,6 +214,7 @@ create_range_partition_anti_rel(sql_quer } anti_rel = rel_select(sql->sa, anti_rel, anti_exp); + set_processed(anti_rel); anti_rel = rel_groupby(sql, anti_rel, NULL); aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0); (void) rel_groupby_add_aggr(sql, anti_rel, aggr); @@ -257,6 +258,7 @@ create_list_partition_anti_rel(sql_query } anti_rel = rel_select(sql->sa, anti_rel, anti_exp); + set_processed(anti_rel); anti_rel = rel_groupby(sql, anti_rel, NULL); aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0); (void) rel_groupby_add_aggr(sql, anti_rel, aggr); @@ -781,8 +783,10 @@ rel_generate_subinserts(sql_query *query } else if (range) { accum = exp_copy(sql, range); } - if (full_range) + if (full_range) { dup = rel_select(sql->sa, dup, full_range); + set_processed(dup); + } } else if (isListPartitionTable(t)) { sql_exp *ein = NULL; @@ -812,6 +816,7 @@ rel_generate_subinserts(sql_query *query found_nils = 1; } dup = rel_select(sql->sa, dup, ein); + set_processed(dup); } else { assert(0); } @@ -865,6 +870,7 @@ rel_generate_subinserts(sql_query *query } /* generate a count aggregation for the values not present in any of the partitions */ anti_rel = rel_select(sql->sa, anti_rel, anti_exp); + set_processed(anti_rel); anti_rel = rel_groupby(sql, anti_rel, NULL); aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_rel->card, 0); (void) rel_groupby_add_aggr(sql, anti_rel, aggr); @@ -1040,6 +1046,7 @@ rel_subtable_insert(sql_query *query, sq if (!found_all_range_values || !found_nils) { /* generate a count aggregation for the values not present in any of the partitions */ anti_dup = rel_select(sql->sa, anti_dup, anti_exp); + set_processed(anti_dup); anti_dup = rel_groupby(sql, anti_dup, NULL); aggr = exp_aggr(sql->sa, NULL, cf, 0, 0, anti_dup->card, 0); (void) rel_groupby_add_aggr(sql, anti_dup, aggr); 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 @@ -1077,6 +1077,7 @@ push_up_select(mvc *sql, sql_rel *rel, l rel->r = rel_dup(r->l); rel = rel_select(sql->sa, rel, NULL); rel->exps = !cp?exps:exps_copy(sql, exps); + set_processed(rel); rel_destroy(r); } return rel; @@ -1242,6 +1243,7 @@ push_up_groupby(mvc *sql, sql_rel *rel, if (list_length(sexps)) { r = rel_select(sql->sa, r, NULL); r->exps = sexps; + set_processed(r); } return r; } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org