Changeset: a9f28545e9e2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a9f28545e9e2
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/objectset.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
Branch: tempscs2os
Log Message:

various fixes


diffs (194 lines):

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
@@ -2296,7 +2296,6 @@ append_idx(sql_trans *tr, sql_idx *i, BU
                return LOG_ERR;
 
        assert(delta->cs.st == ST_DEFAULT);
-       assert(delta && delta->cs.ts == tr->tid);
 
        odelta = delta;
        res = append_col_execute(tr, &delta, i->base.id, offset, offsets, data, 
cnt, tpe, NULL);
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -402,7 +402,8 @@ objectversion_destroy(sqlstore *store, o
        if (os->destroy)
                os->destroy(store, ov->b);
 
-       if (os->temporary) os_destroy(os, store); // TODO tempscs2os : embed 
into refcounting subproject
+       if (os->temporary && (state & deleted || state & under_destruction || 
state & rollbacked))
+               os_destroy(os, store); // TODO tempscs2os : embed into 
refcounting subproject : reference is already dropped by os_cleanup
        _DELETE(ov);
 }
 
@@ -581,6 +582,9 @@ os_cleanup(sqlstore* store, objectversio
                return LOG_OK;
        }
 
+       assert(os_atmc_get_state(ov) != deleted && os_atmc_get_state(ov) != 
under_destruction && os_atmc_get_state(ov) != rollbacked);
+       if (ov->os->temporary) os_destroy(ov->os, store); // TODO tempscs2os : 
embed into refcounting subproject: (old) live versions should drop their 
reference to the os
+
        while (ov->id_based_older && ov->id_based_older == ov->name_based_older 
&& ov->ts >= oldest) {
                ov = ov->id_based_older;
        }
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
@@ -141,10 +141,14 @@ schema_find_key(sql_trans *tr, sql_schem
        sql_base *b = os_find_name(s->keys, tr, name);
 
        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;
+               struct os_iter oi;
+               os_iterator(&oi, tr->_localtmps, tr, NULL);
+               for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+                       sql_table *t = (sql_table *) b;
+                       sql_key *o = find_sql_key(t, name);
+                       if (o)
+                               return o;
+               }
        }
        return (sql_key*)b;
 }
@@ -178,10 +182,14 @@ schema_find_idx(sql_trans *tr, sql_schem
        sql_base *b = os_find_name(s->idxs, tr, name);
 
        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;
+               struct os_iter oi;
+               os_iterator(&oi, tr->_localtmps, tr, NULL);
+               for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+                       sql_table *t = (sql_table *) b;
+                       sql_idx *o = find_sql_idx(t, name);
+                       if (o)
+                               return o;
+               }
        }
        return (sql_idx*)b;
 }
@@ -194,7 +202,7 @@ schema_find_idx_id(sql_trans *tr, sql_sc
        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
+               for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
                        sql_table *t = (sql_table *) b;
                        node *o = ol_find_id(t->idxs, id);
                        if (o)
@@ -381,10 +389,14 @@ schema_find_trigger(sql_trans *tr, sql_s
        sql_base *b = os_find_name(s->triggers, tr, name);
 
        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);
-               if (o)
-                       return o;
+               struct os_iter oi;
+               os_iterator(&oi, tr->_localtmps, tr, NULL);
+               for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+                       sql_table *t = (sql_table *) b;
+                       sql_trigger *o = find_sql_trigger(t, name);
+                       if (o)
+                               return o;
+               }
        }
        return (sql_trigger*)b;
 }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3147,6 +3147,7 @@ cleanup:
 sql_table *
 globaltmp_instantiate(sql_trans *tr, sql_table *ot)
 {
+       assert(isGlobal(ot)&& isTempTable(ot));
        sql_table *t = NULL;
        if (table_dup(tr, ot, NULL, NULL, &t) == LOG_OK)
                return t;
@@ -3583,6 +3584,14 @@ sql_trans_rollback(sql_trans *tr, bool c
 {
        sqlstore *store = tr->store;
        if (!list_empty(tr->changes)) {
+               struct os_iter oi;
+               os_iterator(&oi, tr->_localtmps, tr, NULL);
+               for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+                       sql_table *t = (sql_table *) b;
+                       if (t->commit_action == CA_DROP && !b->deleted) {
+                               (void) sql_trans_drop_table_id(tr, t->s, b->id, 
DROP_RESTRICT);// TODO tempscs2os : fix result code sql_trans_drop_table_id
+                       }
+               }
                /* revert the change list */
                list *nl = SA_LIST(tr->sa, (fdestroy) NULL);
                for(node *n=tr->changes->h; n; n = n->next)
@@ -3858,6 +3867,15 @@ sql_trans_commit(sql_trans *tr)
        sqlstore *store = tr->store;
 
        if (!list_empty(tr->changes)) {
+               struct os_iter oi;
+               os_iterator(&oi, tr->_localtmps, tr, NULL);
+               for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+                       sql_table *t = (sql_table *) b;
+                       if (t->commit_action == CA_DROP && !b->deleted) {
+                               (void) sql_trans_drop_table_id(tr, t->s, b->id, 
DROP_RESTRICT);;// TODO tempscs2os : fix result code sql_trans_drop_table_id
+                       }
+               }
+
                int flush = 0;
                ulng commit_ts = 0, oldest = 0, log_file_id = 0;
 
@@ -5816,24 +5834,21 @@ create_sql_column(sqlstore *store, sql_a
 int
 sql_trans_drop_table(sql_trans *tr, sql_schema *s, const char *name, int 
drop_action)
 {
-       sql_table *t = find_sql_table(tr, s, name), *gt = NULL;
+       sql_table *t = find_sql_table(tr, s, name);
 
        if (!t) {
                TRC_ERROR(SQL_STORE, "sql_trans_drop_table: Table %s.%s does 
not exist\n", s->base.name, name);
                return -1;
        }
 
+       sql_table *gt = t;
        if (t && isTempTable(t)) {
-               gt = find_sql_table_id(tr, s, t->base.id);
-               assert(t == gt); // TODO tempscs2os: Check if this code is ever 
different
-               if (gt)
-                       t = gt;
-       }
-       int is_global = isGlobal(t), res = LOG_OK;
-       sql_base *n = NULL;
-
-       if (!is_global || gt)
-               n = os_find_id(tr->_localtmps, tr, t->base.id);
+               gt = (sql_table*)os_find_id(s->tables, tr, t->base.id);
+       }
+
+       assert(t == gt || !gt || (isTempTable(gt) && !isLocalTemp(gt) && 
isLocalTemp(t)));
+
+       int res = LOG_OK;
 
        if ((drop_action == DROP_CASCADE_START || drop_action == DROP_CASCADE) 
&&
            tr->dropped && list_find_id(tr->dropped, t->base.id))
@@ -5860,11 +5875,10 @@ sql_trans_drop_table(sql_trans *tr, sql_
                        return res;
 
        t->base.deleted = 1;
-       if (is_global) {
-               if ((res = os_del(s->tables, tr, t->base.name, 
dup_base(&t->base))))
-                       return res;
-       }
-       if (n && (res =os_del(tr->_localtmps, tr, n->name, dup_base(n))))
+       
+       if (gt && (res = os_del(s->tables, tr, gt->base.name, 
dup_base(&gt->base))))
+               return res;
+       if (t != gt && (res =os_del(tr->_localtmps, tr, t->base.name, 
dup_base(&t->base))))
                return res;
 
        sqlstore *store = tr->store;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to