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