Changeset: dd8f3134fbb3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dd8f3134fbb3
Added Files:
sql/test/transactions/Tests/chaining.test
Modified Files:
sql/backends/monet5/sql_transaction.c
sql/backends/monet5/wlr.c
sql/server/sql_mvc.c
sql/test/transactions/Tests/All
Branch: Jan2022
Log Message:
Disable auto-commit while chaining, because a new transaction starts. Also for
other possible values for 'auto_commit' flag
diffs (231 lines):
diff --git a/sql/backends/monet5/sql_transaction.c
b/sql/backends/monet5/sql_transaction.c
--- a/sql/backends/monet5/sql_transaction.c
+++ b/sql/backends/monet5/sql_transaction.c
@@ -52,7 +52,7 @@ SQLtransaction_release(Client cntxt, Mal
initcontext();
(void) chain;
- if (sql->session->auto_commit == 1)
+ if (sql->session->auto_commit)
throw(SQL, "sql.trans", SQLSTATE(3BM30) "RELEASE SAVEPOINT: not
allowed in auto commit mode");
return mvc_release(sql, name);
}
@@ -67,11 +67,10 @@ SQLtransaction_commit(Client cntxt, MalB
initcontext();
- if (sql->session->auto_commit == 1) {
+ if (sql->session->auto_commit) {
if (name)
throw(SQL, "sql.trans", SQLSTATE(3BM30) "SAVEPOINT: not
allowed in auto commit mode");
- else
- throw(SQL, "sql.trans", SQLSTATE(2DM30) "COMMIT: not
allowed in auto commit mode");
+ throw(SQL, "sql.trans", SQLSTATE(2DM30) "COMMIT: not allowed in
auto commit mode");
}
return mvc_commit(sql, chain, name, false);
}
@@ -86,7 +85,7 @@ SQLtransaction_rollback(Client cntxt, Ma
initcontext();
- if (sql->session->auto_commit == 1)
+ if (sql->session->auto_commit)
throw(SQL, "sql.trans", SQLSTATE(2DM30) "ROLLBACK: not allowed
in auto commit mode");
return mvc_rollback(sql, chain, name, false);
}
@@ -101,7 +100,8 @@ SQLtransaction_begin(Client cntxt, MalBl
initcontext();
- if (sql->session->auto_commit == 0)
+ (void) chain;
+ if (!sql->session->auto_commit)
throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION:
cannot start a transaction within a transaction");
if (sql->session->tr->active)
msg = mvc_rollback(sql, 0, NULL, false);
@@ -118,6 +118,5 @@ SQLtransaction_begin(Client cntxt, MalBl
/* set transaction properties after successfuly starting */
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
- sql->session->level = chain;
return MAL_SUCCEED;
}
diff --git a/sql/backends/monet5/wlr.c b/sql/backends/monet5/wlr.c
--- a/sql/backends/monet5/wlr.c
+++ b/sql/backends/monet5/wlr.c
@@ -363,8 +363,7 @@ WLRprocessBatch(Client cntxt)
if(!msg && mb->errors == 0){
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
- sql->session->level = 0;
- if(mvc_trans(sql) < 0) {
+ if (mvc_trans(sql) < 0) {
TRC_ERROR(SQL_TRANS,
"Allocation failure while starting the transaction\n");
} else {
msg= runMAL(c,mb,0,0);
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
@@ -543,6 +543,17 @@ mvc_commit(mvc *m, int chain, const char
freeException(other);
return msg;
}
+ if (chain) {
+ if (sql_trans_begin(m->session) < 0) {
+ if (!msg)
+ msg = createException(SQL,
"sql.commit", SQLSTATE(40000) "%s finished successfully, but the session's
schema could not be found while starting the next transaction", operation);
+ } else {
+ m->session->auto_commit = 0; /* disable
auto-commit while chaining */
+ }
+ }
+ m->type = Q_TRANS;
+ TRC_INFO(SQL_TRANS,
+ "Commit done\n");
return msg;
}
@@ -595,8 +606,14 @@ mvc_commit(mvc *m, int chain, const char
default:
break;
}
- if (chain && sql_trans_begin(m->session) < 0 && !msg)
- msg = createException(SQL, "sql.commit", SQLSTATE(40000) "%s
finished successfully, but the session's schema could not be found while
starting the next transaction", operation);
+ if (chain) {
+ if (sql_trans_begin(m->session) < 0) {
+ if (!msg)
+ msg = createException(SQL, "sql.commit",
SQLSTATE(40000) "%s finished successfully, but the session's schema could not
be found while starting the next transaction", operation);
+ } else {
+ m->session->auto_commit = 0; /* disable auto-commit
while chaining */
+ }
+ }
m->type = Q_TRANS;
TRC_INFO(SQL_TRANS,
"Commit done\n");
@@ -648,8 +665,14 @@ mvc_rollback(mvc *m, int chain, const ch
if (!list_empty(tr->changes))
tr->status = 1;
(void)sql_trans_end(m->session, SQL_ERR);
- if (chain && sql_trans_begin(m->session) < 0)
- msg = createException(SQL, "sql.rollback",
SQLSTATE(40000) "ROLLBACK: finished successfully, but the session's schema
could not be found while starting the next transaction");
+ if (chain) {
+ if (sql_trans_begin(m->session) < 0) {
+ if (!msg)
+ msg = createException(SQL,
"sql.rollback", SQLSTATE(40000) "ROLLBACK: finished successfully, but the
session's schema could not be found while starting the next transaction");
+ } else {
+ m->session->auto_commit = 0; /* disable
auto-commit while chaining */
+ }
+ }
}
if (msg == MAL_SUCCEED)
msg = WLCrollback(m->clientid);
diff --git a/sql/test/transactions/Tests/All b/sql/test/transactions/Tests/All
--- a/sql/test/transactions/Tests/All
+++ b/sql/test/transactions/Tests/All
@@ -5,3 +5,4 @@ transaction_isolation4
transaction_isolation5
mergetable-deps-crash
view-deps
+chaining
diff --git a/sql/test/transactions/Tests/chaining.test
b/sql/test/transactions/Tests/chaining.test
new file mode 100644
--- /dev/null
+++ b/sql/test/transactions/Tests/chaining.test
@@ -0,0 +1,98 @@
+statement ok
+START TRANSACTION
+
+statement ok
+COMMIT AND CHAIN
+
+statement ok
+COMMIT
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE x (x int)
+
+query I nosort
+SELECT x FROM x
+----
+
+statement ok
+COMMIT AND CHAIN
+
+query I nosort
+SELECT x FROM x
+----
+
+statement ok rowcount 1
+INSERT INTO x VALUES (1)
+
+query I nosort
+SELECT x FROM x
+----
+1
+
+statement ok
+COMMIT
+
+query I nosort
+SELECT x FROM x
+----
+1
+
+statement ok
+START TRANSACTION
+
+query I nosort
+SELECT x FROM x
+----
+1
+
+statement ok rowcount 1
+INSERT INTO x VALUES (2)
+
+query I rowsort
+SELECT x FROM x
+----
+1
+2
+
+statement ok
+ROLLBACK AND CHAIN
+
+query I nosort
+SELECT x FROM x
+----
+1
+
+statement ok rowcount 1
+INSERT INTO x VALUES (3)
+
+query I rowsort
+SELECT x FROM x
+----
+1
+3
+
+statement ok
+COMMIT
+
+query I rowsort
+SELECT x FROM x
+----
+1
+3
+
+statement ok rowcount 1
+INSERT INTO x VALUES (4)
+
+query I rowsort
+SELECT x FROM x
+----
+1
+3
+4
+
+statement ok
+DROP TABLE x
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list