changeset 86187:aec3dfc4d53b Jan2022

Always reset session's transaction to parent when child is destroyed.
author Aris Koning <aris.koning@monetdbsolutions.com>
date Thu, 28 Jul 2022 16:17:07 +0200
parents 4fc3f6aa9a8f
children ec241b102d85 daea8245a12f
files sql/server/sql_mvc.c
diffstat 1 files changed, 8 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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);