Changeset: 055d1f50bb0f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=055d1f50bb0f Modified Files: sql/server/rel_optimizer.c Branch: Jul2017 Log Message:
fixed bug 6413, ie correct output of tpch sf1 q17. A column from the subquery was used in the outer query. This is fixed in the apply/rename optimizer (which correctly marks all internal columns as such and renames them). diffs (57 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 @@ -1439,7 +1439,7 @@ can_push_func(sql_exp *e, sql_rel *rel, int mustl = 0, mustr = 0, mustf = 0; sql_exp *l = e->l, *r = e->r, *f = e->f; - if (e->flag == cmp_or || e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) == cmp_filter) + if (get_cmp(e) == cmp_or || e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) == cmp_filter) return 0; return ((l->type == e_column || can_push_func(l, rel, &mustl)) && (*must = mustl)) || (!f && (r->type == e_column || can_push_func(r, rel, &mustr)) && (*must = mustr)) || @@ -1501,7 +1501,7 @@ exp_needs_push_down(sql_exp *e) return 0; switch(e->type) { case e_cmp: - if (e->flag == cmp_or || e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) == cmp_filter) + if (get_cmp(e) == cmp_or || e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) == cmp_filter) return 0; return exp_needs_push_down(e->l) || exp_needs_push_down(e->r) || (e->f && exp_needs_push_down(e->f)); case e_convert: @@ -6784,7 +6784,7 @@ split_exp(mvc *sql, sql_exp *e, sql_rel } return e; case e_cmp: - if (e->flag == cmp_or) { + if (get_cmp(e) == cmp_or) { split_exps(sql, e->l, rel); split_exps(sql, e->r, rel); } else if (e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) == cmp_filter) { @@ -7939,7 +7939,7 @@ exp_uses_exps(sql_exp *e, list *exps) return exps_uses_exps(e->l, exps); break; case e_cmp: - if (e->flag == cmp_or) { + if (get_cmp(e) == cmp_or) { return (exps_uses_exps(e->l, exps) || exps_uses_exps(e->r, exps)); } else if (e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) == cmp_filter) { return (exp_uses_exps(e->l, exps) || exps_uses_exps(e->r, exps)); @@ -8266,7 +8266,7 @@ exp_find_conflicts(mvc *sql, sql_exp *e, break; } case e_cmp: - if (e->flag == cmp_or || get_cmp(e) == cmp_filter) { + if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) { exps_find_conflicts(sql, e->l, aexps, conflicts); exps_find_conflicts(sql, e->r, aexps, conflicts); } else if (e->flag == cmp_in || e->flag == cmp_notin) { @@ -8303,6 +8303,8 @@ rel_find_conflicts(mvc *sql, sql_rel *re switch(rel->op) { case op_basetable: case op_table: + if (rel->op == op_basetable && rel->l) + exps_find_conflicts(sql, rel->exps, exps, conflicts); exps_mark_conflicts(sql, rel->exps, conflicts, 1); return rel; case op_topn: _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list