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