Changeset: 8935093e7353 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8935093e7353
Modified Files:
        sql/backends/monet5/sql_user.c
        sql/storage/bat/bat_table.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: default
Log Message:

Reduce allocations while starting storage by passing pointer to the string heap


diffs (truncated from 696 to 300 lines):

diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -520,7 +520,7 @@ str
 monet5_user_get_def_schema(mvc *m, int user)
 {
        oid rid;
-       sqlid schema_id;
+       sqlid schema_id = 0;
        sql_schema *sys = NULL;
        sql_table *user_info = NULL;
        sql_column *users_name = NULL;
@@ -531,7 +531,6 @@ monet5_user_get_def_schema(mvc *m, int u
        sql_table *auths = NULL;
        sql_column *auths_id = NULL;
        sql_column *auths_name = NULL;
-       void *p = 0;
        str username = NULL;
        str schema = NULL;
 
@@ -550,12 +549,9 @@ monet5_user_get_def_schema(mvc *m, int u
        users_schema = find_sql_column(user_info, "default_schema");
        rid = store->table_api.column_find_row(m->session->tr, users_name, 
username, NULL);
        if (!is_oid_nil(rid))
-               p = store->table_api.column_find_value(m->session->tr, 
users_schema, rid);
+               schema_id = store->table_api.column_find_sqlid(m->session->tr, 
users_schema, rid);
 
        _DELETE(username);
-       assert(p);
-       schema_id = *(sqlid *) p;
-       _DELETE(p);
 
        schemas = find_sql_table(m->session->tr, sys, "schemas");
        schemas_name = find_sql_column(schemas, "name");
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
@@ -172,6 +172,34 @@ column_find_tpe(sht)
 column_find_tpe(int)
 column_find_tpe(lng)
 
+static str
+column_find_string_start(sql_trans *tr, sql_column *c, oid rid, ptr *cbat)
+{
+       BUN q = BUN_NONE;
+       BAT **b = (BAT**) cbat;
+       str res = NULL;
+
+       *b = full_column(tr, c);
+       if (*b) {
+               if (rid < (*b)->hseqbase || rid >= (*b)->hseqbase + 
BATcount(*b))
+                       q = BUN_NONE;
+               else
+                       q = rid - (*b)->hseqbase;
+       }
+       if (q != BUN_NONE) {
+               BATiter bi = bat_iterator(*b);
+               res = (str) BUNtvar(bi, q);
+       }
+       return res;
+}
+
+static void
+column_find_string_end(ptr cbat)
+{
+       BAT *b = (BAT*) cbat;
+       full_destroy(NULL, b);
+}
+
 static int
 column_update_value(sql_trans *tr, sql_column *c, oid rid, void *value)
 {
@@ -621,7 +649,8 @@ bat_table_init( table_functions *tf )
        tf->column_find_sht = column_find_sht;
        tf->column_find_int = column_find_int;
        tf->column_find_lng = column_find_lng;
-
+       tf->column_find_string_start = column_find_string_start; /* this 
function returns a pointer to the heap, use it with care! */
+       tf->column_find_string_end = column_find_string_end; /* don't forget to 
call this function to unfix the bat descriptor! */
        tf->column_update_value = column_update_value;
        tf->table_insert = table_insert;
        tf->table_delete = table_delete;
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -46,6 +46,8 @@ typedef bte (*column_find_bte_fptr)(sql_
 typedef sht (*column_find_sht_fptr)(sql_trans *tr, sql_column *c, oid rid);
 typedef int (*column_find_int_fptr)(sql_trans *tr, sql_column *c, oid rid);
 typedef lng (*column_find_lng_fptr)(sql_trans *tr, sql_column *c, oid rid);
+typedef str (*column_find_string_start_fptr)(sql_trans *tr, sql_column *c, oid 
rid, ptr *cbat);
+typedef void (*column_find_string_end_fptr)(ptr cbat);
 typedef int (*column_update_value_fptr)(sql_trans *tr, sql_column *c, oid rid, 
void *value);
 typedef int (*table_insert_fptr)(sql_trans *tr, sql_table *t, ...);
 typedef int (*table_delete_fptr)(sql_trans *tr, sql_table *t, oid rid);
@@ -96,6 +98,9 @@ typedef struct table_functions {
        column_find_sht_fptr column_find_sht;
        column_find_int_fptr column_find_int;
        column_find_lng_fptr column_find_lng;
+       column_find_string_start_fptr column_find_string_start; /* this 
function returns a pointer to the heap, use it with care! */
+       column_find_string_end_fptr column_find_string_end; /* don't forget to 
call this function to unfix the bat descriptor! */
+
        column_update_value_fptr column_update_value;
        table_insert_fptr table_insert;
        table_delete_fptr table_delete;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -273,14 +273,16 @@ schema_destroy(sqlstore *store, sql_sche
 static void
 load_keycolumn(sql_trans *tr, sql_key *k, oid rid)
 {
-       void *v;
        sql_kc *kc = SA_ZNEW(tr->sa, sql_kc);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *objects = find_sql_table(tr, syss, "objects");
        sqlstore *store = tr->store;
-
-       v = store->table_api.column_find_value(tr, find_sql_column(objects, 
"name"), rid);
-       kc->c = find_sql_column(k->t, v);       _DELETE(v);
+       str v;
+       ptr cbat;
+
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(objects, "name"), rid, &cbat);
+       kc->c = find_sql_column(k->t, v);
+       store->table_api.column_find_string_end(cbat);
        list_append(k->columns, kc);
        assert(kc->c);
 }
@@ -288,7 +290,6 @@ load_keycolumn(sql_trans *tr, sql_key *k
 static sql_key *
 load_key(sql_trans *tr, sql_table *t, oid rid)
 {
-       void *v;
        sql_key *nk;
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *keys = find_sql_table(tr, syss, "keys");
@@ -299,12 +300,15 @@ load_key(sql_trans *tr, sql_table *t, oi
        sqlid kid;
        oid r = oid_nil;
        sqlstore *store = tr->store;
+       str v;
+       ptr cbat;
 
        ktype = (key_type) store->table_api.column_find_int(tr, 
find_sql_column(keys, "type"), rid);
        nk = (ktype != fkey)?(sql_key*)SA_ZNEW(tr->sa, 
sql_ukey):(sql_key*)SA_ZNEW(tr->sa, sql_fkey);
        kid = store->table_api.column_find_sqlid(tr, find_sql_column(keys, 
"id"), rid);
-       v = store->table_api.column_find_value(tr, find_sql_column(keys, 
"name"), rid);
-       base_init(tr->sa, &nk->base, kid, 0, v);        _DELETE(v);
+       v = store->table_api.column_find_string_start(tr, find_sql_column(keys, 
"name"), rid, &cbat);
+       base_init(tr->sa, &nk->base, kid, 0, v);
+       store->table_api.column_find_string_end(cbat);
        nk->type = ktype;
        nk->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
        nk->t = t;
@@ -345,14 +349,16 @@ load_key(sql_trans *tr, sql_table *t, oi
 static void
 load_idxcolumn(sql_trans *tr, sql_idx * i, oid rid)
 {
-       void *v;
        sql_kc *kc = SA_ZNEW(tr->sa, sql_kc);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *objects = find_sql_table(tr, syss, "objects");
        sqlstore *store = tr->store;
-
-       v = store->table_api.column_find_value(tr, find_sql_column(objects, 
"name"), rid);
-       kc->c = find_sql_column(i->t, v);       _DELETE(v);
+       str v;
+       ptr cbat;
+
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(objects, "name"), rid, &cbat);
+       kc->c = find_sql_column(i->t, v);
+       store->table_api.column_find_string_end(cbat);
        assert(kc->c);
        list_append(i->columns, kc);
        if (hash_index(i->type))
@@ -370,7 +376,6 @@ load_idxcolumn(sql_trans *tr, sql_idx * 
 static sql_idx *
 load_idx(sql_trans *tr, sql_table *t, oid rid)
 {
-       void *v;
        sql_idx *ni = SA_ZNEW(tr->sa, sql_idx);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *idxs = find_sql_table(tr, syss, "idxs");
@@ -379,10 +384,13 @@ load_idx(sql_trans *tr, sql_table *t, oi
        rids *rs;
        sqlid iid;
        sqlstore *store = tr->store;
+       str v;
+       ptr cbat;
 
        iid = store->table_api.column_find_sqlid(tr, find_sql_column(idxs, 
"id"), rid);
-       v = store->table_api.column_find_value(tr, find_sql_column(idxs, 
"name"), rid);
-       base_init(tr->sa, &ni->base, iid, 0, v);        _DELETE(v);
+       v = store->table_api.column_find_string_start(tr, find_sql_column(idxs, 
"name"), rid, &cbat);
+       base_init(tr->sa, &ni->base, iid, 0, v);
+       store->table_api.column_find_string_end(cbat);
        ni->type = (idx_type) store->table_api.column_find_int(tr, 
find_sql_column(idxs, "type"), rid);
        ni->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
        ni->t = t;
@@ -404,14 +412,16 @@ load_idx(sql_trans *tr, sql_table *t, oi
 static void
 load_triggercolumn(sql_trans *tr, sql_trigger * i, oid rid)
 {
-       void *v;
        sql_kc *kc = SA_ZNEW(tr->sa, sql_kc);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *objects = find_sql_table(tr, syss, "objects");
        sqlstore *store = tr->store;
-
-       v = store->table_api.column_find_value(tr, find_sql_column(objects, 
"name"), rid);
-       kc->c = find_sql_column(i->t, v);       _DELETE(v);
+       str v;
+       ptr cbat;
+
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(objects, "name"), rid, &cbat);
+       kc->c = find_sql_column(i->t, v);
+       store->table_api.column_find_string_end(cbat);
        list_append(i->columns, kc);
        assert(kc->c);
 }
@@ -419,7 +429,6 @@ load_triggercolumn(sql_trans *tr, sql_tr
 static sql_trigger *
 load_trigger(sql_trans *tr, sql_table *t, oid rid)
 {
-       void *v;
        sql_trigger *nt = SA_ZNEW(tr->sa, sql_trigger);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *triggers = find_sql_table(tr, syss, "triggers");
@@ -428,31 +437,34 @@ load_trigger(sql_trans *tr, sql_table *t
        sqlid tid;
        rids *rs;
        sqlstore *store = tr->store;
+       str v;
+       ptr cbat;
 
        tid = store->table_api.column_find_sqlid(tr, find_sql_column(triggers, 
"id"), rid);
-       v = store->table_api.column_find_value(tr, find_sql_column(triggers, 
"name"), rid);
-       base_init(tr->sa, &nt->base, tid, 0, v);        _DELETE(v);
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(triggers, "name"), rid, &cbat);
+       base_init(tr->sa, &nt->base, tid, 0, v);
+       store->table_api.column_find_string_end(cbat);
 
        nt->time = store->table_api.column_find_sht(tr, 
find_sql_column(triggers, "time"), rid);
        nt->orientation = store->table_api.column_find_sht(tr, 
find_sql_column(triggers, "orientation"),rid);
        nt->event = store->table_api.column_find_sht(tr, 
find_sql_column(triggers, "event"), rid);
 
-       v = store->table_api.column_find_value(tr, find_sql_column(triggers, 
"old_name"), rid);
-       if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(triggers, "old_name"), rid, &cbat);
+       if (!strNil(v))
                nt->old_name = SA_STRDUP(tr->sa, v);
-       _DELETE(v);
-       v = store->table_api.column_find_value(tr, find_sql_column(triggers, 
"new_name"), rid);
-       if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+       store->table_api.column_find_string_end(cbat);
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(triggers, "new_name"), rid, &cbat);
+       if (!strNil(v))
                nt->new_name = SA_STRDUP(tr->sa, v);
-       _DELETE(v);
-       v = store->table_api.column_find_value(tr, find_sql_column(triggers, 
"condition"), rid);
-       if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+       store->table_api.column_find_string_end(cbat);
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(triggers, "condition"), rid, &cbat);
+       if (!strNil(v))
                nt->condition = SA_STRDUP(tr->sa, v);
-       _DELETE(v);
-       v = store->table_api.column_find_value(tr, find_sql_column(triggers, 
"statement"), rid);
-       if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+       store->table_api.column_find_string_end(cbat);
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(triggers, "statement"), rid, &cbat);
+       if (!strNil(v))
                nt->statement = SA_STRDUP(tr->sa, v);
-       _DELETE(v);
+       store->table_api.column_find_string_end(cbat);
 
        nt->t = t;
        nt->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
@@ -470,45 +482,46 @@ load_trigger(sql_trans *tr, sql_table *t
 static sql_column *
 load_column(sql_trans *tr, sql_table *t, oid rid)
 {
-       void *v;
-       char *def, *tpe, *st;
-       int sz, d;
        sql_column *c = SA_ZNEW(tr->sa, sql_column);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *columns = find_sql_table(tr, syss, "_columns");
        sqlid cid;
        sqlstore *store = tr->store;
+       str v, def, tpe, st;
+       ptr cbat;
+       int sz, d;
 
        cid = store->table_api.column_find_sqlid(tr, find_sql_column(columns, 
"id"), rid);
-       v = store->table_api.column_find_value(tr, find_sql_column(columns, 
"name"), rid);
-       base_init(tr->sa, &c->base, cid, 0, v); _DELETE(v);
-
-       tpe = store->table_api.column_find_value(tr, find_sql_column(columns, 
"type"), rid);
+       v = store->table_api.column_find_string_start(tr, 
find_sql_column(columns, "name"), rid, &cbat);
+       base_init(tr->sa, &c->base, cid, 0, v);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to