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

Reply via email to