Changeset: 1cdb0e350453 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1cdb0e350453
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_transaction.c
        sql/backends/monet5/sql_user.c
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/server/sql_mvc.c
        sql/server/sql_privileges.c
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: Apr2019
Log Message:

move active flag from session into transaction (improved transaction start/end
verification)
Added stime field on base object level. This field is needed for keeping
the version of the object at start of the transaction (solves problems
with out of sink objects (deletes/inserts).


diffs (truncated from 883 to 300 lines):

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
@@ -251,7 +251,7 @@ SQLabort(Client cntxt, MalBlkPtr mb, Mal
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
 
-       if (sql->session->active) {
+       if (sql->session->tr->active) {
                msg = mvc_rollback(sql, 0, NULL, false);
        }
        return msg;
@@ -1921,7 +1921,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
        sql_table *t;
        sql_column *c;
        BAT *tids;
-       size_t nr, inr = 0;
+       size_t nr, inr = 0, dcnt;
        oid sb = 0;
 
        *res = bat_nil;
@@ -1964,7 +1964,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
        if (tids == NULL)
                throw(SQL, "sql.tid", SQLSTATE(HY001) MAL_MALLOC_FAIL);
 
-       if (store_funcs.count_del(tr, t)) {
+       if ((dcnt=store_funcs.count_del(tr, t)) > 0) {
                BAT *d = store_funcs.bind_del(tr, t, RD_INS);
                BAT *diff;
                if (d == NULL) {
@@ -1973,6 +1973,8 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
                }
 
                diff = BATdiff(tids, d, NULL, NULL, false, BUN_NONE);
+               (void)dcnt;
+               assert(pci->argc == 6 || BATcount(diff) == (nr-dcnt));
                BBPunfix(d->batCacheid);
                BBPunfix(tids->batCacheid);
                if (diff == NULL)
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -867,6 +867,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                return msg;
        if ((msg = checkSQLContext(c)) != NULL)
                return msg;
+       SQLtrans(m);
        if (!m->sa)
                m->sa = sa_create();
        if (!m->sa)
@@ -900,6 +901,10 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                        resetMalBlk(c->curprg->def, oldstop);
                        freeVariables(c, c->curprg->def, NULL, oldvtop);
                }
+               if (!msg)
+                       msg = mvc_commit(m, 0, NULL, false);
+               else
+                       msg = mvc_rollback(m, 0, NULL, false);
        }
        return msg;
 }
@@ -934,6 +939,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
                return msg;
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
+       SQLtrans(m);
        if (!m->sa)
                m->sa = sa_create();
        if (!m->sa)
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -329,11 +329,11 @@ SQLresetClient(Client c)
                mvc *m = be->mvc;
 
                assert(m->session);
-               if (m->session->auto_commit && m->session->active) {
+               if (m->session->auto_commit && m->session->tr->active) {
                        if (mvc_status(m) >= 0)
                                msg = mvc_commit(m, 0, NULL, false);
                }
-               if (m->session->active)
+               if (m->session->tr->active)
                        other = mvc_rollback(m, 0, NULL, false);
 
                res_tables_destroy(m->results);
@@ -555,7 +555,9 @@ SQLinit(Client c)
                if (!m->sa) {
                        msg = createException(MAL, "createdb", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                } else if (maybeupgrade) {
+                       SQLtrans(m);
                        SQLupgrades(c,m);
+                       msg = mvc_commit(m, 0, NULL, false);
                }
                maybeupgrade = 0;
        }
@@ -631,7 +633,7 @@ SQLautocommit(mvc *m)
 {
        str msg = MAL_SUCCEED;
 
-       if (m->session->auto_commit && m->session->active) {
+       if (m->session->auto_commit && m->session->tr->active) {
                if (mvc_status(m) < 0) {
                        msg = mvc_rollback(m, 0, NULL, false);
                } else {
@@ -645,7 +647,7 @@ void
 SQLtrans(mvc *m)
 {
        m->caching = m->cache;
-       if (!m->session->active) {
+       if (!m->session->tr->active) {
                sql_session *s;
 
                if(mvc_trans(m) < 0) {
@@ -1109,7 +1111,7 @@ SQLparser(Client c)
                        commit = (!m->session->auto_commit && v);
                        m->session->auto_commit = (v) != 0;
                        m->session->ac_on_commit = m->session->auto_commit;
-                       if (m->session->active) {
+                       if (m->session->tr->active) {
                                if (commit) {
                                        msg = mvc_commit(m, 0, NULL, true);
                                } else {
diff --git a/sql/backends/monet5/sql_transaction.c 
b/sql/backends/monet5/sql_transaction.c
--- a/sql/backends/monet5/sql_transaction.c
+++ b/sql/backends/monet5/sql_transaction.c
@@ -106,7 +106,7 @@ SQLtransaction_begin(Client cntxt, MalBl
 
        if (sql->session->auto_commit == 0)
                throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION: 
cannot start a transaction within a transaction");
-       if (sql->session->active)
+       if (sql->session->tr->active)
                msg = mvc_rollback(sql, 0, NULL, false);
        sql->session->auto_commit = 0;
        sql->session->ac_on_commit = 1;
@@ -135,7 +135,7 @@ SQLtransaction2(Client cntxt, MalBlkPtr 
                return msg;
        if (sql->session->auto_commit == 0)
                throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION: 
cannot start a transaction within a transaction");
-       if (sql->session->active)
+       if (sql->session->tr->active)
                msg = mvc_rollback(sql, 0, NULL, false);
        sql->session->auto_commit = 0;
        sql->session->ac_on_commit = 1;
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
@@ -552,7 +552,7 @@ monet5_user_set_def_schema(mvc *m, oid u
        }
 
        if (!schema || !mvc_set_schema(m, schema)) {
-               if (m->session->active) {
+               if (m->session->tr->active) {
                        if((other = mvc_rollback(m, 0, NULL, false)) != 
MAL_SUCCEED)
                                freeException(other);
                }
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -140,6 +140,7 @@ base_init(sql_allocator *sa, sql_base * 
        assert(sa);
        b->wtime = 0;
        b->rtime = 0;
+       b->stime = 0;
        b->flags = flags;
        b->name = NULL;
        b->refcnt = 1;
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
@@ -193,6 +193,7 @@ typedef int sqlid;
 typedef struct sql_base {
        int wtime;
        int rtime;
+       int stime;
        int allocated;
        int flags;
        int refcnt;
@@ -244,6 +245,7 @@ typedef struct sql_trans {
        int wtime;
        int schema_number;      /* schema timestamp */
        int schema_updates;     /* set on schema changes */
+       int active;             /* active transaction */
        int status;             /* status of the last query */
        list *dropped;          /* protection against recursive cascade action*/
        list *moved_tables;
@@ -641,7 +643,6 @@ typedef struct sql_session {
                                   commit, rollback, etc. */
        char auto_commit;
        int level;              /* TRANSACTION isolation level */
-       int active;             /* active transaction */
        int status;             /* status, ok/error */
        backend_stack stk;
 } sql_session;
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
@@ -284,7 +284,7 @@ int
 mvc_trans(mvc *m)
 {
        int schema_changed = 0, err = m->session->status;
-       assert(!m->session->active);    /* can only start a new transaction */
+       assert(!m->session->tr->active);        /* can only start a new 
transaction */
 
        store_lock();
        if (GDKverbose >= 1)
@@ -371,7 +371,7 @@ mvc_commit(mvc *m, int chain, const char
        char operation[BUFSIZ];
 
        assert(tr);
-       assert(m->session->active);     /* only commit an active transaction */
+       assert(m->session->tr->active); /* only commit an active transaction */
 
        if (mvc_debug)
                fprintf(stderr, "#mvc_commit %s\n", (name) ? name : "");
@@ -520,7 +520,7 @@ mvc_rollback(mvc *m, int chain, const ch
                fprintf(stderr, "#mvc_rollback %s\n", (name) ? name : "");
 
        assert(tr);
-       assert(m->session->active);     /* only abort an active transaction */
+       assert(m->session->tr->active); /* only abort an active transaction */
        (void) disabling_auto_commit;
 
        store_lock();
@@ -588,7 +588,7 @@ mvc_release(mvc *m, const char *name)
        str msg = MAL_SUCCEED;
 
        assert(tr);
-       assert(m->session->active);     /* only release active transactions */
+       assert(m->session->tr->active); /* only release active transactions */
 
        if (mvc_debug)
                fprintf(stderr, "#mvc_release %s\n", (name) ? name : "");
@@ -714,7 +714,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w
                fprintf(stderr, "#mvc_reset\n");
        tr = m->session->tr;
        if (tr && tr->parent) {
-               assert(m->session->active == 0);
+               assert(m->session->tr->active == 0);
                store_lock();
                while (tr->parent->parent != NULL) 
                        tr = sql_trans_destroy(tr);
@@ -783,7 +783,7 @@ mvc_destroy(mvc *m)
        tr = m->session->tr;
        if (tr) {
                store_lock();
-               if (m->session->active)
+               if (m->session->tr->active)
                        sql_trans_end(m->session);
                while (tr->parent)
                        tr = sql_trans_destroy(tr);
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -736,7 +736,7 @@ mvc_set_schema(mvc *m, char *schema)
                        _DELETE(m->session->schema_name);
                m->session->schema_name = new_schema_name;
                m->type = Q_TRANS;
-               if (m->session->active)
+               if (m->session->tr->active)
                        m->session->schema = s;
                ret = 1;
        } else if(new_schema_name) {
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
@@ -15,22 +15,11 @@
 
 #define SNAPSHOT_MINSIZE ((BUN) 1024*128)
 
-static sql_trans *
-oldest_active_transaction(void)
-{
-       sql_session *s = active_sessions->h->data;
-       return s->tr;
-}
-
 sql_delta *
 timestamp_delta( sql_delta *d, int ts)
 {
        while (d->next && d->wtime > ts) 
                d = d->next;
-       if (/* DISABLES CODE */ (0) && d && d->cached) {
-               bat_destroy(d->cached);
-               d->cached = NULL;
-       }
        return d;
 }
 
@@ -39,10 +28,6 @@ timestamp_dbat( sql_dbat *d, int ts)
 {
        while (d->next && d->wtime > ts) 
                d = d->next;
-       if (/* DISABLES CODE */ (0) && d && d->cached) {
-               bat_destroy(d->cached);
-               d->cached = NULL;
-       }
        return d;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to