Changeset: 741e2fcf7992 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/741e2fcf7992
Modified Files:
        gdk/gdk_utils.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_basetable.c
        sql/server/rel_distribute.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimize_others.c
        sql/server/rel_optimize_proj.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_optimizer.c
        sql/server/rel_prop.c
        sql/server/rel_prop.h
        sql/server/rel_propagate.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_rewriter.c
        sql/server/rel_rewriter.h
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_statistics.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
        sql/server/sql_atom.c
        sql/server/sql_atom.h
        sql/server/sql_var.c
Branch: resource_management
Log Message:

wip free in sql layer


diffs (truncated from 1679 to 300 lines):

diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2098,7 +2098,6 @@ typedef struct freed_t {
 static void
 sa_free_obj(allocator *pa, void *obj, size_t sz)
 {
-       assert(sz > 0);
        size_t i;
 
        char *obj_start = (char *) obj;
@@ -2169,6 +2168,7 @@ sa_use_freed_obj(allocator *pa, size_t s
                                pa->freelist = curr->n;
                        }
                        pa->freelist_hits += 1;
+                       pa->inuse += 1;
                        return curr;
                } else {
                        prev = curr;
@@ -2240,7 +2240,6 @@ static void *
 
 
 #undef sa_realloc
-#undef sa_alloc
 void *
 sa_realloc( allocator *sa, void *p, size_t sz, size_t oldsz )
 {
@@ -2315,6 +2314,7 @@ static void *
        return r;
 }
 
+#undef sa_alloc
 void *
 sa_alloc( allocator *sa, size_t sz )
 {
@@ -2380,7 +2380,6 @@ void sa_destroy( allocator *sa )
        if (sa->pa) {
                sa_reset(sa);
                sa_free_blk(sa->pa, sa->blks[0]);
-               sa_free_obj(sa->pa, sa, sizeof(allocator));
                return;
        }
        // root allocator
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -360,7 +360,7 @@ create_table_or_view(mvc *sql, char *sna
                        if (!r || !is_project(r->op) || !r->exps || 
list_length(r->exps) != 1 ||
                                exp_check_type(sql, &c->type, r, 
r->exps->h->data, type_equal) == NULL) {
                                if (r)
-                                       rel_destroy(r);
+                                       rel_destroy(sql, r);
                                sa_destroy(nsa);
                                sql->sa = osa;
                                if (strlen(sql->errstr) > 6 && sql->errstr[5] 
== '!')
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -699,7 +699,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                        resetMalBlk(c->curprg->def);
                        SQLremoveQueryFromCache(c);
                }
-               rel_destroy(rel);
+               rel_destroy(m, rel);
        }
        return RAcommit_statement(be, msg);
 }
@@ -932,7 +932,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
        }
        if (!msg && monet5_create_relational_function(m, mod, nme, rel, NULL, 
ops, 0) < 0)
                msg = createException(SQL, "RAstatement2", "%s", m->errstr);
-       rel_destroy(rel);
+       rel_destroy(m, rel);
        return RAstatement2_return(be, m, nlevels, gvars, gentries, msg);
 }
 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -4376,7 +4376,7 @@ stmt_func(backend *be, stmt *ops, const 
                goto bailout;
 
        if ((p = find_prop(rel->p, PROP_REMOTE)))
-               rel->p = prop_remove(rel->p, p);
+               rel->p = prop_remove(be->mvc->sa, rel->p, p);
        /* sql_processrelation may split projections, so make sure the topmost 
relation only contains references */
        rel = rel_project(be->mvc->sa, rel, rel_projections(be->mvc, rel, NULL, 
1, 1));
        if (!(rel = sql_processrelation(be->mvc, rel, 0, 0, 1, 1)))
diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -398,7 +398,7 @@ rel_base_add_columns( mvc *sql, sql_rel 
 
        r->exps = new_exp_list(sql->sa);
        if(!r->exps) {
-               rel_destroy(r);
+               rel_destroy(sql, r);
                return NULL;
        }
 
@@ -413,7 +413,7 @@ rel_base_add_columns( mvc *sql, sql_rel 
                sql_exp *e = exp_alias(sql, atname, c->base.name, tname, 
c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
 
                if (e == NULL) {
-                       rel_destroy(r);
+                       rel_destroy(sql, r);
                        return NULL;
                }
                e->nid = -(ba->basenr + i);
@@ -442,7 +442,7 @@ rewrite_basetable(mvc *sql, sql_rel *rel
 
                rel->exps = new_exp_list(sa);
                if(!rel->exps) {
-                       rel_destroy(rel);
+                       rel_destroy(sql, rel);
                        return NULL;
                }
 
@@ -462,7 +462,7 @@ rewrite_basetable(mvc *sql, sql_rel *rel
                        sql_exp *e = exp_alias(sql, atname, c->base.name, 
tname, c->base.name, &c->type, CARD_MULTI, c->null, is_column_unique(c), 0);
 
                        if (e == NULL) {
-                               rel_destroy(rel);
+                               rel_destroy(sql, rel);
                                return NULL;
                        }
                        e->nid = -(ba->basenr + i);
@@ -481,7 +481,7 @@ rewrite_basetable(mvc *sql, sql_rel *rel
                if (rel_base_is_used(ba, i) || list_empty(rel->exps)) { /* Add 
TID column if no column is used */
                        sql_exp *e = exp_alias(sql, atname, TID, tname, TID, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 1, 1);
                        if (e == NULL) {
-                               rel_destroy(rel);
+                               rel_destroy(sql, rel);
                                return NULL;
                        }
                        e->nid = -(ba->basenr + i);
@@ -515,7 +515,7 @@ rewrite_basetable(mvc *sql, sql_rel *rel
                        unique = list_length(i->columns) == 1 && 
is_column_unique(((sql_kc*)i->columns->h->data)->c);
                        e = exp_alias(sql, atname, iname, tname, iname, t, 
CARD_MULTI, has_nils, unique, 1);
                        if (e == NULL) {
-                               rel_destroy(rel);
+                               rel_destroy(sql, rel);
                                return NULL;
                        }
                        /* index names are prefixed, to make them independent */
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -209,7 +209,7 @@ replica_rewrite(visitor *v, sql_table *t
                                /* if we resolved the replica to a local table 
we have to
                                 * go and remove the remote property from the 
subtree */
                                sql_rel *r = ((rps*)v->data)->orig;
-                               r->p = prop_remove(r->p, rp);
+                               r->p = prop_remove(v->sql->sa, r->p, rp);
                                break;
                        }
                }
@@ -232,7 +232,7 @@ eliminate_remote_or_replica_refs(visitor
        if (rel_is_ref(*rel) && !((*rel)->flag&MERGE_LEFT)) {
                if (has_remote_or_replica(*rel)) {
                        sql_rel *nrel = rel_copy(v->sql, *rel, 1);
-                       rel_destroy(*rel);
+                       rel_destroy(v->sql, *rel);
                        *rel = nrel;
                        return true;
                } else {
@@ -286,7 +286,7 @@ rel_rewrite_replica_(visitor *v, sql_rel
                                return rel;
 
                        sql_rel *r = replica_rewrite(v, t, rel->exps);
-                       rel_destroy(rel);
+                       rel_destroy(v->sql, rel);
                        rel = r;
                }
        }
@@ -390,7 +390,7 @@ rel_rewrite_remote_(visitor *v, sql_rel 
        case op_table:
                if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION) {
                        if (l && (p = find_prop(l->p, PROP_REMOTE)) != NULL) {
-                               l->p = prop_remove(l->p, p);
+                               l->p = prop_remove(v->sql->sa, l->p, p);
                                if (!find_prop(rel->p, PROP_REMOTE)) {
                                        p->p = rel->p;
                                        rel->p = p;
@@ -425,8 +425,8 @@ rel_rewrite_remote_(visitor *v, sql_rel 
 
                        /* if there are common uris pull the REMOTE prop with 
the common uris up */
                        if (!list_empty(uris)) {
-                               l->p = prop_remove(l->p, pl);
-                               r->p = prop_remove(r->p, pr);
+                               l->p = prop_remove(v->sql->sa, l->p, pl);
+                               r->p = prop_remove(v->sql->sa, r->p, pr);
                                if (!find_prop(rel->p, PROP_REMOTE)) {
                                        /* remove local tid ONLY if no subtree 
has local parts */
                                        if (pl->id == 0 || pr->id == 0)
@@ -453,7 +453,7 @@ rel_rewrite_remote_(visitor *v, sql_rel 
        case op_truncate:
                /* if the subtree has the REMOTE property just pull it up */
                if (l && (p = find_prop(l->p, PROP_REMOTE)) != NULL) {
-                       l->p = prop_remove(l->p, p);
+                       l->p = prop_remove(v->sql->sa, l->p, p);
                        if (!find_prop(rel->p, PROP_REMOTE)) {
                                p->p = rel->p;
                                rel->p = p;
@@ -463,7 +463,7 @@ rel_rewrite_remote_(visitor *v, sql_rel 
        case op_ddl:
                if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq /*|| rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view*/) {
                        if (l && (p = find_prop(l->p, PROP_REMOTE)) != NULL) {
-                               l->p = prop_remove(l->p, p);
+                               l->p = prop_remove(v->sql->sa, l->p, p);
                                if (!find_prop(rel->p, PROP_REMOTE)) {
                                        p->p = rel->p;
                                        rel->p = p;
@@ -477,8 +477,8 @@ rel_rewrite_remote_(visitor *v, sql_rel 
 
                                /* if there are common uris pull the REMOTE 
prop with the common uris up */
                                if (!list_empty(uris)) {
-                                       l->p = prop_remove(l->p, pl);
-                                       r->p = prop_remove(r->p, pr);
+                                       l->p = prop_remove(v->sql->sa, l->p, 
pl);
+                                       r->p = prop_remove(v->sql->sa, r->p, 
pr);
                                        if (!find_prop(rel->p, PROP_REMOTE)) {
                                                /* remove local tid ONLY if no 
subtree has local parts */
                                                if (pl->id == 0 || pr->id == 0)
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
@@ -3900,3 +3900,67 @@ list_find_exp( list *exps, sql_exp *e)
                return NULL;
        return exps_bind_nid(exps, e->nid);
 }
+
+void
+free_exps_list(allocator *sa, list *exps)
+{
+       if (!list_empty(exps))
+               for (node *n=exps->h; n ; n=n->next) {
+                       free_exp(sa, n->data);
+                       n->data = NULL;
+               }
+}
+
+
+static void
+_free_exp_internal(allocator *sa, sql_exp *e)
+{
+       if (!e)
+               return;
+       if (e->p) {
+               // free_props(sa, e->p);
+               e->p = NULL;
+       }
+       // reset
+       *e = (sql_exp) {};
+       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)
+{
+       if (!e)
+               return;
+       switch(e->type) {
+               case e_atom:
+                       return _free_exp_atom(sa, e);
+               case e_column:
+               case e_cmp:
+               case e_func:
+               case e_aggr:
+               case e_convert:
+               case e_psm:
+       }
+}
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -228,5 +228,7 @@ extern int rel_set_type_param(mvc *sql, 
 extern sql_exp *exp_convert_inplace(mvc *sql, sql_subtype *t, sql_exp *exp);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to