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

Reply via email to