Changeset: 0a97056b6c89 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0a97056b6c89
Modified Files:
sql/server/rel_exp.c
Branch: Oct2020
Log Message:
Set operations are projections, so don't search an expression recursively
further on one of these relations. Also don't do duplicate work
diffs (53 lines):
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1682,46 +1682,20 @@ rel_find_exp_and_corresponding_rel(sql_r
case op_right:
case op_full:
case op_join:
+ case op_semi:
+ case op_anti:
ne = rel_find_exp_and_corresponding_rel(rel->l, e, res,
under_join);
- if (!ne)
+ if (!ne && is_join(rel->op))
ne = rel_find_exp_and_corresponding_rel(rel->r,
e, res, under_join);
if (ne && under_join)
*under_join = true;
break;
case op_table:
- if (rel->exps && e->type == e_column && e->l &&
exps_bind_column2(rel->exps, e->l, e->r, NULL))
- ne = e;
- if (ne && res)
- *res = rel;
- break;
- case op_union:
- case op_except:
- case op_inter:
- {
- if (rel->l)
- ne = rel_find_exp_and_corresponding_rel(rel->l,
e, res, under_join);
- else if (rel->exps && e->l) {
- ne = exps_bind_column2(rel->exps, e->l, e->r,
NULL);
- if (ne && res)
- *res = rel;
- } else if (rel->exps) {
- ne = exps_bind_column(rel->exps, e->r, NULL,
NULL, 1);
- if (ne && res)
- *res = rel;
- }
- }
- break;
case op_basetable:
- if (rel->exps && e->type == e_column && e->l)
- ne = exps_bind_column2(rel->exps, e->l, e->r,
NULL);
- if (ne && res)
- *res = rel;
break;
default:
if (!is_project(rel->op) && rel->l)
ne = rel_find_exp_and_corresponding_rel(rel->l,
e, res, under_join);
- if (ne && (rel->op == op_semi || rel->op == op_anti) &&
under_join)
- *under_join = true;
}
}
return ne;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list