Changeset: 2575938de631 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2575938de631
Modified Files:
sql/backends/monet5/sql_statement.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_select.c
sql/server/rel_statistics.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/server/sql_semantic.c
Branch: default
Log Message:
Merge with Dec2025 branch.
diffs (truncated from 2913 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -569,7 +569,7 @@ void ma_destroy(allocator *sa);
void ma_free(allocator *sa, void *);
exception_buffer *ma_get_eb(allocator *sa) __attribute__((__pure__));
allocator *ma_get_parent(const allocator *sa);
-void ma_info(const allocator *sa, char *buf, size_t buflen);
+int ma_info(const allocator *sa, char *buf, size_t buflen, const char *pref);
const char *ma_name(allocator *sa);
allocator_state ma_open(allocator *sa);
void *ma_realloc(allocator *sa, void *ptr, size_t sz, size_t osz);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1774,7 +1774,7 @@ gdk_export void ma_free(allocator *sa, v
gdk_export exception_buffer *ma_get_eb(allocator *sa)
__attribute__((__pure__));
-gdk_export void ma_info(const allocator *sa, char *buf, size_t buflen);
+gdk_export int ma_info(const allocator *sa, char *buf, size_t buflen, const
char *pref);
#define MA_NEW( sa, type ) ((type*)ma_alloc( sa,
sizeof(type)))
#define MA_ZNEW( sa, type ) ((type*)ma_zalloc( sa,
sizeof(type)))
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -741,6 +741,7 @@ BATgroup_internal(BAT **groups, BAT **ex
ALGOOPTBATPAR(e), ALGOOPTBATPAR(h),
subsorted ? "true" : "false", ALGOOPTBATPAR(gn),
ALGOOPTBATPAR(en), ALGOOPTBATPAR(hn), GDKusec() - t0);
+ ma_close(&ta_state);
return GDK_SUCCEED;
}
assert(!BATtdense(b));
@@ -801,6 +802,7 @@ BATgroup_internal(BAT **groups, BAT **ex
subsorted ? "true" : "false",
ALGOOPTBATPAR(gn), ALGOOPTBATPAR(en),
ALGOOPTBATPAR(hn), GDKusec() - t0);
+ ma_close(&ta_state);
return GDK_SUCCEED;
}
if ((extents == NULL || e != NULL) &&
@@ -841,6 +843,7 @@ BATgroup_internal(BAT **groups, BAT **ex
subsorted ? "true" : "false",
ALGOOPTBATPAR(gn), ALGOOPTBATPAR(en),
ALGOOPTBATPAR(hn), GDKusec() - t0);
+ ma_close(&ta_state);
return GDK_SUCCEED;
}
}
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -324,7 +324,7 @@ dump_threads(void)
struct mtthread *jn = t->joinwait;
const char *working = ATOMIC_PTR_GET(&t->working);
char mabuf[300];
- ma_info(t->ma, mabuf, sizeof(mabuf));
+ ma_info(t->ma, mabuf, sizeof(mabuf), ", allocator ");
int pos = snprintf(buf, sizeof(buf),
"%s, tid %zu, "
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1714,19 +1714,15 @@ typedef struct freed_t {
static inline size_t
ma_get_blk_idx(allocator *sa, void *blk, size_t offset)
{
- size_t i;
- for(i = offset; i < sa->nr; i++) {
+ for (size_t i = offset; i < sa->nr; i++) {
if (sa->blks[i] == blk)
- break;
+ return i;
}
- if (i >= sa->nr) {
- assert(0 && "allocator block not found");
- if (sa->eb.enabled) {
- eb_error(&sa->eb, "allocator block not found", 1000);
- }
-
+ assert(0 && "allocator block not found");
+ if (sa->eb.enabled) {
+ eb_error(&sa->eb, "allocator block not found", 1000);
}
- return i;
+ return sa->nr;
}
@@ -2082,7 +2078,7 @@ static void *
sa->used += sz;
}
if (sz < MA_BLOCK_SIZE) {
- // countig object only
+ // counting object only
sa->objects += 1;
sa->inuse += 1;
}
@@ -2348,22 +2344,30 @@ ma_get_parent(const allocator *a)
return a ? a->pa : NULL;
}
-void
-ma_info(const allocator *a, char *buf, size_t bufsize)
+int
+ma_info(const allocator *a, char *buf, size_t bufsize, const char *pref)
{
+ int pos = 0;
buf[0] = 0;
- if (a != NULL)
- snprintf(buf, bufsize,
- ", allocator %s, size %zu, nr %zu, used %zu%s"
- ", usedmem %zu%s, blk_size %zu, objects %zu"
- ", inuse %zu, free_obj_hits %zu, frees %zu"
- ", free_blk_hits %zu, tmp_used %zu, refcount %d",
- a->name, a->size, a->nr,
- a->used, humansize(a->used, (char[24]){0}, 24),
- a->usedmem, humansize(a->usedmem, (char[24]){0}, 24),
- a->blk_size, a->objects,
- a->inuse, a->free_obj_hits, a->frees,
- a->free_blk_hits, a->tmp_used, a->refcount);
+ if (a != NULL) {
+ pos = snprintf(buf, bufsize, "%s%s: used %zu%s, usedmem %zu%s",
+ 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 && (size_t) pos < bufsize)
+ pos += snprintf(buf + pos, bufsize - pos,
+ ", objects %zu", a->objects);
+ if (a->inuse > 0 && (size_t) pos < bufsize)
+ pos += snprintf(buf + pos, bufsize - pos,
+ ", inuse %zu", a->inuse);
+ 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 && (size_t) pos < bufsize)
+ pos += snprintf(buf + pos, bufsize - pos,
+ ", refcount %d", a->refcount);
+ }
+ return pos;
}
inline size_t
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);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]