Changeset: d1b95282d0f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d1b95282d0f0
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/exports.stable.out
monetdb5/mal/mal_exception.c
monetdb5/mal/mal_exception.h
monetdb5/modules/mal/remote.c
monetdb5/optimizer/opt_oltp.c
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
sql/backends/monet5/sql.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_execute.h
sql/backends/monet5/sql_gencode.c
sql/test/BugTracker-2015/Tests/local-remotetable-crash.Bug-3754.SQL.py
sql/test/BugTracker-2015/Tests/schemadiff.Bug-3778.SQL.py
sql/test/BugTracker-2019/Tests/remote-table-non-existent-column.Bug-6750.py
sql/test/BugTracker-2020/Tests/table-udf-on-remote.Bug-6971.py
Branch: iso
Log Message:
Always finish the remote plan transaction, so the pending dependencies can get
a chance to be cleaned
At the moment I changed the remote plan to throw an error to check the remote
server log, because I can't figure out how to rethrow a MAL error. Please a MAL
expert review this an make it throw the original exception.
diffs (truncated from 482 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9169,6 +9169,7 @@ stdout of test 'MAL-signatures` in direc
[ "rapi", "eval_aggr", "pattern rapi.eval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
[ "rapi", "prelude", "command rapi.prelude():void ", "RAPIprelude;",
"" ]
[ "rapi", "subeval_aggr", "pattern rapi.subeval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
+[ "remote", "assert", "pattern remote.assert(X_0:bit, X_1:str):void
", "RMTassert;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy():bat[:any] ",
"RMTbincopyfrom;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy(X_0:bat[:any]):void
", "RMTbincopyto;", "" ]
[ "remote", "batload", "pattern remote.batload(X_0:any_1,
X_1:int):bat[:any_1] ", "RMTbatload;", "" ]
@@ -9270,6 +9271,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str)
(X_2:bat[:int], X_3:bat[:lng], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng],
X_7:bat[:lng], X_8:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str, X_2:str)
(X_3:bat[:int], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng], X_7:bat[:lng],
X_8:bat[:lng], X_9:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "dense_rank", "pattern sql.dense_rank(X_0:any_1, X_1:bit,
X_2:bit):int ", "SQLdense_rank;", "" ]
+[ "sql", "deregister", "pattern sql.deregister():int ",
"RAstatementEnd;", "" ]
[ "sql", "diff", "pattern sql.diff(X_0:any_1):bit ", "SQLdiff;",
"" ]
[ "sql", "diff", "pattern sql.diff(X_0:bit, X_1:any_1):bit ",
"SQLdiff;", "" ]
[ "sql", "drop_hash", "unsafe pattern sql.drop_hash(X_0:str,
X_1:str):void ", "SQLdrop_hash;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12470,6 +12470,7 @@ stdout of test 'MAL-signatures` in direc
[ "rapi", "eval_aggr", "pattern rapi.eval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
[ "rapi", "prelude", "command rapi.prelude():void ", "RAPIprelude;",
"" ]
[ "rapi", "subeval_aggr", "pattern rapi.subeval_aggr(X_0:ptr, X_1:str,
X_2:any...):any... ", "RAPIevalAggr;", "" ]
+[ "remote", "assert", "pattern remote.assert(X_0:bit, X_1:str):void
", "RMTassert;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy():bat[:any] ",
"RMTbincopyfrom;", "" ]
[ "remote", "batbincopy", "pattern remote.batbincopy(X_0:bat[:any]):void
", "RMTbincopyto;", "" ]
[ "remote", "batload", "pattern remote.batload(X_0:any_1,
X_1:int):bat[:any_1] ", "RMTbatload;", "" ]
@@ -12576,6 +12577,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str)
(X_2:bat[:int], X_3:bat[:lng], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng],
X_7:bat[:lng], X_8:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "deltas", "pattern sql.deltas(X_0:str, X_1:str, X_2:str)
(X_3:bat[:int], X_4:bat[:lng], X_5:bat[:lng], X_6:bat[:lng], X_7:bat[:lng],
X_8:bat[:lng], X_9:bat[:int]) ", "mvc_delta_values;", "" ]
[ "sql", "dense_rank", "pattern sql.dense_rank(X_0:any_1, X_1:bit,
X_2:bit):int ", "SQLdense_rank;", "" ]
+[ "sql", "deregister", "pattern sql.deregister():int ",
"RAstatementEnd;", "" ]
[ "sql", "diff", "pattern sql.diff(X_0:any_1):bit ", "SQLdiff;",
"" ]
[ "sql", "diff", "pattern sql.diff(X_0:bit, X_1:any_1):bit ",
"SQLdiff;", "" ]
[ "sql", "drop_hash", "unsafe pattern sql.drop_hash(X_0:str,
X_1:str):void ", "SQLdrop_hash;", "" ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -934,6 +934,7 @@ const char *deleteRef;
void deleteSymbol(Module scope, Symbol prg);
const char *deltaRef;
const char *dense_rankRef;
+const char *deregisterRef;
malType destinationType(MalBlkPtr mb, InstrPtr p);
const char *diffRef;
const char *diffcandRef;
diff --git a/monetdb5/mal/mal_exception.c b/monetdb5/mal/mal_exception.c
--- a/monetdb5/mal/mal_exception.c
+++ b/monetdb5/mal/mal_exception.c
@@ -29,7 +29,8 @@ static char *exceptionNames[] = {
/*11 */ "ArithmeticException",
/*12 */ "PermissionDeniedException",
/*13 */ "SQLException",
-/*14 */ "Deprecated operation",
+/*14 */ "RemoteException",
+/*15 */ "Deprecated operation",
/*EOE*/ NULL
};
diff --git a/monetdb5/mal/mal_exception.h b/monetdb5/mal/mal_exception.h
--- a/monetdb5/mal/mal_exception.h
+++ b/monetdb5/mal/mal_exception.h
@@ -26,7 +26,8 @@ enum malexception {
PARSE,
ARITH,
PERMD,
- SQL
+ SQL,
+ REMOTE
};
#define MAL_SUCCEED ((str) 0) /* no error */
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -1662,10 +1662,39 @@ RMTregisterSupervisor(int *ret, str *sup
return MAL_SUCCEED;
}
+/* this is needed in remote plans */
+static str
+RMTassert(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ bool flg = (bool) *getArgReference_bit(stk, pci, 1);
+ str msg = *getArgReference_str(stk, pci, 2);
+
+ (void) cntxt;
+ (void) mb;
+ if (flg) {
+ if (strlen(msg) > 6 &&
+ msg[5] == '!' &&
+ (isdigit((unsigned char) msg[0]) ||
+ isupper((unsigned char) msg[0])) &&
+ (isdigit((unsigned char) msg[1]) ||
+ isupper((unsigned char) msg[1])) &&
+ (isdigit((unsigned char) msg[2]) ||
+ isupper((unsigned char) msg[2])) &&
+ (isdigit((unsigned char) msg[3]) ||
+ isupper((unsigned char) msg[3])) &&
+ (isdigit((unsigned char) msg[4]) ||
+ isupper((unsigned char) msg[4])))
+ throw(REMOTE, "assert", "%s", msg); /* includes state */
+ throw(REMOTE, "assert", SQLSTATE(M0M29) "%s", msg);
+ }
+ return MAL_SUCCEED;
+}
+
#include "mel.h"
mel_func remote_init_funcs[] = {
command("remote", "prelude", RMTprelude, false, "initialise the remote
module", args(1,1, arg("",void))),
command("remote", "epilogue", RMTepilogue, false, "release the resources held
by the remote module", args(1,1, arg("",void))),
+ pattern("remote", "assert", RMTassert, false, "Generate an exception when
b==true", args(1,3, arg("",void),arg("b",bit),arg("msg",str))),
command("remote", "resolve", RMTresolve, false, "resolve a pattern against
Merovingian and return the URIs", args(1,2, batarg("",str),arg("pattern",str))),
pattern("remote", "connect", RMTconnect, false, "returns a newly created
connection for uri, using user name and password", args(1,5,
arg("",str),arg("uri",str),arg("user",str),arg("passwd",str),arg("scen",str))),
command("remote", "connect", RMTconnectScen, false, "returns a newly created
connection for uri, using user name, password and scenario", args(1,6,
arg("",str),arg("uri",str),arg("user",str),arg("passwd",str),arg("scen",str),arg("columnar",bit))),
diff --git a/monetdb5/optimizer/opt_oltp.c b/monetdb5/optimizer/opt_oltp.c
--- a/monetdb5/optimizer/opt_oltp.c
+++ b/monetdb5/optimizer/opt_oltp.c
@@ -106,10 +106,10 @@ OPToltpImplementation(Client cntxt, MalB
p = old[i];
if( p->token == ENDsymbol){
// unlock all if there is an error
- q= newCatchStmt(mb,"MALexception");
- q= newExitStmt(mb,"MALexception");
- q= newCatchStmt(mb,"SQLexception");
- q= newExitStmt(mb,"SQLexception");
+ q= newCatchStmt(mb,"MALException");
+ q= newExitStmt(mb,"MALException");
+ q= newCatchStmt(mb,"SQLException");
+ q= newExitStmt(mb,"SQLException");
q= copyInstruction(lcks);
if( q == NULL){
for(; i<slimit; i++)
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -106,6 +106,7 @@ const char *defineRef;
const char *deleteRef;
const char *deltaRef;
const char *dense_rankRef;
+const char *deregisterRef;
const char *diffcandRef;
const char *differenceRef;
const char *disconnectRef;
@@ -412,6 +413,7 @@ void optimizerInit(void)
deleteRef = putName("delete");
deltaRef = putName("delta");
dense_rankRef = putName("dense_rank");
+ deregisterRef = putName("deregister");
diffcandRef= putName("diffcand");
differenceRef = putName("difference");
disconnectRef= putName("disconnect");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -102,6 +102,7 @@ mal_export const char *defineRef;
mal_export const char *deleteRef;
mal_export const char *deltaRef;
mal_export const char *dense_rankRef;
+mal_export const char *deregisterRef;
mal_export const char *diffcandRef;
mal_export const char *differenceRef;
mal_export const char *diffRef;
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
@@ -4983,6 +4983,7 @@ static mel_func sql_init_funcs[] = {
pattern("sql", "evalAlgebra", RAstatement, false, "Compile and execute a
single 'relational algebra' statement", args(1,3,
arg("",void),arg("cmd",str),arg("optimize",bit))),
pattern("sql", "register", RAstatement2, false, "", args(1,5,
arg("",int),arg("mod",str),arg("fname",str),arg("rel_stmt",str),arg("sig",str))),
pattern("sql", "register", RAstatement2, false, "Compile the relational
statement (rel_smt) and register it as mal function, mod.fname(signature)",
args(1,6,
arg("",int),arg("mod",str),arg("fname",str),arg("rel_stmt",str),arg("sig",str),arg("typ",str))),
+ pattern("sql", "deregister", RAstatementEnd, false, "Finish running
transaction", args(1,1, arg("",int))),
pattern("sql", "hot_snapshot", SQLhot_snapshot, true, "Write db snapshot to
the given tar(.gz) file", args(1,2, arg("",void),arg("tarfile",str))),
pattern("sql", "resume_log_flushing", SQLresume_log_flushing, true, "Resume
WAL log flushing", args(1,1, arg("",void))),
pattern("sql", "suspend_log_flushing", SQLsuspend_log_flushing, true,
"Suspend WAL log flushing", args(1,1, arg("",void))),
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -726,6 +726,16 @@ SQLdestroyResult(res_table *destroy)
res_table_destroy(destroy);
}
+static str
+RAcommit_statement(backend *be, str msg)
+{
+ mvc *m = be->mvc;
+ /* if an error already exists set the session status to dirty */
+ if (msg != MAL_SUCCEED && m->session->tr->active && !m->session->status)
+ m->session->status = -1;
+ return msg;
+}
+
/* a hook is provided to execute relational algebra expressions */
str
RAstatement(Client c, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
@@ -733,13 +743,13 @@ RAstatement(Client c, MalBlkPtr mb, MalS
int pos = 0;
str *expr = getArgReference_str(stk, pci, 1);
bit *opt = getArgReference_bit(stk, pci, 2);
- backend *b = NULL;
+ backend *be = NULL;
mvc *m = NULL;
- str msg;
+ str msg = MAL_SUCCEED;
sql_rel *rel;
list *refs;
- if ((msg = getSQLContext(c, mb, &m, &b)) != NULL)
+ if ((msg = getSQLContext(c, mb, &m, &be)) != NULL)
return msg;
if ((msg = checkSQLContext(c)) != NULL)
return msg;
@@ -748,10 +758,15 @@ RAstatement(Client c, MalBlkPtr mb, MalS
if (!m->sa)
m->sa = sa_create(m->pa);
if (!m->sa)
- return createException(SQL,"RAstatement",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ return RAcommit_statement(be,
createException(SQL,"RAstatement",SQLSTATE(HY013) MAL_MALLOC_FAIL));
refs = sa_list(m->sa);
rel = rel_read(m, *expr, &pos, refs);
- if (rel) {
+ if (!rel) {
+ if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
+ msg = createException(SQL, "RAstatement", "%s",
m->errstr);
+ else
+ msg = createException(SQL, "RAstatement",
SQLSTATE(42000) "%s", m->errstr);
+ } else {
int oldvtop = c->curprg->def->vtop, oldstop =
c->curprg->def->stop, oldvid = c->curprg->def->vid;
if (*opt && rel)
@@ -759,12 +774,12 @@ RAstatement(Client c, MalBlkPtr mb, MalS
if ((msg = MSinitClientPrg(c, sql_private_module_name, "test"))
!= MAL_SUCCEED) {
rel_destroy(rel);
- return msg;
+ return RAcommit_statement(be, msg);
}
/* generate MAL code, ignoring any code generation error */
setVarType(c->curprg->def, 0, 0);
- if (backend_dumpstmt(b, c->curprg->def, rel, 0, 1, NULL) < 0) {
+ if (backend_dumpstmt(be, c->curprg->def, rel, 0, 1, NULL) < 0) {
msg = createException(SQL,"RAstatement","Program
contains errors"); // TODO: use macro definition.
} else {
SQLaddQueryToCache(c);
@@ -777,12 +792,8 @@ RAstatement(Client c, MalBlkPtr mb, MalS
resetMalBlk(c->curprg->def, oldstop);
freeVariables(c, c->curprg->def, NULL, oldvtop, oldvid);
}
- if (!msg)
- msg = mvc_commit(m, 0, NULL, false);
- else
- msg = mvc_rollback(m, 0, NULL, false);
}
- return msg;
+ return RAcommit_statement(be, msg);
}
static int
@@ -820,18 +831,14 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
return msg;
if (!m->sa)
m->sa = sa_create(m->pa);
- if (!m->sa) {
- sqlcleanup(be, 0);
- return createException(SQL,"RAstatement2",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- }
+ if (!m->sa)
+ return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
/* keep copy of signature and relational expression */
snprintf(buf, BUFSIZ, "%s %s", sig, expr);
- if (!stack_push_frame(m, NULL)) {
- sqlcleanup(be, 0);
- return createException(SQL,"RAstatement2",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- }
+ if (!stack_push_frame(m, NULL))
+ return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
ops = sa_list(m->sa);
while (sig && *sig && !isspace((unsigned char) *sig)) {
char *vnme = sig, *tnme;
@@ -850,10 +857,8 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
p = strchr(p, (int)'(');
*p++ = 0;
tnme = sa_strdup(m->sa, tnme);
- if (!tnme) {
- sqlcleanup(be, 0);
- return
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL);
- }
+ if (!tnme)
+ return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
d = strtol(p, &p, 10);
p++; /* skip , */
s = strtol(p, &p, 10);
@@ -872,10 +877,8 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
// return
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL);
//}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list