Changeset: ddc27ec532e9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ddc27ec532e9
Modified Files:
        sql/storage/bat/bat_table.c
        sql/storage/store.c
Branch: Jul2021
Log Message:

Allocate memory for value on heap that may be deallocated in a parallel thread.


diffs (truncated from 399 to 300 lines):

diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -397,9 +397,13 @@ table_fetch_value(res_table *rt, sql_col
        BAT *b = (BAT*)rt->cols[c->colnr].p;
        BATiter bi = bat_iterator(b);
        assert(b->ttype && b->ttype != TYPE_msk);
-       void *p = BUNtail(bi, rt->cur_row);
+       const void *p = BUNtail(bi, rt->cur_row);
+       size_t sz = ATOMlen(bi.type, p);
+       void *r = GDKmalloc(sz);
+       if (r)
+               memcpy(r, p, sz);
        bat_iterator_end(&bi);
-       return p;
+       return r;
 }
 
 static void
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -271,6 +271,7 @@ load_keycolumn(sql_trans *tr, sql_key *k
 
        str v = (char*)store->table_api.table_fetch_value(rt_keycols, 
find_sql_column(objects, "name"));
        kc->c = find_sql_column(k->t, v);
+       GDKfree(v);
        list_append(k->columns, kc);
        assert(kc->c);
 }
@@ -283,12 +284,17 @@ load_key(sql_trans *tr, sql_table *t, re
        sql_table *objects = find_sql_table(tr, syss, "objects");
        sqlstore *store = tr->store;
 
-       key_type ktype = (key_type) *(int*) 
store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "type"));
+       void *p = store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "type"));
+       key_type ktype = (key_type) *(int*) p;
+       GDKfree(p);
        sql_key *nk = (ktype != fkey)?(sql_key*)SA_ZNEW(tr->sa, 
sql_ukey):(sql_key*)SA_ZNEW(tr->sa, sql_fkey);
-       sqlid kid = *(sqlid*) store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "id"));
+       p = store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, 
"id"));
+       sqlid kid = *(sqlid*) p;
+       GDKfree(p);
        str v = (char*) store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "name"));
 
        base_init(tr->sa, &nk->base, kid, 0, v);
+       GDKfree(v);
        nk->type = ktype;
        nk->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
        nk->t = t;
@@ -300,15 +306,21 @@ load_key(sql_trans *tr, sql_table *t, re
                        t->pkey = uk;
        } else {
                sql_fkey *fk = (sql_fkey *) nk;
-               int action = *(int*)store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "action"));
+               void *p = store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "action"));
+               int action = *(int*)p;
+               GDKfree(p);
                fk->on_delete = action & 255;
                fk->on_update = (action>>8) & 255;
 
-               fk->rkey = *(sqlid*)store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "rkey"));
+               p = store->table_api.table_fetch_value(rt_keys, 
find_sql_column(keys, "rkey"));
+               fk->rkey = *(sqlid*)p;
+               GDKfree(p);
        }
 
        for ( ; rt_keycols->cur_row < rt_keycols->nr_rows; 
rt_keycols->cur_row++) {
-               sqlid nid = 
*(sqlid*)store->table_api.table_fetch_value(rt_keycols, 
find_sql_column(objects, "id"));
+               void *p = store->table_api.table_fetch_value(rt_keycols, 
find_sql_column(objects, "id"));
+               sqlid nid = *(sqlid*)p;
+               GDKfree(p);
                if (nid != nk->base.id)
                        break;
                load_keycolumn(tr, nk, rt_keycols);
@@ -334,6 +346,7 @@ load_idxcolumn(sql_trans *tr, sql_idx * 
 
        v = (char*)store->table_api.table_fetch_value(rt_idxcols, 
find_sql_column(objects, "name"));
        kc->c = find_sql_column(i->t, v);
+       GDKfree(v);
        assert(kc->c);
        list_append(i->columns, kc);
        if (hash_index(i->type))
@@ -357,10 +370,15 @@ load_idx(sql_trans *tr, sql_table *t, re
        sql_table *objects = find_sql_table(tr, syss, "objects");
        sqlstore *store = tr->store;
 
-       sqlid iid = *(sqlid*)store->table_api.table_fetch_value(rt_idx, 
find_sql_column(idxs, "id"));
+       void *p = store->table_api.table_fetch_value(rt_idx, 
find_sql_column(idxs, "id"));
+       sqlid iid = *(sqlid*)p;
+       GDKfree(p);
        str v = (char*)store->table_api.table_fetch_value(rt_idx, 
find_sql_column(idxs, "name"));
        base_init(tr->sa, &ni->base, iid, 0, v);
-       ni->type = (idx_type) *(int*) 
store->table_api.table_fetch_value(rt_idx, find_sql_column(idxs, "type"));
+       GDKfree(v);
+       p = store->table_api.table_fetch_value(rt_idx, find_sql_column(idxs, 
"type"));
+       ni->type = (idx_type) *(int*) p;
+       GDKfree(p);
        ni->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
        ni->t = t;
        ni->key = NULL;
@@ -369,7 +387,9 @@ load_idx(sql_trans *tr, sql_table *t, re
                store->storage_api.create_idx(tr, ni);
 
        for ( ; rt_idxcols->cur_row < rt_idxcols->nr_rows; 
rt_idxcols->cur_row++) {
-               sqlid nid = 
*(sqlid*)store->table_api.table_fetch_value(rt_idxcols, 
find_sql_column(objects, "id"));
+               void *p = store->table_api.table_fetch_value(rt_idxcols, 
find_sql_column(objects, "id"));
+               sqlid nid = *(sqlid*)p;
+               GDKfree(p);
                if (nid != ni->base.id)
                        break;
                load_idxcolumn(tr, ni, rt_idxcols);
@@ -387,6 +407,7 @@ load_triggercolumn(sql_trans *tr, sql_tr
 
        str v = (char*)store->table_api.table_fetch_value(rt_triggercols, 
find_sql_column(objects, "name"));
        kc->c = find_sql_column(i->t, v);
+       GDKfree(v);
        list_append(i->columns, kc);
        assert(kc->c);
 }
@@ -400,32 +421,47 @@ load_trigger(sql_trans *tr, sql_table *t
        sql_table *objects = find_sql_table(tr, syss, "objects");
        sqlstore *store = tr->store;
 
-       sqlid tid = *(sqlid*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "id"));
+       void *p = store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "id"));
+       sqlid tid = *(sqlid*)p;
+       GDKfree(p);
        str v = (char*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "name"));
        base_init(tr->sa, &nt->base, tid, 0, v);
-
-       nt->time = *(sht*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "time"));
-       nt->orientation = 
*(sht*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "orientation"));
-       nt->event = *(sht*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "event"));
+       GDKfree(v);
+
+       p = store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "time"));
+       nt->time = *(sht*) p;
+       GDKfree(p);
+       p = store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "orientation"));
+       nt->orientation = *(sht*)p;
+       GDKfree(p);
+       p = store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "event"));
+       nt->event = *(sht*)p;
+       GDKfree(p);
 
        v = (char*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "old_name"));
        if (!strNil(v))
                nt->old_name = SA_STRDUP(tr->sa, v);
+       GDKfree(v);
        v = (char*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "new_name"));
        if (!strNil(v))
                nt->new_name = SA_STRDUP(tr->sa, v);
+       GDKfree(v);
        v = (char*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "condition"));
        if (!strNil(v))
                nt->condition = SA_STRDUP(tr->sa, v);
+       GDKfree(v);
        v = (char*)store->table_api.table_fetch_value(rt_triggers, 
find_sql_column(triggers, "statement"));
        if (!strNil(v))
                nt->statement = SA_STRDUP(tr->sa, v);
+       GDKfree(v);
 
        nt->t = t;
        nt->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
 
        for ( ; rt_triggercols->cur_row < rt_triggercols->nr_rows; 
rt_triggercols->cur_row++) {
-               sqlid nid = 
*(sqlid*)store->table_api.table_fetch_value(rt_triggercols, 
find_sql_column(objects, "id"));
+               void *p = store->table_api.table_fetch_value(rt_triggercols, 
find_sql_column(objects, "id"));
+               sqlid nid = *(sqlid*)p;
+               GDKfree(p);
                if (nid != nt->base.id)
                        break;
                load_triggercolumn(tr, nt, rt_triggercols);
@@ -443,32 +479,47 @@ load_column(sql_trans *tr, sql_table *t,
        str v, def, tpe, st;
        int sz, d;
 
-       sqlid cid = *(sqlid*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "id"));
+       void *p = store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "id"));
+       sqlid cid = *(sqlid*)p;
+       GDKfree(p);
        v = (char*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "name"));
        base_init(tr->sa, &c->base, cid, 0, v);
-
-       sz = *(int*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "type_digits"));
-       d = *(int*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "type_scale"));
+       GDKfree(v);
+
+       p = store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "type_digits"));
+       sz = *(int*)p;
+       GDKfree(p);
+       p = store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "type_scale"));
+       d = *(int*)p;
+       GDKfree(p);
        tpe = (char*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "type"));
        if (!sql_find_subtype(&c->type, tpe, sz, d)) {
                sql_type *lt = sql_trans_bind_type(tr, t->s, tpe);
                if (lt == NULL) {
                        TRC_ERROR(SQL_STORE, "SQL type '%s' is missing\n", tpe);
+                       GDKfree(tpe);
                        return NULL;
                }
                sql_init_subtype(&c->type, lt, sz, d);
        }
+       GDKfree(tpe);
        c->def = NULL;
        def = (char*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "default"));
        if (!strNil(def))
                c->def = SA_STRDUP(tr->sa, def);
-       c->null = *(bit*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "null"));
-       c->colnr = *(int*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "number"));
+       GDKfree(def);
+       p = store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "null"));
+       c->null = *(bit*)p;
+       GDKfree(p);
+       p = store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "number"));
+       c->colnr = *(int*)p;
+       GDKfree(p);
        c->unique = 0;
        c->storage_type = NULL;
        st = (char*)store->table_api.table_fetch_value(rt_cols, 
find_sql_column(columns, "storage"));
        if (!strNil(st))
                c->storage_type = SA_STRDUP(tr->sa, st);
+       GDKfree(st);
        c->t = t;
        if (isTable(c->t))
                store->storage_api.create_col(tr, c);
@@ -598,23 +649,35 @@ load_table(sql_trans *tr, sql_schema *s,
        sqlid pcolid = int_nil;
        str v, exp = NULL;
 
-       sqlid ntid = *(sqlid*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "id"));
+       void *p = store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "id"));
+       sqlid ntid = *(sqlid*)p;
+       GDKfree(p);
        assert(tid == ntid);
        v = (char*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "name"));
        base_init(tr->sa, &t->base, tid, 0, v);
+       GDKfree(v);
        t->query = NULL;
        v = (char*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "query"));
        if (!strNil(v))
                t->query = SA_STRDUP(tr->sa, v);
-       t->type = *(sht*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "type"));
-       t->system = *(bit*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "system"));
-       t->commit_action = 
(ca_t)*(sht*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "commit_action"));
+       GDKfree(v);
+       p = store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "type"));
+       t->type = *(sht*)p;
+       GDKfree(p);
+       p = store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "system"));
+       t->system = *(bit*)p;
+       GDKfree(p);
+       p = store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "commit_action"));
+       t->commit_action = (ca_t)*(sht*)p;
+       GDKfree(p);
        t->persistence = SQL_PERSIST;
        if (t->commit_action)
                t->persistence = SQL_GLOBAL_TEMP;
        if (isRemote(t))
                t->persistence = SQL_REMOTE;
-       t->access = *(sht*)store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "access"));
+       p = store->table_api.table_fetch_value(rt_tables, 
find_sql_column(tables, "access"));
+       t->access = *(sht*)p;
+       GDKfree(p);
 
        t->pkey = NULL;
        t->s = s;
@@ -638,16 +701,23 @@ load_table(sql_trans *tr, sql_schema *s,
 
        sql_table *partitions = find_sql_table(tr, syss, "table_partitions");
        if (rt_parts->cur_row < rt_parts->nr_rows) {
-               ntid = *(sqlid*)store->table_api.table_fetch_value(rt_parts, 
find_sql_column(partitions, "table_id"));
+               p = store->table_api.table_fetch_value(rt_parts, 
find_sql_column(partitions, "table_id"));
+               ntid = *(sqlid*)p;
+               GDKfree(p);
                if (ntid == tid) {
-                       t->properties |= 
*(bte*)store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, 
"type"));
+                       p = store->table_api.table_fetch_value(rt_parts, 
find_sql_column(partitions, "type"));
+                       t->properties |= *(bte*)p;
+                       GDKfree(p);
 
                        if (isPartitionedByColumnTable(t)) {
-                               pcolid = 
*(sqlid*)store->table_api.table_fetch_value(rt_parts, 
find_sql_column(partitions, "column_id"));
+                               p = 
store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, 
"column_id"));
+                               pcolid = *(sqlid*)p;
+                               GDKfree(p);
                        } else {
                                v = 
(char*)store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, 
"expression"));
                                assert(!strNil(v));
                                exp = SA_STRDUP(tr->sa, v);
+                               GDKfree(v);
                        }
                        rt_parts->cur_row++;
                }
@@ -661,10 +731,14 @@ load_table(sql_trans *tr, sql_schema *s,
                t->part.pexp->cols = SA_LIST(tr->sa, (fdestroy) &int_destroy);
        }
        for ( ; rt_cols->cur_row < rt_cols->nr_rows; rt_cols->cur_row++) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to