Changeset: 008381cbae30 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=008381cbae30 Modified Files: sql/server/rel_optimizer.c Branch: default Log Message:
Avoid list merging diffs (71 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 @@ -4453,9 +4453,7 @@ rel_push_select_down(visitor *v, sql_rel /* add inplace empty select */ sql_rel *l = rel_select(v->sql->sa, rel->l, NULL); - if (!l->exps) - l->exps = sa_list(v->sql->sa); - (void)list_merge(l->exps, rel->exps, (fdup)NULL); + l->exps = rel->exps; rel->exps = NULL; rel->l = l; v->changes++; @@ -4980,8 +4978,10 @@ rel_join_push_exps_down(visitor *v, sql_ for(node *n=rel->exps->h; n;) { node *next = n->next; sql_exp *e = n->data; - int le = rel_has_cmp_exp(l, e); - int re = rel_has_cmp_exp(r, e); + int le = rel_has_cmp_exp(l, e), re = 0; + + if (e->type == e_cmp && (rel->op != op_anti || (e->flag != mark_notin && e->flag != mark_in))) + re = rel_has_cmp_exp(r, e); /* select expressions on left */ if (le && !re) { @@ -4990,7 +4990,7 @@ rel_join_push_exps_down(visitor *v, sql_ append(lexps, e); list_remove_node(rel->exps, NULL, n); /* select expressions on right */ - } else if (!le && re && (rel->op != op_anti || (e->flag != mark_notin && e->flag != mark_in))) { + } else if (!le && re) { if (!rexps) rexps=sa_list(v->sql->sa); append(rexps, e); @@ -4999,20 +4999,22 @@ rel_join_push_exps_down(visitor *v, sql_ n = next; } if (lexps) { - l = rel->l = rel_select(v->sql->sa, rel->l, NULL); - if (l->exps) - list_merge(lexps, l->exps, NULL); - - l->exps = lexps; - v->changes = 1; + if (is_select(l->op)) { + l->exps = list_empty(l->exps) ? lexps : list_merge(l->exps, lexps, (fdup) NULL); + } else { + l = rel->l = rel_select(v->sql->sa, rel->l, NULL); + l->exps = lexps; + } + v->changes++; } if (rexps) { - r = rel->r = rel_select(v->sql->sa, rel->r, NULL); - if (r->exps) - list_merge(rexps, r->exps, NULL); - - r->exps = rexps; - v->changes = 1; + if (is_select(r->op)) { + r->exps = list_empty(r->exps) ? rexps : list_merge(r->exps, rexps, (fdup) NULL); + } else { + r = rel->r = rel_select(v->sql->sa, rel->r, NULL); + r->exps = rexps; + } + v->changes++; } } return rel; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list