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]

Reply via email to