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

Don't leak relations refcounts


diffs (138 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
@@ -1675,8 +1675,7 @@ check_projection_on_foreignside(sql_rel 
 static sql_rel *
 rel_simplify_project_fk_join(mvc *sql, sql_rel *r, list *pexps, list 
*orderexps, int *changes)
 {
-       sql_rel *rl = r->l;
-       sql_rel *rr = r->r;
+       sql_rel *rl = r->l, *rr = r->r, *nr = NULL;
        sql_exp *je, *le, *nje, *re;
        int fk_left = 1;
 
@@ -1695,16 +1694,6 @@ rel_simplify_project_fk_join(mvc *sql, s
        }
 
        (void)sql;
-#if 0
-       if (fk_left && is_join(rl->op) && !rel_is_ref(rl)) {
-               rl = rel_simplify_project_fk_join(sql, rl, pexps, changes);
-               r->l = rl;
-       }
-       if (!fk_left && is_join(rr->op) && !rel_is_ref(rr)) {
-               rr = rel_simplify_project_fk_join(sql, rr, pexps, changes);
-               r->r = rr;
-       }
-#endif
        /* primary side must be a full table */
        if ((fk_left && (!is_left(r->op) && !is_full(r->op)) && 
!is_basetable(rr->op)) ||
                (!fk_left && (!is_right(r->op) && !is_full(r->op)) && 
!is_basetable(rl->op)))
@@ -1722,22 +1711,38 @@ rel_simplify_project_fk_join(mvc *sql, s
 
        (*changes)++;
        /* 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)))
-               return fk_left ? r->l : r->r;
+       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;
+               } else {
+                       nr = r->r;
+                       r->r = NULL;
+               }
+               rel_destroy(r);
+               return nr;
+       }
 
        /* remove NULL values, ie generate a select not null */
        nje = exp_compare(sql->sa, exp_ref(sql, le), exp_atom(sql->sa, 
atom_general(sql->sa, exp_subtype(le), NULL)), cmp_equal);
        set_anti(nje);
        set_has_no_nil(nje);
        set_semantics(nje);
-       return rel_select(sql->sa, fk_left ? r->l : r->r, nje);
+       if (fk_left) {
+               nr = r->l;
+               r->l = NULL;
+       } else {
+               nr = r->r;
+               r->r = NULL;
+       }
+       rel_destroy(r);
+       return rel_select(sql->sa, nr, nje);
 }
 
 static sql_rel *
 rel_simplify_count_fk_join(mvc *sql, sql_rel *r, list *gexps, list *gcols, int 
*changes)
 {
-       sql_rel *rl = r->l;
-       sql_rel *rr = r->r;
+       sql_rel *rl = r->l, *rr = r->r, *nr = NULL;
        sql_exp *je, *le, *nje, *re, *oce;
        int fk_left = 1;
 
@@ -1785,15 +1790,32 @@ rel_simplify_count_fk_join(mvc *sql, sql
 
        (*changes)++;
        /* 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)))
-               return fk_left ? r->l : r->r;
+       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;
+               } else {
+                       nr = r->r;
+                       r->r = NULL;
+               }
+               rel_destroy(r);
+               return nr;
+       }
 
        /* remove NULL values, ie generate a select not null */
        nje = exp_compare(sql->sa, exp_ref(sql, le), exp_atom(sql->sa, 
atom_general(sql->sa, exp_subtype(le), NULL)), cmp_equal);
        set_anti(nje);
        set_has_no_nil(nje);
        set_semantics(nje);
-       return rel_select(sql->sa, fk_left ? r->l : r->r, nje);
+       if (fk_left) {
+               nr = r->l;
+               r->l = NULL;
+       } else {
+               nr = r->r;
+               r->r = NULL;
+       }
+       rel_destroy(r);
+       return rel_select(sql->sa, nr, nje);
 }
 
 /*
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -630,6 +630,7 @@ rel_generate_subdeletes(mvc *sql, sql_re
                }
                (*changes)++;
        }
+       rel_destroy(rel);
        return sel;
 }
 
@@ -682,7 +683,7 @@ rel_generate_subupdates(mvc *sql, sql_re
                }
                (*changes)++;
        }
-
+       rel_destroy(rel);
        return sel;
 }
 
@@ -874,6 +875,7 @@ rel_generate_subinserts(sql_query *query
                sql_exp *exception = exp_exception(sql->sa, aggr, buf);
                sel = rel_exception(query->sql->sa, sel, anti_rel, 
list_append(new_exp_list(query->sql->sa), exception));
        }
+       rel_destroy(rel);
        return sel;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to