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

Reply via email to