Changeset: 9a8fba69d63a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a8fba69d63a
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_unnest.c
Branch: subquery
Log Message:
make sure we correct the join types in the general unnest (keep semi/anti on
the outer side) and the other join types (outer cases) on the inner side.
diffs (62 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
@@ -4714,16 +4714,18 @@ rel_uses_part_nr( sql_rel *rel, sql_exp
static int
rel_has_cmp_exp(sql_rel *rel, sql_exp *e)
{
- if (get_cmp(e) == cmp_or) {
- return rel_has_exp(rel, e->l) == 0 &&
- rel_has_all_exps(rel, e->r);
- } else if (e->flag == cmp_in || e->flag == cmp_notin || get_cmp(e) ==
cmp_filter) {
- return rel_has_all_exps(rel, e->l) &&
- rel_has_all_exps(rel, e->r);
- } else {
- return rel_has_exp(rel, e->l) == 0 &&
- rel_has_exp(rel, e->r) == 0 &&
- (!e->f || rel_has_exp(rel, e->f) == 0);
+ if (e->type == e_cmp) {
+ if (get_cmp(e) == cmp_or) {
+ return rel_has_exp(rel, e->l) == 0 &&
+ rel_has_all_exps(rel, e->r);
+ } else if (e->flag == cmp_in || e->flag == cmp_notin ||
get_cmp(e) == cmp_filter) {
+ return rel_has_all_exps(rel, e->l) &&
+ rel_has_all_exps(rel, e->r);
+ } else {
+ return rel_has_exp(rel, e->l) == 0 &&
+ rel_has_exp(rel, e->r) == 0 &&
+ (!e->f || rel_has_exp(rel, e->f) == 0);
+ }
}
return 0;
}
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
@@ -692,11 +692,9 @@ rel_general_unnest(mvc *sql, sql_rel *re
set_distinct(D);
r = rel_crossproduct(sql->sa, D, r, rel->op);
- if (is_semi(rel->op)) {
- if (rel->op == op_semi)
- r->op = op_join;
- move_join_exps(sql, rel, r);
- }
+ if (is_semi(rel->op)) /* keep semi/anti only on the outer side
*/
+ r->op = op_join;
+ move_join_exps(sql, rel, r);
set_dependent(r);
r = rel_project(sql->sa, r,
(is_semi(r->op))?sa_list(sql->sa):rel_projections(sql, r->r, NULL, 1, 1));
/* append ad + rename */
@@ -715,9 +713,9 @@ rel_general_unnest(mvc *sql, sql_rel *re
}
list_merge(r->exps, fd, (fdup)NULL);
rel->r = r;
+ if (rel->op == op_left) /* only needed once (inner side) */
+ rel->op = op_join;
reset_dependent(rel);
- //if (rel->op == op_left)
- rel->op = op_join;
return rel;
}
return rel;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list