Changeset: cba704276ac9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cba704276ac9
Modified Files:
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_scenario.c
        sql/server/rel_bin.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/sql_rel2bin.c
        sql/server/sql_semantic.c
        sql/server/sql_statement.c
        sql/server/sql_statement.h
Branch: Aug2011
Log Message:

fix problem with large 'allocators'.
We now store the 'relational' tree in its own
allocator. This is cleaned up after converting it into
the binary tree.


diffs (truncated from 394 to 300 lines):

diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -1568,10 +1568,15 @@ sql_symbol2stmt(mvc *c, symbol *sym)
        stmt *s = NULL;
        int status;
        sql_rel *r;
-
+       sql_allocator *osa = c->sa, *nsa;
+
+       nsa = c->sa = sa_create();
        status = c->session->status;
        r = rel_semantic(c, sym);
+
        if (!r) {
+               c->sa = osa;
+               sa_destroy(nsa);
                if (c->errstr[0]) {
                        return NULL;
                } else {
@@ -1587,12 +1592,14 @@ sql_symbol2stmt(mvc *c, symbol *sym)
                if (!pq)
                        pq = rel_need_distinct_query(r);
 
+               c->sa = osa;
                if (c->emode == m_plan) {
                        rel_print(c, r, 0);
                } else {
                        s = output_rel_bin(c, r);
                }
                rel_destroy(r);
+               sa_destroy(nsa);
                if (s) {
                        /* only needed for delta tables */
                        s = rel2bin(c, s);      
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -1271,9 +1271,7 @@ SQLparser(Client c)
                        m->emode = m_inplace;
                scanner_query_processed(&(m->scanner));
        } else {
-               stmt *s;
-
-               s = sql_symbol2stmt(m, m->sym);
+               stmt *s = sql_symbol2stmt(m, m->sym);
 
                if (s==0 || (err = mvc_status(m) && m->type != Q_TRANS)) {
                        msg = createException(PARSE, "SQLparser", "%s", 
m->errstr);
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -288,7 +288,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
                sql_subtype *to = tps->h->next->data;
                if (!l) 
                        return NULL;
-               s = stmt_convert(sql->sa, l, from, to, 0);
+               s = stmt_convert(sql->sa, l, from, to);
        }       break;
        case e_func: {
                node *en;
@@ -3088,14 +3088,17 @@ rel2bin_update( mvc *sql, sql_rel *rel, 
        }
 
 /* before */
-       if (!sql_update_triggers(sql, t, l, 0)) 
+       if (!sql_update_triggers(sql, t, l, 0)) {
+               _DELETE(updates);
                return sql_error(sql, 02, "UPDATE: triggers failed for table 
'%s'", t->base.name);
+       }
 
 /* apply updates */
        list_merge(l, idx_updates, NULL);
        for (i = 0; i < nr_cols; i++) 
                if (updates[i])
                        list_append(l, updates[i]);
+       _DELETE(updates);
 
 /* after */
        if (!sql_update_triggers(sql, t, l, 1)) 
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -29,6 +29,9 @@
 #include "rel_updates.h"
 #include "sql_env.h"
 
+#define new_func_list(sa) list_new(sa)
+#define new_col_list(sa) list_new(sa)
+
 typedef struct global_props {
        int cnt[MAXOPS];
 } global_props;
@@ -196,10 +199,10 @@ exp_uses_exp( list *exps, sql_exp *e)
 }
 
 static int
-join_properties(sql_rel *rel) 
+join_properties(mvc *sql, sql_rel *rel) 
 {
        if (rel->exps) {
-               list *join_cols = list_create(NULL);
+               list *join_cols = new_col_list(sql->sa);
                node *en;
 
                /* simply using the expressions should also work ! */
@@ -216,7 +219,6 @@ join_properties(sql_rel *rel)
                                }
                        }
                }
-               list_destroy(join_cols);
        }
        return 0;
 }
@@ -265,7 +267,7 @@ rel_properties(mvc *sql, global_props *g
                rel->p = prop_create(sql->sa, PROP_COUNT, rel->p);
                break;
        case op_join: 
-               join_properties(rel);
+               join_properties(sql, rel);
                break;
        case op_left: 
        case op_right: 
@@ -580,7 +582,7 @@ exp_joins_rels(sql_exp *e, list *rels)
 }
 
 static list *
-matching_joins(list *rels, list *exps, sql_exp *je) 
+matching_joins(sql_allocator *sa, list *rels, list *exps, sql_exp *je) 
 {
        sql_rel *l, *r;
 
@@ -590,15 +592,14 @@ matching_joins(list *rels, list *exps, s
        r = find_rel(rels, je->r);
        if (l && r) {
                list *res;
-               list *n_rels = list_create(NULL);       
+               list *n_rels = new_rel_list(sa);        
 
                append(n_rels, l);
                append(n_rels, r);
                res = list_select(exps, n_rels, (fcmp) &exp_joins_rels, 
(fdup)NULL);
-               list_destroy(n_rels);
                return res; 
        }
-       return list_create(NULL);
+       return new_rel_list(sa);
 }
 
 static int
@@ -708,7 +709,7 @@ find_fk(sql_allocator *sa, list *rels, l
 
                if (!find_prop(je->p, PROP_JOINIDX)) {
                        int swapped = 0;
-                       list *aaje = matching_joins(rels, aje, je);
+                       list *aaje = matching_joins(sa, rels, aje, je);
                        list *eje = list_select(aaje, (void*)1, (fcmp) 
&exp_is_eqjoin, (fdup)NULL);
                        sql_rel *lr = find_rel(rels, le);
                        sql_rel *rr = find_rel(rels, re);
@@ -772,7 +773,7 @@ order_joins(mvc *sql, list *rels, list *
        sql_rel *top = NULL, *l = NULL, *r = NULL;
        sql_exp *cje;
        node *djn;
-       list *sdje, *n_rels = list_create(NULL);
+       list *sdje, *n_rels = new_rel_list(sql->sa);
        int fnd = 0;
 
        /* find foreign keys and reorder the expressions on reducing quality */
@@ -875,7 +876,6 @@ order_joins(mvc *sql, list *rels, list *
                        }
                }
        }
-       list_destroy(n_rels);
        if (list_length(rels)) { /* more relations */
                node *n;
                for(n=rels->h; n; n = n->next) {
@@ -982,11 +982,10 @@ reorder_join(mvc *sql, sql_rel *rel)
        list *exps = rel->exps;
        list *rels;
 
-       (void)sql;
        if (!exps) /* crosstable, ie order not important */
                return rel;
        rel->exps = NULL; /* should be all crosstables by now */
-       rels = list_create(NULL);
+       rels = new_rel_list(sql->sa);
        if (is_outerjoin(rel->op)) {
                int cnt = 0;
                /* try to use an join index also for outer joins */
@@ -1007,7 +1006,6 @@ reorder_join(mvc *sql, sql_rel *rel)
                        exps = NULL;
                }
        }
-       list_destroy(rels);
        return rel;
 }
 
@@ -1682,7 +1680,7 @@ rel_merge_projects(int *changes, mvc *sq
 static sql_subfunc *
 find_func( mvc *sql, char *name, list *exps )
 {
-       list * l = list_create(NULL); 
+       list * l = new_func_list(sql->sa); 
        node *n;
 
        for(n = exps->h; n; n = n->next)
@@ -4593,7 +4591,7 @@ rel_semijoin_use_fk(int *changes, mvc *s
        (void)changes;
        if (is_semi(rel->op) && rel->exps) {
                list *exps = rel->exps;
-               list *rels = rels = list_create(NULL);
+               list *rels = rels = new_rel_list(sql->sa);
 
                rel->exps = NULL;
                append(rels, rel->l);
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
@@ -302,9 +302,9 @@ rel_bind_path_(sql_rel *rel, sql_exp *e,
 }
 
 static list *
-rel_bind_path(sql_rel *rel, sql_exp *e )
+rel_bind_path(sql_allocator *sa, sql_rel *rel, sql_exp *e )
 {
-       list *path = new_rel_list();
+       list *path = new_rel_list(sa);
 
        if (e->type == e_convert)
                e = e->l;
@@ -312,7 +312,6 @@ rel_bind_path(sql_rel *rel, sql_exp *e )
                if (rel) {
                        if (!rel_bind_path_(rel, e, path)) {
                                /* something is wrong */
-                               list_destroy(path);
                                return NULL;
                        }
                }
@@ -330,7 +329,7 @@ rel_projections(mvc *sql, sql_rel *rel, 
        list *rexps, *exps ;
 
        if (is_subquery(rel) && is_project(rel->op))
-               return list_create(NULL);
+               return new_exp_list(sql->sa);
 
        switch(rel->op) {
        case op_join:
@@ -897,7 +896,7 @@ static char * rel_get_name( sql_rel *rel
 sql_rel *
 rel_push_select(sql_allocator *sa, sql_rel *rel, sql_exp *ls, sql_exp *e)
 {
-       list *l = rel_bind_path(rel, ls);
+       list *l = rel_bind_path(sa, rel, ls);
        node *n;
        sql_rel *lrel = NULL, *p = NULL;
 
@@ -959,18 +958,13 @@ rel_push_select(sql_allocator *sa, sql_r
 sql_rel *
 rel_push_join(sql_allocator *sa, sql_rel *rel, sql_exp *ls, sql_exp *rs, 
sql_exp *e)
 {
-       list *l = rel_bind_path(rel, ls);
-       list *r = rel_bind_path(rel, rs);
+       list *l = rel_bind_path(sa, rel, ls);
+       list *r = rel_bind_path(sa, rel, rs);
        node *ln, *rn;
        sql_rel *lrel = NULL, *rrel = NULL, *p = NULL;
 
-       if (!l || !r) {
-               if (l)
-                       list_destroy(l);
-               if (r)
-                       list_destroy(r);
+       if (!l || !r) 
                return NULL;
-       }
 
        p = rel;
        for (ln = l->h, rn = r->h; ln && rn; ln = ln->next, rn = rn->next ) {
@@ -995,8 +989,6 @@ rel_push_join(sql_allocator *sa, sql_rel
                        break;
                p = lrel;
        }
-       list_destroy(l);
-       list_destroy(r);
        if (!lrel || !rrel)
                return NULL;
 
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -71,7 +71,7 @@ extern sql_rel *rel_dup(sql_rel *r);
 extern sql_rel *rel_copy(sql_allocator *sa, sql_rel *r);
 extern void rel_destroy(sql_rel *rel);
 
-#define new_rel_list() list_create((fdestroy)NULL)
+#define new_rel_list(sa) list_new(sa)
 
 /* TODO shouldn't be needed (isn't save) ! */
 extern char * rel_name( sql_rel *r );
diff --git a/sql/server/sql_rel2bin.c b/sql/server/sql_rel2bin.c
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to