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