Changeset: aec3dfc4d53b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/aec3dfc4d53b
Modified Files:
        sql/server/sql_mvc.c
Branch: Jan2022
Log Message:

Always reset session's transaction to parent when child is destroyed.


diffs (67 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
@@ -562,11 +562,10 @@ mvc_commit(mvc *m, int chain, const char
                while (tr->parent != NULL && ok == SQL_OK) {
                        if ((ok = sql_trans_commit(tr)) == SQL_ERR)
                                GDKfatal("%s transaction commit failed; exiting 
(kernel error: %s)", operation, GDKerrbuf);
-                       tr = sql_trans_destroy(tr);
+                       m->session->tr = tr = sql_trans_destroy(tr);
                }
                while (tr->parent != NULL)
-                       tr = sql_trans_destroy(tr);
-               m->session->tr = tr;
+                       m->session->tr = tr = sql_trans_destroy(tr);
                if (ok != SQL_OK)
                        msg = createException(SQL, "sql.commit", 
SQLSTATE(40001) "%s transaction is aborted because of concurrency conflicts, 
will ROLLBACK instead", operation);
        }
@@ -640,7 +639,7 @@ mvc_rollback(mvc *m, int chain, const ch
                        /* make sure we do not reuse changed data */
                        if (!list_empty(tr->changes))
                                tr->status = 1;
-                       tr = sql_trans_destroy(tr);
+                       m->session->tr = tr = sql_trans_destroy(tr);
                }
                /* start a new transaction after rolling back */
                if (!(m->session->tr = tr = sql_trans_create(m->store, tr, 
name))) {
@@ -657,8 +656,7 @@ mvc_rollback(mvc *m, int chain, const ch
        } else {
                /* first release all intermediate savepoints */
                while (tr->parent != NULL)
-                       tr = sql_trans_destroy(tr);
-               m->session-> tr = tr;
+                       m->session-> tr = tr = sql_trans_destroy(tr);
                /* make sure we do not reuse changed data */
                if (!list_empty(tr->changes))
                        tr->status = 1;
@@ -716,10 +714,9 @@ mvc_release(mvc *m, const char *name)
                /* commit all intermediate savepoints */
                if (sql_trans_commit(tr) != SQL_OK)
                        GDKfatal("release savepoints should not fail");
-               tr = sql_trans_destroy(tr);
+               m->session->tr = tr = sql_trans_destroy(tr);
        }
-       _DELETE(tr->name); /* name will no longer be used */
-       m->session->tr = tr;
+       _DELETE(m->session->tr->name); /* name will no longer be used */
        m->session->status = tr->status;
        if (!(m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name))) {
                msg = createException(SQL, "sql.release", SQLSTATE(40000) 
"RELEASE: finished successfully, but the session's schema could not be found on 
the current transaction");
@@ -835,7 +832,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w
        if (tr && tr->parent) {
                assert(m->session->tr->active == 0);
                while (tr->parent->parent != NULL)
-                       tr = sql_trans_destroy(tr);
+                       m->session->tr = tr = sql_trans_destroy(tr);
        }
        reset = sql_session_reset(m->session, 1 /*autocommit on*/);
        if (tr && !reset)
@@ -889,7 +886,7 @@ mvc_destroy(mvc *m)
                if (m->session->tr->active)
                        (void)sql_trans_end(m->session, SQL_ERR);
                while (tr->parent)
-                       tr = sql_trans_destroy(tr);
+                       m->session->tr = tr = sql_trans_destroy(tr);
        }
        sql_session_destroy(m->session);
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to