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 -- [email protected]
To unsubscribe send an email to [email protected]