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