Changeset: d569f9342f7f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d569f9342f7f
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_transaction.c
        sql/backends/monet5/sql_user.c
        sql/backends/monet5/wlr.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/test/BugTracker-2009/Tests/rollback_bug.stable.err
        
sql/test/BugTracker-2009/Tests/temporary_table_leftover.SF-2734713.stable.err
        sql/test/BugTracker/Tests/crash_on_fkey_update2.SF-1703497.stable.err
Branch: Aug2018
Log Message:

Return detailed error messages of mvc_commit and mvc_rollback calls.


diffs (truncated from 637 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -226,7 +226,6 @@ SQLmvc(Client cntxt, MalBlkPtr mb, MalSt
 str
 SQLcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       int ret;
        mvc *sql = NULL;
        str msg;
        (void) stk;
@@ -239,11 +238,7 @@ SQLcommit(Client cntxt, MalBlkPtr mb, Ma
 
        if (sql->session->auto_commit != 0)
                throw(SQL, "sql.trans", SQLSTATE(2DM30) "COMMIT not allowed in 
auto commit mode");
-       ret = mvc_commit(sql, 0, 0);
-       if (ret < 0) {
-               throw(SQL, "sql.trans", SQLSTATE(2D000) "transaction commit 
failed");
-       }
-       return msg;
+       return mvc_commit(sql, 0, 0, false);
 }
 
 str
@@ -260,7 +255,7 @@ SQLabort(Client cntxt, MalBlkPtr mb, Mal
                return msg;
 
        if (sql->session->active) {
-               mvc_rollback(sql, 0, NULL);
+               msg = mvc_rollback(sql, 0, NULL, false);
        }
        return msg;
 }
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -336,7 +336,7 @@ SQLprepareClient(Client c, int login)
 str
 SQLresetClient(Client c)
 {
-       str msg = MAL_SUCCEED;
+       str msg = MAL_SUCCEED, other = MAL_SUCCEED;
 
        if (c->sqlcontext == NULL)
                throw(SQL, "SQLexitClient", SQLSTATE(42000) "MVC catalogue not 
available");
@@ -346,12 +346,11 @@ SQLresetClient(Client c)
 
                assert(m->session);
                if (m->session->auto_commit && m->session->active) {
-                       if (mvc_status(m) >= 0 && mvc_commit(m, 0, NULL) < 0)
-                               msg = handle_error(m, 0, 0);
+                       if (mvc_status(m) >= 0)
+                               msg = mvc_commit(m, 0, NULL, false);
                }
-               if (m->session->active) {
-                       mvc_rollback(m, 0, NULL);
-               }
+               if (m->session->active)
+                       other = mvc_rollback(m, 0, NULL, false);
 
                res_tables_destroy(m->results);
                m->results = NULL;
@@ -363,6 +362,10 @@ SQLresetClient(Client c)
                c->sqlcontext = NULL;
        }
        c->state[MAL_SCENARIO_READER] = NULL;
+       if(other && !msg)
+               msg = other;
+       else if(other && msg)
+               GDKfree(other);
        return msg;
 }
 
@@ -636,10 +639,9 @@ SQLautocommit(mvc *m)
 
        if (m->session->auto_commit && m->session->active) {
                if (mvc_status(m) < 0) {
-                       mvc_rollback(m, 0, NULL);
-               } else if (mvc_commit(m, 0, NULL) < 0) {
-                       msg = handle_error(m, 0, 0);
-                       m->errstr[0] = 0;
+                       msg = mvc_rollback(m, 0, NULL, false);
+               } else {
+                       msg = mvc_commit(m, 0, NULL, false);
                }
        }
        return msg;
@@ -1095,11 +1097,10 @@ SQLparser(Client c)
                        m->session->auto_commit = (v) != 0;
                        m->session->ac_on_commit = m->session->auto_commit;
                        if (m->session->active) {
-                               if (commit && mvc_commit(m, 0, NULL) < 0) {
-                                       msg = createException(SQL, "COMMIT", 
SQLSTATE(42000) "Commit failed while enabling auto_commit");
-                               } else if (!commit && mvc_rollback(m, 0, NULL) 
< 0) {
+                               if (commit) {
+                                       msg = mvc_commit(m, 0, NULL, true);
+                               } else if (!commit && (msg = mvc_rollback(m, 0, 
NULL, true)) != MAL_SUCCEED) {
                                        mnstr_printf(out, "!COMMIT: rollback 
failed while " "disabling auto_commit\n");
-                                       msg = createException(SQL, "COMMIT", 
SQLSTATE(42000) "rollback failed while " "disabling auto_commit");
                                }
                        }
                        in->pos = in->len;      /* HACK: should use parsed 
length */
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
@@ -50,20 +50,13 @@ SQLtransaction_release(Client cntxt, Mal
        str msg;
        int chain = *getArgReference_int(stk, pci, 1);
        str name = *getArgReference_str(stk, pci, 2);
-       char buf[BUFSIZ];
-       int ret = 0;
 
        initcontext();
 
        (void) chain;
        if (sql->session->auto_commit == 1)
                throw(SQL, "sql.trans", SQLSTATE(3BM30) "RELEASE SAVEPOINT: not 
allowed in auto commit mode");
-       ret = mvc_release(sql, name);
-       if (ret < 0) {
-               snprintf(buf, BUFSIZ, SQLSTATE(3B000) "RELEASE SAVEPOINT: (%s) 
failed", name);
-               throw(SQL, "sql.trans", "%s", buf);
-       }
-       return MAL_SUCCEED;
+       return mvc_release(sql, name);
 }
 
 str
@@ -73,7 +66,6 @@ SQLtransaction_commit(Client cntxt, MalB
        str msg;
        int chain = *getArgReference_int(stk, pci, 1);
        str name = *getArgReference_str(stk, pci, 2);
-       int ret = 0;
 
        initcontext();
 
@@ -83,12 +75,7 @@ SQLtransaction_commit(Client cntxt, MalB
                else
                        throw(SQL, "sql.trans", SQLSTATE(2DM30) "COMMIT: not 
allowed in auto commit mode");
        }
-       ret = mvc_commit(sql, chain, name);
-       if (ret < 0 && !name)
-               throw(SQL, "sql.trans", SQLSTATE(2D000) "COMMIT: failed");
-       if (ret < 0 && name)
-               throw(SQL, "sql.trans", SQLSTATE(3B000) "SAVEPOINT: (%s) 
failed", name);
-       return MAL_SUCCEED;
+       return mvc_commit(sql, chain, name, false);
 }
 
 str
@@ -98,38 +85,36 @@ SQLtransaction_rollback(Client cntxt, Ma
        str msg;
        int chain = *getArgReference_int(stk, pci, 1);
        str name = *getArgReference_str(stk, pci, 2);
+
+       initcontext();
+
+       if (sql->session->auto_commit == 1)
+               throw(SQL, "sql.trans", SQLSTATE(2DM30) "ROLLBACK: not allowed 
in auto commit mode");
+       return mvc_rollback(sql, chain, name, false);
+}
+
+str
+SQLtransaction_begin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *sql = NULL;
+       str msg;
+       int chain = *getArgReference_int(stk, pci, 1);
+       str name = *getArgReference_str(stk, pci, 2);
        int ret = 0;
 
        initcontext();
 
-       if (sql->session->auto_commit == 1)
-               throw(SQL, "sql.trans", SQLSTATE(2DM30) "ROLLBACK: not allowed 
in auto commit mode");
-       ret = mvc_rollback(sql, chain, name);
-       if (ret < 0 && name) {
-               throw(SQL, "sql.trans", SQLSTATE(3B000) "ROLLBACK TO SAVEPOINT: 
(%s) failed", name);
-       }
-       return MAL_SUCCEED;
-}
-
-str
-SQLtransaction_begin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       mvc *sql = NULL;
-       str msg;
-       int chain = *getArgReference_int(stk, pci, 1);
-       str name = *getArgReference_str(stk, pci, 2);
-
-       initcontext();
-
        if (sql->session->auto_commit == 0)
                throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION: 
cannot start a transaction within a transaction");
-       if (sql->session->active) {
-               mvc_rollback(sql, 0, NULL);
-       }
+       if (sql->session->active)
+               msg = mvc_rollback(sql, 0, NULL, false);
        sql->session->auto_commit = 0;
        sql->session->ac_on_commit = 1;
        sql->session->level = chain;
-       if(mvc_trans(sql) < 0)
+       ret = mvc_trans(sql);
+       if(msg)
+               return msg;
+       else if(ret < 0)
                throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL);
        return MAL_SUCCEED;
 }
@@ -139,6 +124,7 @@ SQLtransaction2(Client cntxt, MalBlkPtr 
 {
        mvc *sql = NULL;
        str msg;
+       int ret = 0;
 
        (void) stk;
        (void) pci;
@@ -149,14 +135,15 @@ SQLtransaction2(Client cntxt, MalBlkPtr 
                return msg;
        if (sql->session->auto_commit == 0)
                throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION: 
cannot start a transaction within a transaction");
-       if (sql->session->active) {
-               mvc_rollback(sql, 0, NULL);
-       }
+       if (sql->session->active)
+               msg = mvc_rollback(sql, 0, NULL, false);
        sql->session->auto_commit = 0;
        sql->session->ac_on_commit = 1;
        sql->session->level = 0;
-       if(mvc_trans(sql) < 0)
+       ret = mvc_trans(sql);
+       if(msg)
+               return msg;
+       else if(ret < 0)
                throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       return msg;
+       return MAL_SUCCEED;
 }
-
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -493,6 +493,7 @@ monet5_user_set_def_schema(mvc *m, oid u
        sql_column *schemas_id = NULL;
        sql_table *auths = NULL;
        sql_column *auths_name = NULL;
+       str other;
 
        void *p = 0;
 
@@ -551,8 +552,10 @@ monet5_user_set_def_schema(mvc *m, oid u
        }
 
        if (!schema || !mvc_set_schema(m, schema)) {
-               if (m->session->active)
-                       mvc_rollback(m, 0, NULL);
+               if (m->session->active) {
+                       if((other = mvc_rollback(m, 0, NULL, false)) != 
MAL_SUCCEED)
+                               GDKfree(other);
+               }
                GDKfree(username);
                return NULL;
        }
@@ -563,6 +566,9 @@ monet5_user_set_def_schema(mvc *m, oid u
                schema = NULL;
        }
        GDKfree(username);
-       mvc_rollback(m, 0, NULL);
+       if((other = mvc_rollback(m, 0, NULL, false)) != MAL_SUCCEED) {
+               GDKfree(other);
+               return NULL;
+       }
        return schema;
 }
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
@@ -161,7 +161,7 @@ WLRprocess(void *arg)
        size_t sz;
        MalBlkPtr mb;
        InstrPtr q;
-       str msg;
+       str msg, other;
        mvc *sql;
        lng currid =0;
        Symbol prev = NULL;
@@ -304,15 +304,18 @@ WLRprocess(void *arg)
                                                        // they should always 
succeed
                                                        
mnstr_printf(GDKerr,"ERROR in processing batch %d :%s\n", i, msg);
                                                        printFunction(GDKerr, 
mb, 0, LIST_MAL_DEBUG );
-                                                       
mvc_rollback(sql,0,NULL);
+                                                       if((other = 
mvc_rollback(sql,0,NULL, false)) != MAL_SUCCEED) //an error was already 
established
+                                                               GDKfree(other);
                                                        // cleanup
                                                        
fprintFunction(stderr,mb,0,63);
                                                        
resetMalBlkAndFreeInstructions(mb, 1);
                                                        trimMalVariables(mb, 
NULL);
                                                        pc = 0;
                                                } else
-                                               if( mvc_commit(sql, 0, 0) < 0)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to