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

Reply via email to