Changeset: 412bf96d642c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/412bf96d642c
Modified Files:
sql/include/sql_catalog.h
sql/storage/bat/bat_storage.c
sql/storage/sql_catalog.c
sql/storage/store.c
Branch: tempscs2os
Log Message:
initial switch from cs to os:
compiles, starts & runs
diffs (truncated from 494 to 300 lines):
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -324,7 +324,7 @@ typedef struct sql_trans {
sql_catalog *cat;
sql_schema *tmp; /* each session has its own tmp schema */
- changeset localtmps;
+ struct objectset* _localtmps;
sql_allocator *sa; /* transaction allocator */
struct sql_trans *parent; /* multilevel transaction support */
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -575,16 +575,10 @@ find_tmp_table(sql_trans *tr, sql_table
{
assert(isGlobal(t));
assert(tr->tmp == t->s);
- node *n = cs_find_id(&tr->localtmps, t->base.id);
- sql_table *lt = NULL;
-
- if (n)
- lt = (sql_table*)n->data;
+ sql_table *lt = (sql_table*) os_find_id(tr->_localtmps, tr, t->base.id);
+
if (!lt) {
lt = globaltmp_instantiate(tr, t);
- /* TODO prepend to not mark as new */
- if (lt)
- cs_add(&tr->localtmps, lt, true);
}
return lt;
}
@@ -630,8 +624,6 @@ temp_col_timestamp_delta( sql_trans *tr,
static sql_delta *
col_timestamp_delta( sql_trans *tr, sql_column *c)
{
- if (isTempTable(c->t))
- return temp_col_timestamp_delta(tr, c);
return timestamp_delta( tr, ATOMIC_PTR_GET(&c->data));
}
@@ -691,8 +683,6 @@ temp_tab_timestamp_storage( sql_trans *t
static storage *
tab_timestamp_storage( sql_trans *tr, sql_table *t)
{
- if (isTempTable(t))
- return temp_tab_timestamp_storage(tr, t);
return timestamp_storage( tr, ATOMIC_PTR_GET(&t->data));
}
@@ -2066,6 +2056,8 @@ bind_col_data(sql_trans *tr, sql_column
if (isTempTable(c->t) && !(obat = temp_col_timestamp_delta(tr, c)))
return NULL;
+ if (isTempTable(c->t)) { assert(obat->cs.ts == tr->tid); return obat; }
+
if (obat->cs.ts == tr->tid || ((obat->cs.ts < TRANSACTION_ID_BASE ||
tr_version_of_parent(tr, obat->cs.ts)) && !update_conflict)) /* on append there
are no conflicts */
return obat;
if ((!tr->parent || !tr_version_of_parent(tr, obat->cs.ts)) &&
obat->cs.ts >= TRANSACTION_ID_BASE && !isTempTable(c->t)) {
@@ -2728,8 +2720,6 @@ bind_del_data(sql_trans *tr, sql_table *
if (!(obat = temp_tab_timestamp_storage(tr, t)))
return NULL;
- assert(obat->cs.ts == tr->tid);
-
if (clear && clear_storage(tr, t, obat) != LOG_OK)
return NULL;
@@ -3507,11 +3497,12 @@ create_del(sql_trans *tr, sql_table *t)
}
if (!isNew(t) && !isTempTable(t)) {
+ // TODO: figure out the purpose
bat->cs.ts = tr->ts;
return load_storage(tr, t, bat, t->base.id);
- } else if (bat->cs.bid && !isTempTable(t)) {
+ } else if (bat->cs.bid) {
return ok;
- } else if (!bat->cs.bid) {
+ } else {
assert(!bat->segs);
if (!(bat->segs = new_segments(tr, 0)))
ok = LOG_ERR;
@@ -3616,34 +3607,32 @@ commit_create_del( sql_trans *tr, sql_ch
if (!commit_ts) /* rollback handled by ? */
return ok;
- if(!isTempTable(t)) {
- storage *dbat = ATOMIC_PTR_GET(&t->data);
- ok = segments2cs(tr, dbat->segs, &dbat->cs);
- assert(ok == LOG_OK);
- if (ok != LOG_OK)
- return ok;
- merge_segments(dbat, tr, change, commit_ts, commit_ts/* create
is we are alone */ /*oldest*/);
- assert(dbat->cs.ts == tr->tid);
- dbat->cs.ts = commit_ts;
- if (ok == LOG_OK) {
- for(node *n = ol_first_node(t->columns); n && ok ==
LOG_OK; n = n->next) {
- sql_column *c = n->data;
- sql_delta *delta = ATOMIC_PTR_GET(&c->data);
-
- ok = commit_create_delta(tr, c->t, &c->base,
delta, commit_ts, oldest);
+ storage *dbat = ATOMIC_PTR_GET(&t->data);
+ ok = segments2cs(tr, dbat->segs, &dbat->cs);
+ assert(ok == LOG_OK);
+ if (ok != LOG_OK)
+ return ok;
+ merge_segments(dbat, tr, change, commit_ts, commit_ts/* create is we
are alone */ /*oldest*/);
+ assert(dbat->cs.ts == tr->tid);
+ dbat->cs.ts = commit_ts;
+ if (ok == LOG_OK) {
+ for(node *n = ol_first_node(t->columns); n && ok == LOG_OK; n =
n->next) {
+ sql_column *c = n->data;
+ sql_delta *delta = ATOMIC_PTR_GET(&c->data);
+
+ ok = commit_create_delta(tr, c->t, &c->base, delta,
commit_ts, oldest);
+ }
+ if (t->idxs) {
+ for(node *n = ol_first_node(t->idxs); n && ok ==
LOG_OK; n = n->next) {
+ sql_idx *i = n->data;
+ sql_delta *delta = ATOMIC_PTR_GET(&i->data);
+
+ if (delta)
+ ok = commit_create_delta(tr, i->t,
&i->base, delta, commit_ts, oldest);
}
- if (t->idxs) {
- for(node *n = ol_first_node(t->idxs); n && ok
== LOG_OK; n = n->next) {
- sql_idx *i = n->data;
- sql_delta *delta =
ATOMIC_PTR_GET(&i->data);
-
- if (delta)
- ok = commit_create_delta(tr,
i->t, &i->base, delta, commit_ts, oldest);
- }
- }
- if (!tr->parent)
- t->base.new = 0;
}
+ if (!tr->parent)
+ t->base.new = 0;
}
if (!tr->parent)
t->base.new = 0;
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -18,37 +18,6 @@ base_key( sql_base *b )
return hash_key(b->name);
}
-static void *
-_list_find_name(list *l, const char *name)
-{
- node *n;
-
- if (l) {
- if (l->ht) {
- int key = hash_key(name);
- sql_hash_e *he = l->ht->buckets[key&(l->ht->size-1)];
-
- for (; he; he = he->chain) {
- sql_base *b = he->value;
-
- if (b->name && strcmp(b->name, name) == 0) {
- return b;
- }
- }
- return NULL;
- }
- for (n = l->h; n; n = n->next) {
- sql_base *b = n->data;
-
- /* check if names match */
- if (name[0] == b->name[0] && strcmp(name, b->name) ==
0) {
- return b;
- }
- }
- }
- return NULL;
-}
-
void
trans_add(sql_trans *tr, sql_base *b, void *data, tc_cleanup_fptr cleanup,
tc_commit_fptr commit, tc_log_fptr log)
{
@@ -171,13 +140,11 @@ schema_find_key(sql_trans *tr, sql_schem
{
sql_base *b = os_find_name(s->keys, tr, name);
- if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
- for(node *n = tr->localtmps.set->h; n; n = n->next) {
- sql_table *t = n->data;
- sql_key *o = find_sql_key(t, name);
- if (o)
- return o;
- }
+ if (!b && tr->tmp == s) {
+ sql_table *t = (sql_table*) os_find_name(tr->_localtmps, tr,
name);
+ sql_key *o = find_sql_key(t, name);
+ if (o)
+ return o;
}
return (sql_key*)b;
}
@@ -210,13 +177,11 @@ schema_find_idx(sql_trans *tr, sql_schem
{
sql_base *b = os_find_name(s->idxs, tr, name);
- if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
- for(node *n = tr->localtmps.set->h; n; n = n->next) {
- sql_table *t = n->data;
- sql_idx *o = find_sql_idx(t, name);
- if (o)
- return o;
- }
+ if (!b && tr->tmp == s) {
+ sql_table *t = (sql_table*) os_find_name(tr->_localtmps, tr, name);
+ sql_idx *o = find_sql_idx(t, name);
+ if (o)
+ return o;
}
return (sql_idx*)b;
}
@@ -226,9 +191,11 @@ schema_find_idx_id(sql_trans *tr, sql_sc
{
sql_base *b = os_find_id(s->idxs, tr, id);
- if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
- for(node *n = tr->localtmps.set->h; n; n = n->next) {
- sql_table *t = n->data;
+ if (!b && tr->tmp == s) {
+ struct os_iter oi;
+ os_iterator(&oi, tr->_localtmps, tr, NULL);
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) { // TODO:
maybe an objectset for idxs or have idxs in global idxs os
+ sql_table *t = (sql_table *) b;
node *o = ol_find_id(t->idxs, id);
if (o)
return (sql_idx*)o->data;
@@ -251,8 +218,23 @@ sql_table *
find_sql_table(sql_trans *tr, sql_schema *s, const char *tname)
{
sql_table *t = (sql_table*)os_find_name(s->tables, tr, tname);
- if (!t && tr->tmp == s)
- t = (sql_table*)_list_find_name(tr->localtmps.set, tname);
+
+ if (!t && tr->tmp == s) {
+ t = (sql_table*) os_find_name(tr->_localtmps, tr, tname);
+ return t;
+ }
+
+ if (t && isTempTable(t) && tr->tmp == s) {
+ assert(isGlobal(t));
+
+ sql_table* lt = (sql_table*) os_find_name(tr->_localtmps, tr,
tname);
+ if (lt)
+ return lt;
+
+ t = globaltmp_instantiate(tr, t);
+ return t;
+ }
+
return t;
}
@@ -261,9 +243,18 @@ find_sql_table_id(sql_trans *tr, sql_sch
{
sql_table *t = (sql_table*)os_find_id(s->tables, tr, id);
if (!t && tr->tmp == s) {
- node *n = cs_find_id(&tr->localtmps, id);
- if (n)
- return (sql_table*)n->data;
+ t = (sql_table*) os_find_id(tr->_localtmps, tr, id);
+ }
+
+ if (t && isTempTable(t) && tr->tmp == s) {
+ assert(isGlobal(t));
+
+ sql_table* lt = (sql_table*) os_find_id(tr->_localtmps, tr, id);
+ if (lt)
+ return lt;
+
+ t = globaltmp_instantiate(tr, t);
+ return t;
}
return t;
}
@@ -388,13 +379,11 @@ schema_find_trigger(sql_trans *tr, sql_s
{
sql_base *b = os_find_name(s->triggers, tr, name);
- if (!b && tr->tmp == s && tr->localtmps.set) { /* for localtmps search
tables */
- for(node *n = tr->localtmps.set->h; n; n = n->next) {
- sql_table *t = n->data;
- sql_trigger *o = find_sql_trigger(t, name);
- if (o)
- return o;
- }
+ if (!b && tr->tmp == s) {
+ sql_table *t = (sql_table*) os_find_name(tr->_localtmps, tr,
name);
+ sql_trigger *o = find_sql_trigger(t, name);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]