Changeset: 9f365252b31c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9f365252b31c
Modified Files:
sql/server/sql_mvc.c
sql/test/Tests/savepoints2.test
Branch: Jan2022
Log Message:
Fixed rollback twice to savepoint issue, but tables still have wrong contents
diffs (130 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
@@ -630,7 +630,7 @@ mvc_rollback(mvc *m, int chain, const ch
if (name && name[0] != '\0') {
while (tr && (!tr->name || strcmp(tr->name, name) != 0))
tr = tr->parent;
- if (!tr) {
+ if (!tr || !tr->name || strcmp(tr->name, name) != 0) {
msg = createException(SQL, "sql.rollback",
SQLSTATE(42000) "ROLLBACK TO SAVEPOINT: no such savepoint: '%s'", name);
m->session->status = -1;
return msg;
@@ -644,10 +644,6 @@ mvc_rollback(mvc *m, int chain, const ch
}
m->session->tr = tr; /* restart at savepoint */
m->session->status = tr->status;
- if (tr->name) {
- _DELETE(tr->name);
- tr->name = NULL;
- }
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");
m->session->status = -1;
@@ -691,12 +687,10 @@ mvc_rollback(mvc *m, int chain, const ch
str
mvc_release(mvc *m, const char *name)
{
- int ok = SQL_OK;
sql_trans *tr = m->session->tr;
str msg = MAL_SUCCEED;
- assert(tr);
- assert(m->session->tr->active); /* only release active transactions */
+ assert(tr && tr->active); /* only release active transactions */
TRC_DEBUG(SQL_TRANS, "Release: %s\n", (name) ? name : "");
@@ -708,20 +702,21 @@ mvc_release(mvc *m, const char *name)
while (tr && (!tr->name || strcmp(tr->name, name) != 0))
tr = tr->parent;
if (!tr || !tr->name || strcmp(tr->name, name) != 0) {
- msg = createException(SQL, "sql.release", SQLSTATE(42000)
"Release savepoint %s doesn't exist", name);
+ msg = createException(SQL, "sql.release", SQLSTATE(42000)
"RELEASE: no such savepoint: '%s'", name);
m->session->status = -1;
return msg;
}
tr = m->session->tr;
- while (ok == SQL_OK && (!tr->name || strcmp(tr->name, name) != 0)) {
+ while (!tr->name || strcmp(tr->name, name) != 0) {
/* commit all intermediate savepoints */
if (sql_trans_commit(tr) != SQL_OK)
GDKfatal("release savepoints should not fail");
tr = sql_trans_destroy(tr);
}
- _DELETE(tr->name);
+ _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))) {
msg = createException(SQL, "sql.release", SQLSTATE(40000)
"RELEASE: finished successfully, but the session's schema could not be found on
the current transaction");
m->session->status = -1;
diff --git a/sql/test/Tests/savepoints2.test b/sql/test/Tests/savepoints2.test
--- a/sql/test/Tests/savepoints2.test
+++ b/sql/test/Tests/savepoints2.test
@@ -81,3 +81,64 @@ select * from savepointtest
statement error
commit
+statement ok
+start transaction
+
+statement ok
+create table x(x int)
+
+statement ok rowcount 1
+insert into x values (1)
+
+query I rowsort
+SELECT x FROM x
+----
+1
+
+statement ok
+savepoint sp1
+
+statement ok rowcount 1
+insert into x values (2)
+
+query I rowsort
+SELECT x FROM x
+----
+1
+2
+
+# give one error
+statement error
+ups
+
+statement ok
+rollback to savepoint sp1
+
+query I rowsort
+SELECT x FROM x
+----
+1
+
+statement ok rowcount 1
+insert into x values (3)
+
+query I rowsort
+SELECT x FROM x
+----
+1
+3
+
+# give another error
+statement error
+mistake
+
+statement ok
+rollback to savepoint sp1
+
+query I rowsort
+SELECT x FROM x
+----
+1
+
+statement ok
+rollback
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list