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]