Changeset: 0d3def14e585 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0d3def14e585
Modified Files:
        gdk/gdk_utils.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_statement.c
        sql/common/sql_list.c
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_optimize_proj.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_propagate.c
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/rel_statistics.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.y
        sql/server/sql_partition.c
        sql/server/sql_semantic.c
        sql/server/sqlparse.c
        tools/monetdbe/monetdbe.c
Branch: Dec2025
Log Message:

Get rid of SQL (mvc) temporary allocator, use thread-local allocator instead.


diffs (truncated from 2578 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
@@ -2351,20 +2351,19 @@ ma_info(const allocator *a, char *buf, s
        buf[0] = 0;
        if (a != NULL) {
                pos = snprintf(buf, bufsize, "%s%s: used %zu%s, usedmem %zu%s",
-                              pref ? pref : "",
-                              a->name,
+                              pref ? pref : "", a->name,
                               a->used, humansize(a->used, (char[24]){0}, 24),
                               a->usedmem, humansize(a->usedmem, (char[24]){0}, 
24));
-               if (a->objects > 0)
+               if (a->objects > 0 && (size_t) pos < bufsize)
                        pos += snprintf(buf + pos, bufsize - pos,
                                        ", objects %zu", a->objects);
-               if (a->inuse > 0)
+               if (a->inuse > 0 && (size_t) pos < bufsize)
                        pos += snprintf(buf + pos, bufsize - pos,
                                        ", inuse %zu", a->inuse);
-               if (a->tmp_used > 0)
+               if (a->tmp_used > 0 && (size_t) pos < bufsize)
                        pos += snprintf(buf + pos, bufsize - pos,
                                        ", tmp_used %zu", a->tmp_used);
-               if (a->refcount > 0)
+               if (a->refcount > 0 && (size_t) pos < bufsize)
                        pos += snprintf(buf + pos, bufsize - pos,
                                        ", refcount %d", a->refcount);
        }
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -7127,6 +7127,7 @@ check_for_foreign_key_references(mvc *sq
        struct tablelist* new_node;
        sql_trans *tr = sql->session->tr;
        sqlstore *store = sql->session->tr->store;
+       allocator *ta = MT_thread_getallocator();
 
        if (mvc_highwater(sql))
                return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
@@ -7164,7 +7165,7 @@ check_for_foreign_key_references(mvc *sq
                                                                        found = 
1;
                                                        }
                                                        if (!found) {
-                                                               if ((new_node = 
SA_NEW(sql->ta, struct tablelist)) == NULL) {
+                                                               if ((new_node = 
SA_NEW(ta, struct tablelist)) == NULL) {
                                                                        
list_destroy(keys);
                                                                        return 
sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                                }
@@ -7189,14 +7190,16 @@ check_for_foreign_key_references(mvc *sq
 static stmt *
 sql_truncate(backend *be, sql_table *t, int restart_sequences, int cascade)
 {
+       allocator *ta = MT_thread_getallocator();
+       allocator_state ta_state = ma_open(ta);
        mvc *sql = be->mvc;
        list *l = sa_list(sql->sa);
        stmt *ret = NULL, *other = NULL;
-       struct tablelist *new_list = SA_NEW(sql->ta, struct tablelist);
+       struct tablelist *new_list = SA_NEW(ta, struct tablelist);
        stmt **deleted_cols = NULL;
 
        if (!new_list)
-               return sql_error(sql, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               goto finalize;
        new_list->table = t;
        new_list->next = NULL;
        if (!check_for_foreign_key_references(sql, new_list, new_list, t, 
cascade))
@@ -7255,7 +7258,7 @@ sql_truncate(backend *be, sql_table *t, 
        }
 
 finalize:
-       ma_reset(sql->ta);
+       ma_close(&ta_state);
        return ret;
 }
 
@@ -7286,7 +7289,9 @@ rel2bin_truncate(backend *be, sql_rel *r
        return truncate;
 }
 
-static ValPtr take_atom_arg(node **n, int expected_type) {
+static ValPtr
+take_atom_arg(node **n, int expected_type)
+{
        sql_exp *e = (*n)->data;
        atom *a = e->l;
        assert(a->tpe.type->localtype == expected_type); (void) expected_type;
@@ -7848,6 +7853,8 @@ subrel_bin(backend *be, sql_rel *rel, li
 stmt *
 rel_bin(backend *be, sql_rel *rel)
 {
+       allocator *ta = MT_thread_getallocator();
+       allocator_state ta_state = ma_open(ta);
        mvc *sql = be->mvc;
        list *refs = sa_list(sql->sa);
        mapi_query_t sqltype = sql->type;
@@ -7857,6 +7864,7 @@ rel_bin(backend *be, sql_rel *rel)
        if (sqltype == Q_SCHEMA)
                sql->type = sqltype;  /* reset */
 
+       ma_close(&ta_state);
        if (be->mb->errors) {
                if (ma_get_eb(be->mvc->sa)->enabled)
                        eb_error(ma_get_eb(be->mvc->sa), be->mvc->errstr[0] ? 
be->mvc->errstr : be->mb->errors, 1000);
@@ -7868,6 +7876,8 @@ rel_bin(backend *be, sql_rel *rel)
 stmt *
 output_rel_bin(backend *be, sql_rel *rel, int top)
 {
+       allocator *ta = MT_thread_getallocator();
+       allocator_state ta_state = ma_open(ta);
        mvc *sql = be->mvc;
        list *refs = sa_list(sql->sa);
        mapi_query_t sqltype = sql->type;
@@ -7880,6 +7890,7 @@ output_rel_bin(backend *be, sql_rel *rel
        s = subrel_bin(be, rel, refs);
        s = subrel_project(be, s, refs, rel);
 
+       ma_close(&ta_state);
        if (!s)
                return NULL;
        if (sqltype == Q_SCHEMA)
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
@@ -171,8 +171,6 @@ sqlcleanup(backend *be, int err)
        /* some statements dynamically disable caching */
        be->mvc->sym = NULL;
        be->mvc->runs = NULL;
-       if (be->mvc->ta)
-               be->mvc->ta = ma_reset(be->mvc->ta);
        if (be->mvc->sa)
                be->mvc->sa = ma_reset(be->mvc->sa);
        if (err >0)
@@ -334,6 +332,7 @@ create_table_or_view(mvc *sql, char *sna
        osa = sql->sa;
        allocator *nsa = sql->sa = create_allocator(ma_get_parent(osa), 
"MA_mvc", false);
        /* first check default values */
+       allocator *ta = MT_thread_getallocator();
        for (n = ol_first_node(t->columns); n; n = n->next) {
                sql_column *c = n->data;
 
@@ -342,7 +341,7 @@ create_table_or_view(mvc *sql, char *sna
                        static const char next_value_for[] = "next value for 
\"sys\".\"seq_";
                        sql_rel *r = NULL;
 
-                       r = rel_parse(sql, s, sa_message(sql->ta, "select %s;", 
c->def), m_deps);
+                       r = rel_parse(sql, s, sa_message(ta, "select %s;", 
c->def), m_deps);
                        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)
@@ -1976,6 +1975,8 @@ mvc_clear_table_wrap(Client cntxt, MalBl
        if (restart_sequences) { /* restart the sequences if it's the case */
                sql_trans *tr = m->session->tr;
                static const char next_value_for[] = "next value for ";
+               allocator *ta = MT_thread_getallocator();
+               allocator_state ta_state = ma_open(ta);
 
                for (node *n = ol_first_node(t->columns); n; n = n->next) {
                        sql_column *col = n->data;
@@ -1985,7 +1986,7 @@ mvc_clear_table_wrap(Client cntxt, MalBl
                                sql_sequence *seq = NULL;
                                char *schema = NULL, *seq_name = NULL;
 
-                               extract_schema_and_sequence_name(m->ta, 
col->def + strlen(next_value_for), &schema, &seq_name);
+                               extract_schema_and_sequence_name(ta, col->def + 
strlen(next_value_for), &schema, &seq_name);
                                if (!schema || !seq_name || !(seqs = 
find_sql_schema(tr, schema)))
                                        continue;
 
@@ -1993,18 +1994,23 @@ mvc_clear_table_wrap(Client cntxt, MalBl
                                if ((seq = find_sql_sequence(tr, seqs, 
seq_name))) {
                                        switch (sql_trans_sequence_restart(tr, 
seq, seq->start)) {
                                                case -1:
+                                                       ma_close(&ta_state);
                                                        throw(SQL, 
"sql.clear_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                case -2:
                                                case -3:
+                                                       ma_close(&ta_state);
                                                        throw(SQL, 
"sql.clear_table", SQLSTATE(HY005) "RESTART SEQUENCE: transaction conflict 
detected");
                                                case -4:
-                                                       throw(SQL, 
"sql.clear_table", SQLSTATE(HY005) "Could not restart sequence %s.%s", 
seqs->base.name, seq_name);
+                                                       msg = 
createException(SQL, "sql.clear_table", SQLSTATE(HY005) "Could not restart 
sequence %s.%s", seqs->base.name, seq_name);
+                                                       ma_close(&ta_state);
+                                                       return msg;
                                                default:
                                                        break;
                                        }
                                }
                        }
                }
+               ma_close(&ta_state);
        }
        *res = (lng) clear_res;
        return MAL_SUCCEED;
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
@@ -140,6 +140,7 @@ SQLescapeString(str s)
 str
 SQLstatementIntern(Client c, const char *expr, const char *nme, bit execute, 
bit output, res_table **result)
 {
+       allocator_state ta_state = ma_open(MT_thread_getallocator());
        int status = 0, err = 0, oldvtop, oldstop = 1, inited = 0, ac, 
sizeframes, topframes;
        unsigned int label;
        mvc *o = NULL, *m = NULL;
@@ -160,6 +161,7 @@ SQLstatementIntern(Client c, const char 
                sql = (backend *) c->sqlcontext;
        }
        if (msg){
+               ma_close(&ta_state);
                throw(SQL, "sql.statement", SQLSTATE(HY002) "Catalogue not 
available");
        }
 
@@ -170,6 +172,7 @@ SQLstatementIntern(Client c, const char 
                if (inited) {
                        msg = SQLresetClient(c);
                }
+               ma_close(&ta_state);
                throw(SQL, "sql.statement", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        }
        *o = *m;
@@ -394,6 +397,7 @@ endofcompile:
        if (inited) {
                (void) SQLresetClient(c);
        }
+       ma_close(&ta_state);
        return msg;
 }
 
@@ -491,7 +495,7 @@ struct global_var_entry {
 } global_var_entry;
 
 static str
-RAstatement2_return(backend *be, mvc *m, int nlevels, struct global_var_entry 
*gvars, int gentries, str msg)
+RAstatement2_return(allocator_state *ta_state, backend *be, mvc *m, int 
nlevels, struct global_var_entry *gvars, int gentries, str msg)
 {
        while (nlevels) { /* clean added frames */
                stack_pop_frame(m);
@@ -501,7 +505,7 @@ RAstatement2_return(backend *be, mvc *m,
                struct global_var_entry gv = gvars[i];
                (void) remove_global_var(m, gv.s, gv.vname);
        }
-       ma_reset(m->ta);
+       ma_close(ta_state);
        return RAcommit_statement(be, msg);
 }
 
@@ -549,8 +553,10 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
                return msg;
        if (!m->sa)
                m->sa = create_allocator(m->pa, "MA_mvc", false);
+       allocator *ta = MT_thread_getallocator();
+       allocator_state ta_state = ma_open(ta);
        if (!m->sa)
-               return RAstatement2_return(be, m, nlevels, gvars, gentries, 
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
+               return RAstatement2_return(&ta_state, be, m, nlevels, gvars, 
gentries, createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
 
        ops = sa_list(m->sa);
        while (sig && *sig) {
@@ -586,24 +592,24 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
 
                if (!sql_find_subtype(&tpe, vtype, d, s)) {
                        if (!(t = mvc_bind_type(m, vtype))) /* try an external 
type */
-                               return RAstatement2_return(be, m, nlevels, 
gvars, gentries, createException(SQL,"RAstatement2",SQLSTATE(42000) "SQL type 
%s(%d, %d) not found\n", vtype, d, s));
+                               return RAstatement2_return(&ta_state, be, m, 
nlevels, gvars, gentries, createException(SQL,"RAstatement2",SQLSTATE(42000) 
"SQL type %s(%d, %d) not found\n", vtype, d, s));
                        sql_init_subtype(&tpe, t, d, s);
                }
 
                if (sch) {
                        assert(level == 0);
                        if (!(sh = mvc_bind_schema(m, sch)))
-                               return RAstatement2_return(be, m, nlevels, 
gvars, gentries, createException(SQL,"RAstatement2",SQLSTATE(3F000) "No such 
schema '%s'", sch));
+                               return RAstatement2_return(&ta_state, be, m, 
nlevels, gvars, gentries, createException(SQL,"RAstatement2",SQLSTATE(3F000) 
"No such schema '%s'", sch));
                        if (!find_global_var(m, sh, var)) { /* don't add the 
same global variable again */
                                if (!push_global_var(m, sch, var, &tpe)) /* if 
doesn't exist, add it, then remove it before returning */
-                                       return RAstatement2_return(be, m, 
nlevels, gvars, gentries, createException(SQL,"RAstatement2",SQLSTATE(HY013) 
MAL_MALLOC_FAIL));
+                                       return RAstatement2_return(&ta_state, 
be, m, nlevels, gvars, gentries, 
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
                                if (gentries == gcap) {
                                        if (gcap == 0) {
                                                gcap = 8;
-                                               gvars = SA_NEW_ARRAY(m->ta, 
struct global_var_entry, gcap);
+                                               gvars = SA_NEW_ARRAY(ta, struct 
global_var_entry, gcap);
                                        } else {
                                                int ngcap = gcap * 4;
-                                               gvars = SA_RENEW_ARRAY(m->ta, 
struct global_var_entry, gvars, ngcap, gcap);
+                                               gvars = SA_RENEW_ARRAY(ta, 
struct global_var_entry, gvars, ngcap, gcap);
                                                gcap = ngcap;
                                        }
                                        gvars[gentries++] = (struct 
global_var_entry) {.s = sh, .vname = var,};
@@ -616,12 +622,12 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
                        if (lentries == lcap) {
                                if (lcap == 0) {
                                        lcap = 8;
-                                       lkeys = SA_NEW_ARRAY(m->ta, int, lcap);
-                                       lvars = SA_NEW_ARRAY(m->ta, struct 
local_var_entry, lcap);
+                                       lkeys = SA_NEW_ARRAY(ta, int, lcap);
+                                       lvars = SA_NEW_ARRAY(ta, struct 
local_var_entry, lcap);
                                } else {
                                        int nlcap = lcap * 4;
-                                       lkeys = SA_RENEW_ARRAY(m->ta, int, 
lkeys, nlcap, lcap);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to