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