Changeset: 0c8bd45d2cd5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0c8bd45d2cd5 Modified Files: sql/storage/bat/bat_table.c sql/storage/store.c Branch: Jul2021 Log Message:
Since table_fetch_value is only used during initialization, we can do away with malloc. diffs (truncated from 408 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 @@ -394,16 +394,16 @@ table_orderby(sql_trans *tr, sql_table * static void * table_fetch_value(res_table *rt, sql_column *c) { + /* this function is only ever called during startup, and therefore + * there are no other threads that may be modifying the BAT under + * our hands, so returning a pointer into the heap is fine */ BAT *b = (BAT*)rt->cols[c->colnr].p; - BATiter bi = bat_iterator(b); + BATiter bi = bat_iterator_nolock(b); assert(b->ttype && b->ttype != TYPE_msk); - 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 r; + if (b->tvarsized) + return BUNtvar(bi, rt->cur_row); + return Tloc(b, rt->cur_row); + //return (void*)BUNtail(bi, rt->cur_row); } 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,7 +271,6 @@ 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); } @@ -284,17 +283,12 @@ load_key(sql_trans *tr, sql_table *t, re sql_table *objects = find_sql_table(tr, syss, "objects"); sqlstore *store = tr->store; - void *p = store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "type")); - key_type ktype = (key_type) *(int*) p; - GDKfree(p); + key_type ktype = (key_type) *(int*) store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "type")); sql_key *nk = (ktype != fkey)?(sql_key*)SA_ZNEW(tr->sa, sql_ukey):(sql_key*)SA_ZNEW(tr->sa, sql_fkey); - p = store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "id")); - sqlid kid = *(sqlid*) p; - GDKfree(p); + sqlid kid = *(sqlid*) store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "id")); 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; @@ -306,21 +300,15 @@ load_key(sql_trans *tr, sql_table *t, re t->pkey = uk; } else { sql_fkey *fk = (sql_fkey *) nk; - void *p = store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "action")); - int action = *(int*)p; - GDKfree(p); + int action = *(int*)store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "action")); fk->on_delete = action & 255; fk->on_update = (action>>8) & 255; - p = store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "rkey")); - fk->rkey = *(sqlid*)p; - GDKfree(p); + fk->rkey = *(sqlid*)store->table_api.table_fetch_value(rt_keys, find_sql_column(keys, "rkey")); } for ( ; rt_keycols->cur_row < rt_keycols->nr_rows; rt_keycols->cur_row++) { - void *p = store->table_api.table_fetch_value(rt_keycols, find_sql_column(objects, "id")); - sqlid nid = *(sqlid*)p; - GDKfree(p); + sqlid nid = *(sqlid*)store->table_api.table_fetch_value(rt_keycols, find_sql_column(objects, "id")); if (nid != nk->base.id) break; load_keycolumn(tr, nk, rt_keycols); @@ -346,7 +334,6 @@ 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)) @@ -370,15 +357,10 @@ load_idx(sql_trans *tr, sql_table *t, re sql_table *objects = find_sql_table(tr, syss, "objects"); sqlstore *store = tr->store; - void *p = store->table_api.table_fetch_value(rt_idx, find_sql_column(idxs, "id")); - sqlid iid = *(sqlid*)p; - GDKfree(p); + sqlid iid = *(sqlid*)store->table_api.table_fetch_value(rt_idx, find_sql_column(idxs, "id")); 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); - 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->type = (idx_type) *(int*) store->table_api.table_fetch_value(rt_idx, find_sql_column(idxs, "type")); ni->columns = list_new(tr->sa, (fdestroy) &kc_destroy); ni->t = t; ni->key = NULL; @@ -387,9 +369,7 @@ 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++) { - void *p = store->table_api.table_fetch_value(rt_idxcols, find_sql_column(objects, "id")); - sqlid nid = *(sqlid*)p; - GDKfree(p); + sqlid nid = *(sqlid*)store->table_api.table_fetch_value(rt_idxcols, find_sql_column(objects, "id")); if (nid != ni->base.id) break; load_idxcolumn(tr, ni, rt_idxcols); @@ -407,7 +387,6 @@ 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); } @@ -421,47 +400,32 @@ load_trigger(sql_trans *tr, sql_table *t sql_table *objects = find_sql_table(tr, syss, "objects"); sqlstore *store = tr->store; - void *p = store->table_api.table_fetch_value(rt_triggers, find_sql_column(triggers, "id")); - sqlid tid = *(sqlid*)p; - GDKfree(p); + sqlid tid = *(sqlid*)store->table_api.table_fetch_value(rt_triggers, find_sql_column(triggers, "id")); 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); - 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); + + 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")); 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++) { - void *p = store->table_api.table_fetch_value(rt_triggercols, find_sql_column(objects, "id")); - sqlid nid = *(sqlid*)p; - GDKfree(p); + sqlid nid = *(sqlid*)store->table_api.table_fetch_value(rt_triggercols, find_sql_column(objects, "id")); if (nid != nt->base.id) break; load_triggercolumn(tr, nt, rt_triggercols); @@ -479,47 +443,32 @@ load_column(sql_trans *tr, sql_table *t, str v, def, tpe, st; int sz, d; - void *p = store->table_api.table_fetch_value(rt_cols, find_sql_column(columns, "id")); - sqlid cid = *(sqlid*)p; - GDKfree(p); + sqlid cid = *(sqlid*)store->table_api.table_fetch_value(rt_cols, find_sql_column(columns, "id")); v = (char*)store->table_api.table_fetch_value(rt_cols, find_sql_column(columns, "name")); base_init(tr->sa, &c->base, cid, 0, v); - 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); + + 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")); 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); - 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->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")); 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); @@ -649,35 +598,23 @@ load_table(sql_trans *tr, sql_schema *s, sqlid pcolid = int_nil; str v, exp = NULL; - void *p = store->table_api.table_fetch_value(rt_tables, find_sql_column(tables, "id")); - sqlid ntid = *(sqlid*)p; - GDKfree(p); + sqlid ntid = *(sqlid*)store->table_api.table_fetch_value(rt_tables, find_sql_column(tables, "id")); 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); - 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->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")); t->persistence = SQL_PERSIST; if (t->commit_action) t->persistence = SQL_GLOBAL_TEMP; if (isRemote(t)) t->persistence = SQL_REMOTE; - p = store->table_api.table_fetch_value(rt_tables, find_sql_column(tables, "access")); - t->access = *(sht*)p; - GDKfree(p); + t->access = *(sht*)store->table_api.table_fetch_value(rt_tables, find_sql_column(tables, "access")); t->pkey = NULL; t->s = s; @@ -701,23 +638,16 @@ 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) { - p = store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "table_id")); - ntid = *(sqlid*)p; - GDKfree(p); + ntid = *(sqlid*)store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "table_id")); if (ntid == tid) { - p = store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "type")); - t->properties |= *(bte*)p; - GDKfree(p); + t->properties |= *(bte*)store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "type")); if (isPartitionedByColumnTable(t)) { - p = store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "column_id")); - pcolid = *(sqlid*)p; - GDKfree(p); + pcolid = *(sqlid*)store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "column_id")); } else { v = (char*)store->table_api.table_fetch_value(rt_parts, find_sql_column(partitions, "expression")); assert(!strNil(v)); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list