Changeset: 27cc360f2c12 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/27cc360f2c12
Modified Files:
        sql/server/sql_mvc.c
        sql/storage/store.c
        sql/test/transactions/Tests/transaction_isolation5.SQL.py
Branch: Jan2022
Log Message:

Start a new transaction after rollbacking into a savepoint, so a new 
transaction ts is created. Cleanup and approval


diffs (87 lines):

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
@@ -642,10 +642,15 @@ mvc_rollback(mvc *m, int chain, const ch
                                tr->status = 1;
                        tr = sql_trans_destroy(tr);
                }
-               m->session->tr = tr;    /* restart at savepoint */
-               m->session->status = tr->status;
-               if (!(m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name))) {
-                       msg = createException(SQL, "sql.rollback", 
SQLSTATE(40000) "ROLLBACK: finished successfully, but the session's schema 
could not be found on the current transaction");
+               /* start a new transaction after rolling back */
+               if (!(m->session->tr = tr = sql_trans_create(m->store, tr, 
name))) {
+                       msg = createException(SQL, "sql.rollback", 
SQLSTATE(HY013) "ROLLBACK TO SAVEPOINT: allocation failure while restarting 
savepoint");
+                       m->session->status = -1;
+                       return msg;
+               }
+               m->session->status = tr->parent->status;
+               if (!(m->session->schema = find_sql_schema(tr, 
m->session->schema_name))) {
+                       msg = createException(SQL, "sql.rollback", 
SQLSTATE(40000) "ROLLBACK TO SAVEPOINT: finished successfully, but the 
session's schema could not be found on the current transaction");
                        m->session->status = -1;
                        return msg;
                }
@@ -714,7 +719,6 @@ mvc_release(mvc *m, const char *name)
                tr = sql_trans_destroy(tr);
        }
        _DELETE(tr->name); /* name will no longer be used */
-       tr->name = NULL;
        m->session->tr = tr;
        m->session->status = tr->status;
        if (!(m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name))) {
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3691,10 +3691,7 @@ sql_trans_destroy(sql_trans *tr)
        sql_trans *res = tr->parent;
 
        TRC_DEBUG(SQL_STORE, "Destroy transaction: %p\n", tr);
-       if (tr->name) {
-               _DELETE(tr->name);
-               tr->name = NULL;
-       }
+       _DELETE(tr->name);
        if (!list_empty(tr->changes))
                sql_trans_rollback(tr, false);
        sqlstore *store = tr->store;
@@ -3728,7 +3725,8 @@ sql_trans_create_(sqlstore *store, sql_t
                        sql_trans_destroy(tr);
                        return NULL;
                }
-               parent->name = SA_STRDUP(parent->sa, name);
+               _DELETE(parent->name);
+               parent->name = _STRDUP(name);
        }
 
        store_lock(store);
@@ -6994,9 +6992,9 @@ sql_trans_begin(sql_session *s)
        (void) ATOMIC_INC(&store->nr_active);
        list_append(store->active, s);
 
-       s->status = 0;
        TRC_DEBUG(SQL_STORE, "Exit sql_trans_begin for transaction: " ULLFMT 
"\n", tr->tid);
        store_unlock(store);
+       s->status = tr->status = 0;
        return 0;
 }
 
@@ -7011,6 +7009,7 @@ sql_trans_end(sql_session *s, int ok)
        }
        assert(s->tr->active);
        s->tr->active = 0;
+       s->tr->status = 0;
        s->auto_commit = s->ac_on_commit;
        sqlstore *store = s->tr->store;
        store_lock(store);
diff --git a/sql/test/transactions/Tests/transaction_isolation5.SQL.py 
b/sql/test/transactions/Tests/transaction_isolation5.SQL.py
--- a/sql/test/transactions/Tests/transaction_isolation5.SQL.py
+++ b/sql/test/transactions/Tests/transaction_isolation5.SQL.py
@@ -6,7 +6,7 @@ with SQLTestCase() as mdb1:
     mdb1.execute('SAVEPOINT mys;').assertSucceeded()
     mdb1.execute('CREATE SCHEMA ups;').assertSucceeded()
     mdb1.execute('SET SCHEMA ups;').assertSucceeded()
-    mdb1.execute('ROLLBACK TO SAVEPOINT mys;').assertFailed(err_code="40000", 
err_message="ROLLBACK: finished successfully, but the session's schema could 
not be found on the current transaction")
+    mdb1.execute('ROLLBACK TO SAVEPOINT mys;').assertFailed(err_code="40000", 
err_message="ROLLBACK TO SAVEPOINT: finished successfully, but the session's 
schema could not be found on the current transaction")
     mdb1.execute('rollback;').assertFailed()
 
 with SQLTestCase() as mdb1:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to