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