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]