Changeset: fe81757b42d8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/fe81757b42d8 Modified Files: sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_optimize_proj.c sql/server/rel_rel.c sql/server/rel_select.c Branch: resource_management Log Message:
staging progress diffs (228 lines): diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -120,7 +120,7 @@ exp_print(mvc *sql, stream *fout, sql_ex (void)sql; if (!e) return; - /*mnstr_printf(fout, "%p ", e);*/ + //mnstr_printf(fout, "%p ", e); if (mvc_debug_on(sql, 4) && e->alias.label < 0) mnstr_printf(fout, "%d: ", e->alias.label); switch(e->type) { diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -3926,27 +3926,6 @@ static void sa_free(sa, e); } -static void -_free_exp_atom(allocator *sa, sql_exp *e) -{ - if (!e || e->type != e_atom) - return; - - if (e->l) { - // free_atom(sa, e->l); - e->l = NULL; - } - //if (e->r) { - // ((sql_var_name*) e->r)->sname = NULL; - // ((sql_var_name*) e->r)->name = NULL; - // e->r = NULL; - //} - if (e->f) { - free_exps_list(sa, e->f); - e->f = NULL; - } - return _free_exp_internal(sa, e); -} void free_exp(allocator *sa, sql_exp *e) @@ -3955,14 +3934,50 @@ free_exp(allocator *sa, sql_exp *e) return; switch(e->type) { case e_atom: - return _free_exp_atom(sa, e); - case e_column: + if (e->f) { + free_exps_list(sa, e->f); + e->f = NULL; + } + break; case e_cmp: + if (e->l) + free_exp(sa, e->l); + if (e->r) + free_exp(sa, e->r); + if (e->f) + free_exp(sa, e->f); + break; case e_func: case e_aggr: + if (e->l) + free_exps_list(sa, e->l); + break; case e_convert: + if (e->l) + free_exp(sa, e->l); + break; case e_psm: - // TODO - ; + if ((e->flag & PSM_SET) && e->l) + free_exp(sa, e->l); + if ((e->flag & PSM_RETURN) && e->l) + free_exp(sa, e->l); + if (e->flag & PSM_WHILE) { + if (e->l) + free_exp(sa, e->l); + if (e->r) + free_exps_list(sa, e->r); + } + if (e->flag & PSM_IF) { + if (e->l) + free_exp(sa, e->l); + if (e->r) + free_exps_list(sa, e->r); + if (e->f) + free_exps_list(sa, e->f); + } + break; + case e_column: + break; } + _free_exp_internal(sa, e); } diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c --- a/sql/server/rel_optimize_proj.c +++ b/sql/server/rel_optimize_proj.c @@ -51,7 +51,7 @@ rel_used_projections(mvc *sql, list *exp return nexps; } -/* move projects down with the goal op removing them completely (ie push renames/reduced lists into basetable) +/* move projects down with the goal of removing them completely (ie push renames/reduced lists into basetable) * for some cases we can directly remove if renames rename into same alias * */ static sql_rel * @@ -382,7 +382,7 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel switch(e->type) { case e_column: assert(e->nid); - ne = exp_copy(sql, exps_bind_nid(f->exps, e->nid)); + ne = exps_bind_nid(f->exps, e->nid); if (!ne) return e; sql_exp *oe = e; @@ -393,7 +393,7 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel sql->session->status = 0; sql->errstr[0] = 0; if (exp_is_atom(ne)) - return ne; + return exp_copy(sql, ne); return oe; } ne = exp_ref(sql, e); @@ -468,7 +468,8 @@ rel_push_project_up_(visitor *v, sql_rel if (needed) { rel->exps = sa_list(v->sql->sa); node *n = exps->h; - list_append(rel->exps, n->data); + sql_exp *e_copy = exp_copy(v->sql, n->data); + list_append(rel->exps, e_copy); for(n = n->next; n; n = n->next) { sql_exp *e = n->data; if (e->type == e_column && !is_selfref(e)) { @@ -570,8 +571,8 @@ rel_push_project_up_(visitor *v, sql_rel } else if (e->type == e_column) { if (has_label(e)) return rel; - // sql_exp *e_copy = exp_copy(v->sql, e); - list_append(exps, e); + sql_exp *e_copy = exp_copy(v->sql, e); + list_append(exps, e_copy); } else { return rel; } diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -1727,7 +1727,8 @@ rel_or(mvc *sql, sql_rel *rel, sql_rel * /* favor or expressions over union */ if (l->op == r->op && is_select(l->op) && ll == rl && ll == rel && !rel_is_ref(l) && !rel_is_ref(r)) { - sql_exp *e = exp_or(sql->sa, l->exps, r->exps, 0); + // need a copy of r->exps, r will be destroyed + sql_exp *e = exp_or(sql->sa, l->exps, exps_copy(sql, r->exps), 0); list *nl = new_exp_list(sql->sa); rel_destroy(sql, r); @@ -1737,7 +1738,10 @@ rel_or(mvc *sql, sql_rel *rel, sql_rel * /* merge and expressions */ ll = l->l; while (ll && is_select(ll->op) && !rel_is_ref(ll)) { - list_merge(l->exps, ll->exps, (fdup)NULL); + // need a copy of ll->exps, ll will be destroyed + // FIX version of list_merge with allocator + // now we loop twice over ll->exps + list_merge(l->exps, exps_copy(sql, ll->exps), (fdup)NULL); l->l = ll->l; ll->l = NULL; rel_destroy(sql, ll); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -5678,12 +5678,12 @@ join_on_column_name(sql_query *query, sq } exp_setname(sql, le, rname, name); set_not_unique(le); - append(outexps, le); + append(outexps, exp_copy(sql, le)); } else { if (l_nil) set_has_nil(le); set_not_unique(le); - append(outexps, le); + append(outexps, exp_copy(sql, le)); } } if (!found) @@ -5693,7 +5693,7 @@ join_on_column_name(sql_query *query, sq if (r_nil) set_has_nil(re); set_not_unique(re); - append(outexps, re); + append(outexps, exp_copy(sql, re)); } rel = rel_project(sql->sa, rel, outexps); return rel; @@ -6188,7 +6188,7 @@ rel_joinquery_(sql_query *query, symbol return NULL; } exp_setname(sql, ls, rnme, nm); - append(outexps, ls); + append(outexps, exp_copy(sql, ls)); if (!rel) return NULL; } @@ -6208,7 +6208,7 @@ rel_joinquery_(sql_query *query, symbol if (l_nil) set_has_nil(ls); set_not_unique(ls); - append(outexps, ls); + append(outexps, exp_copy(sql, ls)); } } exps = rel_projections(sql, t2, NULL, 1, 1); @@ -6227,7 +6227,7 @@ rel_joinquery_(sql_query *query, symbol if (r_nil) set_has_nil(rs); set_not_unique(rs); - append(outexps, rs); + append(outexps, exp_copy(sql, rs)); } } rel = rel_project(sql->sa, rel, outexps); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org