Changeset: a85838f39336 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a85838f39336
Modified Files:
        gdk/gdk_utils.c
        sql/server/rel_exp.c
        sql/server/rel_rel.c
        sql/server/rel_unnest.c
Branch: resource_management
Log Message:

propagate exp_copy where needed


diffs (161 lines):

diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2080,10 +2080,11 @@ eb_error( exception_buffer *eb, char *ms
 #define SA_NUM_BLOCKS 64
 #define SA_BLOCK_SIZE (64*1024)
 #define SA_HEADER_SIZE 2*(sizeof(size_t))
+#define CANARY_VALUE ((size_t)0xDEADBEEFDEADBEEF)
 
 typedef struct freed_t {
+       size_t sz;
        struct freed_t *n;
-       size_t sz;
 } freed_t;
 
 //static void
@@ -2113,9 +2114,9 @@ sa_free_obj(allocator *pa, void *obj, si
        }
        assert (i < pa->nr);
        // put on the freelist
-       freed_t *f = obj;
+       freed_t *f = memset(obj, 0, sz);
+       f->sz = sz;
        f->n = pa->freelist;
-       f->sz = sz;
        pa->freelist = f;
        if (pa->inuse > 0)
                pa->inuse -= 1;
@@ -2145,8 +2146,8 @@ sa_free_blk(allocator *pa, void *blk)
                        pa->nr--;
                } else {
                        freed_t *f = blk;
+                       f->sz = sz;
                        f->n = pa->freelist_blks;
-                       f->sz = sz;
                        pa->freelist_blks = f;
                }
        }
@@ -2326,6 +2327,8 @@ sa_alloc( allocator *sa, size_t sz )
        if (r) {
                // store size in header
                *((size_t *) r) = nsize;
+               // store canary value to help us detect double free
+               *((size_t *) r + 1) = CANARY_VALUE;
                return r + SA_HEADER_SIZE;
        }
        return NULL;
@@ -2462,6 +2465,8 @@ sa_free(allocator *sa, void *obj)
        // retrieve size from header
        char* ptr = (char *) obj - SA_HEADER_SIZE;
        size_t sz = *((size_t *) ptr);
+       // double free check point
+       assert(*((size_t *) ptr + 1) == CANARY_VALUE);
        if (sz < SA_BLOCK_SIZE) {
                sa_free_obj(sa, ptr, sz);
        } else {
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
@@ -3239,7 +3239,10 @@ exp_copy(mvc *sql, sql_exp * e)
                } else if (e->flag & PSM_REL) {
                        if (!e->alias.label)
                                exp_label(sql->sa, e, ++sql->label);
-                       return exp_ref(sql, e);
+                       ne = exp_rel(sql, rel_dup(e->l));
+                       //if (!e->alias.label)
+                       //      exp_label(sql->sa, e, ++sql->label);
+                       //return exp_ref(sql, e);
                } else if (e->flag & PSM_EXCEPTION) {
                        ne = exp_exception(sql->sa, exp_copy(sql, e->l), (const 
char *) e->r);
                }
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
@@ -160,7 +160,7 @@ rel_destroy(mvc *sql, sql_rel *rel)
        if (!list_empty(rel->exps) && sql && (!rel->l) && (!rel->r)) {
                // perhaps separate allocator for exps
                // for later
-               //free_exps_list(sql->sa, rel->exps);
+               free_exps_list(sql->sa, rel->exps);
                rel->exps = NULL;
        }
 }
@@ -1359,7 +1359,7 @@ list *
                                if (basecol && !is_basecol(e))
                                        continue;
                                if (intern || !is_intern(e)) {
-                                       if (!e->alias.label)
+                                       if (!e->alias.label || (exp_is_rel(e) 
&& e->alias.name == NULL))
                                                en->data = e = 
exp_label(sql->sa, e, ++sql->label);
                                        sql_exp *ne = exp_ref(sql, e);
                                        if (settname && tname)
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1588,7 +1588,8 @@ push_up_munion(mvc *sql, sql_rel *rel, l
                        list *iu = s->l;
                        for(node *n = iu->h; n; n = n->next) {
                                sql_rel *sl = n->data;
-                               sl = rel_project(sql->sa, rel_dup(sl), 
rel_projections(sql, sl, NULL, 1, 1));
+                               list *exps = rel_projections(sql, sl, NULL, 1, 
1);
+                               sl = rel_project(sql->sa, rel_dup(sl), exps);
                                for (node *n = sl->exps->h, *m = s->exps->h; n 
&& m; n = n->next, m = m->next)
                                        exp_prop_alias(sql->sa, n->data, 
m->data);
                                list_hash_clear(sl->exps);
@@ -2950,7 +2951,8 @@ rewrite_rank(visitor *v, sql_rel *rel, s
                /* move rank down add ref */
                if (!exp_name(e))
                        e = exp_label(v->sql->sa, e, ++v->sql->label);
-               append(rell->exps, e);
+               sql_exp *e_copy = exp_copy(v->sql, e);
+               append(rell->exps, e_copy);
                e = exp_ref(v->sql, e);
                v->changes++;
        } else {
@@ -3041,9 +3043,9 @@ exp_in_project(mvc *sql, sql_exp **l, li
                if (rel_convert_types(sql, NULL, NULL, l, &r, 1, 
type_equal_no_any) < 0)
                        return NULL;
                if (anyequal)
-                       ne = rel_binop_(sql, NULL, *l, r, "sys", "=", 
card_value, true);
+                       ne = rel_binop_(sql, NULL, exp_copy(sql, *l), r, "sys", 
"=", card_value, true);
                else
-                       ne = rel_binop_(sql, NULL, *l, r, "sys", "<>", 
card_value, true);
+                       ne = rel_binop_(sql, NULL, exp_copy(sql, *l), r, "sys", 
"<>", card_value, true);
                if (!e) {
                        e = ne;
                } else if (anyequal) {
@@ -3415,7 +3417,9 @@ rewrite_compare(visitor *v, sql_rel *rel
                                if (rnull) { /* complex compare operator */
                                        sql_exp *lnull = rel_unop_(v->sql, rel, 
le, "sys", "isnull", card_value);
                                        set_has_no_nil(lnull);
-                                       le = exp_compare_func(v->sql, le, re, 
op, 0);
+                                       sql_exp * le_copy = exp_copy(v->sql, 
le);
+                                       sql_exp * re_copy = exp_copy(v->sql, 
re);
+                                       le = exp_compare_func(v->sql, le_copy, 
re_copy, op, 0);
                                        sql_subfunc *f = sql_bind_func3(v->sql, 
"sys", (quantifier==1)?"any":"all", exp_subtype(le), exp_subtype(lnull), 
exp_subtype(rnull), F_FUNC, true);
                                        le = exp_op3(v->sql->sa, le, lnull, 
rnull, f);
                                        if (is_select(rel->op) && depth == 0) {
@@ -4254,7 +4258,7 @@ flatten_values(visitor *v, sql_rel *rel)
                        nrel = rel_project(v->sql->sa, NULL, 
sa_list(v->sql->sa));
                        set_processed(nrel);
                        for(node *n = rel->exps->h; n; n = n->next) {
-                               sql_exp *e = exp_copy(v->sql, n->data);
+                               sql_exp *e = n->data;
                                list *vals = exp_get_values(e);
 
                                if (vals) {
@@ -4262,10 +4266,11 @@ flatten_values(visitor *v, sql_rel *rel)
                                                append(exps, exp_ref(v->sql, 
e));
                                        sql_exp *val = list_fetch(vals, i);
                                        exp_setalias(val, e->alias.label, 
exp_relname(e), exp_name(e));
-                                       append(nrel->exps, val);
-                                       rel_set_exps(nrel, nrel->exps);
+                                       sql_exp *e_copy = exp_copy(v->sql, val);
+                                       append(nrel->exps, e_copy);
                                }
                        }
+                       rel_set_exps(nrel, nrel->exps);
                        urs = append(urs, nrel);
                }
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to