Changeset: 0d785ccbb375 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0d785ccbb375
Modified Files:
        sql/server/rel_optimizer.c
Branch: default
Log Message:

properly use reference counted tree/dag manipulation


diffs (133 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
@@ -114,6 +114,7 @@ static void
 get_relations(visitor *v, sql_rel *rel, list *rels)
 {
        if (!rel_is_ref(rel) && rel->op == op_join && rel->exps == NULL) {
+               assert(list_empty(rel->attr));
                sql_rel *l = rel->l;
                sql_rel *r = rel->r;
 
@@ -1019,8 +1020,7 @@ rel_join_order(visitor *v, sql_rel *rel)
                break;
        }
        if (is_join(rel->op) && rel->exps && !rel_is_ref(rel)) {
-               if (rel && !rel_is_ref(rel))
-                       rel = reorder_join(v, rel);
+               rel = reorder_join(v, rel);
        } else if (is_join(rel->op)) {
                rel->l = rel_join_order(v, rel->l);
                rel->r = rel_join_order(v, rel->r);
@@ -1476,13 +1476,10 @@ rel_simplify_project_fk_join(mvc *sql, s
        /* if the foreign key column doesn't have NULL values, then return it */
        if (!has_nil(le) || is_full(r->op) || (fk_left && is_left(r->op)) || 
(!fk_left && is_right(r->op))) {
                if (fk_left) {
-                       nr = r->l;
-                       r->l = NULL;
+                       nr = rel_dup(r->l);
                } else {
-                       nr = r->r;
-                       r->r = NULL;
-               }
-               rel_destroy(r);
+                       nr = rel_dup(r->r);
+               }
                return nr;
        }
 
@@ -1492,13 +1489,10 @@ rel_simplify_project_fk_join(mvc *sql, s
        set_has_no_nil(nje);
        set_semantics(nje);
        if (fk_left) {
-               nr = r->l;
-               r->l = NULL;
+               nr = rel_dup(r->l);
        } else {
-               nr = r->r;
-               r->r = NULL;
-       }
-       rel_destroy(r);
+               nr = rel_dup(r->r);
+       }
        return rel_select(sql->sa, nr, nje);
 }
 
@@ -1533,12 +1527,14 @@ rel_simplify_count_fk_join(mvc *sql, sql
                return r;
 
        if (fk_left && is_join(rl->op) && !rel_is_ref(rl)) {
-               rl = rel_simplify_count_fk_join(sql, rl, gexps, gcols, changes);
-               r->l = rl;
+               r->l = rel_simplify_count_fk_join(sql, rl, gexps, gcols, 
changes);
+               if (rl != r->l)
+                       rel_destroy(rl);
        }
        if (!fk_left && is_join(rr->op) && !rel_is_ref(rr)) {
-               rr = rel_simplify_count_fk_join(sql, rr, gexps, gcols, changes);
-               r->r = rr;
+               r->r = rel_simplify_count_fk_join(sql, rr, gexps, gcols, 
changes);
+               if (rr != r->r)
+                       rel_destroy(rr);
        }
 
        if (!check_projection_on_foreignside(r, gcols, fk_left))
@@ -1555,13 +1551,10 @@ rel_simplify_count_fk_join(mvc *sql, sql
        /* if the foreign key column doesn't have NULL values, then return it */
        if (!has_nil(le) || is_full(r->op) || (fk_left && is_left(r->op)) || 
(!fk_left && is_right(r->op))) {
                if (fk_left) {
-                       nr = r->l;
-                       r->l = NULL;
+                       nr = rel_dup(r->l);
                } else {
-                       nr = r->r;
-                       r->r = NULL;
-               }
-               rel_destroy(r);
+                       nr = rel_dup(r->r);
+               }
                return nr;
        }
 
@@ -1571,13 +1564,10 @@ rel_simplify_count_fk_join(mvc *sql, sql
        set_has_no_nil(nje);
        set_semantics(nje);
        if (fk_left) {
-               nr = r->l;
-               r->l = NULL;
+               nr = rel_dup(r->l);
        } else {
-               nr = r->r;
-               r->r = NULL;
-       }
-       rel_destroy(r);
+               nr = rel_dup(r->r);
+       }
        return rel_select(sql->sa, nr, nje);
 }
 
@@ -1601,6 +1591,7 @@ rel_simplify_fk_joins(visitor *v, sql_re
                r = rel_simplify_project_fk_join(v->sql, r, rel->exps, rel->r, 
&v->changes);
                if (r == or)
                        return rel;
+               rel_destroy(rel->l);
                rel->l = r;
        }
 
@@ -1619,6 +1610,7 @@ rel_simplify_fk_joins(visitor *v, sql_re
                r = rel_simplify_count_fk_join(v->sql, r, rel->exps, rel->r, 
&v->changes);
                if (r == or)
                        return rel;
+               rel_destroy(rel->l);
                rel->l = r;
        }
        return rel;
@@ -9766,7 +9758,7 @@ rel_setjoins_2_joingroupby(visitor *v, s
                                }
                        }
                }
-               if (needed && rel->op == op_join) {
+               if (needed && rel->op == op_join && list_empty(rel->attr)) {
                        rel->op = (me->flag == mark_in)?op_semi:op_anti;
                        return rel;
                }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to