Changeset: 97c62b87bcdb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=97c62b87bcdb
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/include/sql_catalog.h
        sql/server/sql_mvc.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/bat/bat_table.c
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/BugTracker-2010/Tests/All
Branch: nospare
Log Message:

initial steps for
        - temp schema (just keep the temp schema copied (not the tables))
        - savepoints, keep eye on the recursive (parent) transaction.


diffs (truncated from 1109 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1325,10 +1325,11 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 static stmt *
 stmt_col( backend *be, sql_column *c, stmt *del, int part)
 {
+       sql_trans *tr = be->mvc->session->tr;
        stmt *sc = stmt_bat(be, c, RDONLY, part);
 
        if (isTable(c->t) && c->t->access != TABLE_READONLY &&
-          (!isNew(c) || !isNew(c->t) /* alter */) &&
+          (!isNew(c) || !inTransaction(tr, c) || !isNew(c->t) /* alter */) &&
           (c->t->persistence == SQL_PERSIST || c->t->s) && 
!c->t->commit_action) {
                stmt *i = stmt_bat(be, c, RD_INS, 0);
                stmt *u = stmt_bat(be, c, RD_UPD_ID, part);
@@ -1344,10 +1345,11 @@ stmt_col( backend *be, sql_column *c, st
 static stmt *
 stmt_idx( backend *be, sql_idx *i, stmt *del, int part)
 {
+       sql_trans *tr = be->mvc->session->tr;
        stmt *sc = stmt_idxbat(be, i, RDONLY, part);
 
        if (isTable(i->t) && i->t->access != TABLE_READONLY &&
-          (!isNew(i) || !isNew(i->t) /* alter */) &&
+          (!isNew(i) || !inTransaction(tr, i) || !isNew(i->t) /* alter */) &&
           (i->t->persistence == SQL_PERSIST || i->t->s) && 
!i->t->commit_action) {
                stmt *ic = stmt_idxbat(be, i, RD_INS, 0);
                stmt *u = stmt_idxbat(be, i, RD_UPD_ID, part);
@@ -4056,6 +4058,7 @@ static stmt *
 update_check_ukey(backend *be, stmt **updates, sql_key *k, stmt *tids, stmt 
*idx_updates, int updcol)
 {
        mvc *sql = be->mvc;
+       //sql_trans *tr = sql->session->tr;
        char *msg = NULL;
        stmt *res = NULL;
 
@@ -4076,7 +4079,7 @@ update_check_ukey(backend *be, stmt **up
                        This is done using a relation join and a count (which
                        should be zero)
                */
-               if (!isNew(k)) {
+               if (!isNew(k) /*|| !inTransaction(tr, k)*/) {
                        stmt *nu_tids = stmt_tdiff(be, dels, tids, NULL); /* 
not updated ids */
                        list *lje = sa_list(sql->sa);
                        list *rje = sa_list(sql->sa);
@@ -4189,7 +4192,7 @@ update_check_ukey(backend *be, stmt **up
                stmt *s = NULL, *h = NULL, *o;
 
                /* s should be empty */
-               if (!isNew(k)) {
+               if (!isNew(k) /*|| !inTransaction(tr, k)*/) {
                        stmt *nu_tids = stmt_tdiff(be, dels, tids, NULL); /* 
not updated ids */
                        assert (updates);
 
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2353,10 +2353,10 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
                throw(SQL, "sql.tid", SQLSTATE(42S02) "Table missing 
%s.%s",sname,tname);
        c = t->columns.set->h->data;
 
-       sqlstore *store = m->session->tr->store;
+       sqlstore *store = m->store;
        nr = store->storage_api.count_col(tr, c, 1);
 
-       if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter */ 
) &&
+       if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter */ 
|| !inTransaction(tr, t)) &&
            t->persistence == SQL_PERSIST && !t->commit_action)
                inr = store->storage_api.count_col(tr, c, 0);
        nr -= inr;
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -68,7 +68,7 @@ table_has_updates(sql_trans *tr, sql_tab
                if ( b == 0)
                        return -1;
                cnt |= BATcount(b) > 0;
-               if (isTable(t) && t->access != TABLE_READONLY && (!isNew(t) /* 
alter */ ) &&
+               if (isTable(t) && t->access != TABLE_READONLY && (!isNew(t) /* 
alter */ /*|| !inTransaction(tr, t)*/) &&
                    t->persistence == SQL_PERSIST && !t->commit_action)
                        cnt |= store->storage_api.count_col(tr, c, 0) > 0;
                BBPunfix(b->batCacheid);
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
@@ -730,6 +730,8 @@ extern void column_destroy(sql_column *c
 extern void key_destroy(sql_key *k);
 extern void idx_destroy(sql_idx * i);
 
+extern int tr_version_of_parent(sql_trans *tr, ulng ts);
+
 extern int base_key(sql_base *b);
 extern node *list_find_name(list *l, const char *name);
 extern node *list_find_id(list *l, sqlid id);
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -479,7 +479,7 @@ mvc_trans(mvc *m)
 str
 mvc_commit(mvc *m, int chain, const char *name, bool enabling_auto_commit)
 {
-       sql_trans *cur, *tr = m->session->tr, *ctr;
+       sql_trans *tr = m->session->tr;
        int ok = SQL_OK;
        str msg = NULL, other;
        char operation[BUFSIZ];
@@ -501,7 +501,7 @@ mvc_commit(mvc *m, int chain, const char
                return msg;
        }
 
-       /* savepoint then simply make a copy of the current transaction */
+       /* savepoint, simply make a new sub transaction */
        if (name && name[0] != '\0') {
                sql_trans *tr = m->session->tr;
                TRC_DEBUG(SQL_TRANS, "Savepoint\n");
@@ -514,13 +514,7 @@ mvc_commit(mvc *m, int chain, const char
                                freeException(other);
                        return msg;
                }
-               msg = WLCcommit(m->clientid);
                store_unlock(m->store);
-               if (msg != MAL_SUCCEED) {
-                       if ((other = mvc_rollback(m, chain, name, false)) != 
MAL_SUCCEED)
-                               freeException(other);
-                       return msg;
-               }
                m->type = Q_TRANS;
                m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name);
                TRC_INFO(SQL_TRANS, "Savepoint commit '%s' done\n", name);
@@ -535,28 +529,28 @@ mvc_commit(mvc *m, int chain, const char
                        msg = createException(SQL, "sql.commit", 
SQLSTATE(40000) "%s transaction is aborted because of concurrency conflicts, 
will ROLLBACK instead", operation);
                        return msg;
                }
+               msg = WLCcommit(m->clientid);
                store_unlock(m->store);
+               if (msg != MAL_SUCCEED) {
+                       if ((other = mvc_rollback(m, chain, name, false)) != 
MAL_SUCCEED)
+                               freeException(other);
+                       return msg;
+               }
                return msg;
        }
 
-       /* first release all intermediate savepoints */
-       ctr = cur = tr;
-       tr = tr->parent;
+       /* commit and cleanup nested transactions */
        if (tr->parent) {
                store_lock(m->store);
-               /* change to sql_trans_commit */
-               while (ctr->parent->parent != NULL && ok == SQL_OK) {
-                       if ((ok = sql_trans_commit(ctr)) != SQL_OK) {
+               while (tr->parent != NULL && ok == SQL_OK) {
+                       if ((ok = sql_trans_commit(tr)) != SQL_OK) {
                                GDKfatal("%s transaction commit failed (perhaps 
your disk is full?) exiting (kernel error: %s)", operation, GDKerrbuf);
                        }
-                       cur = ctr = sql_trans_destroy(ctr);
-                       tr = cur->parent;
+                       tr = sql_trans_destroy(tr);
                }
                store_unlock(m->store);
-               m->session->tr = cur;
+               m->session->tr = tr;
        }
-       cur -> parent = tr;
-       tr = cur;
 
        store_lock(m->store);
        /* if there is nothing to commit reuse the current transaction */
@@ -564,6 +558,7 @@ mvc_commit(mvc *m, int chain, const char
                if (!chain)
                        (void)sql_trans_end(m->session, 1);
                m->type = Q_TRANS;
+               /* save points not handled by WLC...
                msg = WLCcommit(m->clientid);
                store_unlock(m->store);
                if (msg != MAL_SUCCEED) {
@@ -571,6 +566,8 @@ mvc_commit(mvc *m, int chain, const char
                                freeException(other);
                        return msg;
                }
+               */
+               store_unlock(m->store);
                TRC_INFO(SQL_TRANS,
                        "Commit done (no changes)\n");
                return msg;
@@ -579,6 +576,7 @@ mvc_commit(mvc *m, int chain, const char
        if ((ok = sql_trans_commit(tr)) != SQL_OK) {
                GDKfatal("%s transaction commit failed (perhaps your disk is 
full?) exiting (kernel error: %s)", operation, GDKerrbuf);
        }
+       /*
        msg = WLCcommit(m->clientid);
        if (msg != MAL_SUCCEED) {
                store_unlock(m->store);
@@ -586,6 +584,7 @@ mvc_commit(mvc *m, int chain, const char
                        freeException(other);
                return msg;
        }
+       */
        (void)sql_trans_end(m->session, 1);
        if (chain)
                sql_trans_begin(m->session);
@@ -628,13 +627,10 @@ mvc_rollback(mvc *m, int chain, const ch
                if (tr->name)
                        tr->name = NULL;
                m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name);
-       } else { //if (tr->parent) {
+       } else {
                /* first release all intermediate savepoints */
-               /* savepoints !
-               while (tr->parent->parent != NULL) {
+               while (tr->parent != NULL)
                        tr = sql_trans_destroy(tr);
-               }
-               */
                m->session-> tr = tr;
                /* make sure we do not reuse changed data */
                if (tr->changes)
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
@@ -12,8 +12,6 @@
 #include "sql_string.h"
 #include "gdk_atoms.h"
 
-#define inTransaction(tr, obj) (((sql_base*)obj)->ts == tr->tid)
-
 static int log_update_col( sql_trans *tr, sql_change *c, ulng commit_ts, ulng 
oldest);
 static int log_update_idx( sql_trans *tr, sql_change *c, ulng commit_ts, ulng 
oldest);
 static int log_update_del( sql_trans *tr, sql_change *c, ulng commit_ts, ulng 
oldest);
@@ -28,17 +26,17 @@ sql_dbat *tobe_destroyed_dbat = NULL;
 sql_delta *tobe_destroyed_delta = NULL;
 
 sql_delta *
-timestamp_delta( sql_delta *d, ulng tid, ulng ts)
+timestamp_delta( sql_trans *tr, sql_delta *d)
 {
-       while (d->next && d->ts != tid && d->ts > ts)
+       while (d->next && d->ts != tr->tid && (tr->parent && 
!tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts)
                d = d->next;
        return d;
 }
 
 sql_dbat *
-timestamp_dbat( sql_dbat *d, ulng tid, ulng ts)
+timestamp_dbat( sql_trans *tr, sql_dbat *d)
 {
-       while (d->next && d->ts != tid && d->ts > ts)
+       while (d->next && d->ts != tr->tid && (tr->parent && 
!tr_version_of_parent(tr, d->ts)) && d->ts > tr->ts)
                d = d->next;
        return d;
 }
@@ -63,7 +61,7 @@ bind_del(sql_trans *tr, sql_table *t, in
        assert(access == QUICK || tr->active);
        if (!t->data) {
                sql_table *ot = tr_find_table(tr->parent, t);
-               t->data = timestamp_dbat(ot->data, tr->tid, tr->ts);
+               t->data = timestamp_dbat(tr, ot->data);
        }
        return delta_bind_del(t->data, access);
 }
@@ -105,11 +103,11 @@ bind_ucol(sql_trans *tr, sql_column *c, 
        assert(tr->active);
        if (!c->data) {
                sql_column *oc = tr_find_column(tr->parent, c);
-               c->data = timestamp_delta(oc->data, tr->tid, tr->ts);
+               c->data = timestamp_delta(tr, oc->data);
        }
        if (!c->t->data) {
                sql_table *ot = tr_find_table(tr->parent, c->t);
-               c->t->data = timestamp_dbat(ot->data, tr->tid, tr->ts);
+               c->t->data = timestamp_dbat(tr, ot->data);
        }
        u = delta_bind_ubat(c->data, access, c->type.type->localtype);
        return u;
@@ -123,11 +121,11 @@ bind_uidx(sql_trans *tr, sql_idx * i, in
        assert(tr->active);
        if (!i->data) {
                sql_idx *oi = tr_find_idx(tr->parent, i);
-               i->data = timestamp_delta(oi->data, tr->tid, tr->ts);
+               i->data = timestamp_delta(tr, oi->data);
        }
        if (!i->t->data) {
                sql_table *ot = tr_find_table(tr->parent, i->t);
-               i->t->data = timestamp_dbat(ot->data, tr->tid, tr->ts);
+               i->t->data = timestamp_dbat(tr, ot->data);
        }
        u = delta_bind_ubat(i->data, access, 
(oid_index(i->type))?TYPE_oid:TYPE_lng);
        return u;
@@ -210,7 +208,7 @@ bind_col(sql_trans *tr, sql_column *c, i
                return NULL;
        if (!c->data) {
                sql_column *oc = tr_find_column(tr->parent, c);
-               c->data = timestamp_delta(oc->data, tr->tid, tr->ts);
+               c->data = timestamp_delta(tr, oc->data);
        }
        if (access == RD_UPD_ID || access == RD_UPD_VAL)
                return bind_ucol(tr, c, access);
@@ -225,7 +223,7 @@ bind_idx(sql_trans *tr, sql_idx * i, int
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to