Changeset: b5d7a4c1889f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b5d7a4c1889f
Modified Files:
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_gencode.h
sql/backends/monet5/sql_scenario.c
Branch: default
Log Message:
add bailout on ->errors as some mal operators now only set this.
diffs (137 lines):
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -707,7 +707,7 @@ backend_callinline(backend *be, Client c
if (m->argc) {
int argc = 0;
- for (; argc < m->argc; argc++) {
+ for (; argc < m->argc && !curBlk->errors; argc++) {
atom *a = m->args[argc];
int type = atom_type(a)->type->localtype;
int varid = 0;
@@ -731,6 +731,8 @@ backend_callinline(backend *be, Client c
}
}
c->curprg->def = curBlk;
+ if (curBlk->errors)
+ return -1;
return 0;
}
@@ -778,7 +780,7 @@ backend_dumpproc(backend *be, Client c,
a->varid = varid = newVariable(mb, arg,strlen(arg),
type);
curInstr = pushArgument(mb, curInstr, varid);
assert(curInstr);
- if (curInstr == NULL)
+ if (curInstr == NULL || mb->errors)
goto cleanup;
setVarType(mb, varid, type);
setVarUDFtype(mb, 0);
@@ -799,7 +801,7 @@ backend_dumpproc(backend *be, Client c,
varid = newVariable(mb, arg,strlen(arg), type);
curInstr = pushArgument(mb, curInstr, varid);
assert(curInstr);
- if (curInstr == NULL)
+ if (curInstr == NULL || mb->errors)
goto cleanup;
setVarType(mb, varid, type);
setVarUDFtype(mb, varid);
@@ -839,7 +841,7 @@ cleanup:
return NULL;
}
-void
+int
backend_call(backend *be, Client c, cq *cq)
{
mvc *m = be->mvc;
@@ -849,11 +851,11 @@ backend_call(backend *be, Client c, cq *
q = newStmt(mb, userRef, cq->name);
if (!q) {
m->session->status = -3;
- return;
+ return -1;
}
if (m->emode == m_execute && be->q->paramlen != m->argc) {
sql_error(m, 003, SQLSTATE(42000) "EXEC called with wrong
number of arguments: expected %d, got %d", be->q->paramlen, m->argc);
- return;
+ return -1;
}
/* cached (factorized queries return bit??) */
if (cq->code && getInstrPtr(((Symbol)cq->code)->def, 0)->token ==
FACTORYsymbol) {
@@ -866,12 +868,13 @@ backend_call(backend *be, Client c, cq *
if (m->argc) {
int i;
- for (i = 0; i < m->argc; i++) {
+ for (i = 0; i < m->argc && q && !mb->errors; i++) {
atom *a = m->args[i];
sql_subtype *pt = cq->params + i;
if (!atom_cast(m->sa, a, pt)) {
sql_error(m, 003, SQLSTATE(42000) "wrong type
for argument %d of function call: %s, expected %s\n", i + 1,
atom_type(a)->type->sqlname, pt->type->sqlname);
+ q = NULL;
break;
}
if (atom_null(a)) {
@@ -888,6 +891,9 @@ backend_call(backend *be, Client c, cq *
}
}
}
+ if (!q || mb->errors)
+ return -1;
+ return 0;
}
int
diff --git a/sql/backends/monet5/sql_gencode.h
b/sql/backends/monet5/sql_gencode.h
--- a/sql/backends/monet5/sql_gencode.h
+++ b/sql/backends/monet5/sql_gencode.h
@@ -20,7 +20,7 @@
sql5_export Symbol backend_dumpproc(backend *be, Client c, cq *q, sql_rel *r);
sql5_export int backend_callinline(backend *be, Client c);
sql5_export int backend_dumpstmt(backend *be, MalBlkPtr mb, sql_rel *r, int
top, int addend, const char *query);
-sql5_export void backend_call(backend *be, Client c, cq *q);
+sql5_export int backend_call(backend *be, Client c, cq *q);
sql5_export int monet5_resolve_function(ptr M, sql_func *f);
sql5_export int backend_create_func(backend *be, sql_func *f, list *restypes,
list *ops);
extern int backend_create_subfunc(backend *be, sql_subfunc *f, list *ops);
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
@@ -1296,21 +1296,24 @@ SQLparser(Client c)
err = mvc_export_prepare(m, c->fdout, be->q,
"");
} else if (m->emode == m_execute || m->emode ==
m_normal || m->emode == m_plan) {
/* call procedure generation (only in cache
mode) */
- backend_call(be, c, be->q);
+ if (backend_call(be, c, be->q) < 0)
+ err = 3;
}
}
- pushEndInstruction(c->curprg->def);
- /* check the query wrapper for errors */
- chkTypes(c->usermodule, c->curprg->def, TRUE);
+ if (!err) {
+ pushEndInstruction(c->curprg->def);
+ /* check the query wrapper for errors */
+ chkTypes(c->usermodule, c->curprg->def, TRUE);
- /* in case we had produced a non-cachable plan, the optimizer
should be called */
- if (opt ) {
- msg = SQLoptimizeQuery(c, c->curprg->def);
+ /* in case we had produced a non-cachable plan, the
optimizer should be called */
+ if (opt ) {
+ msg = SQLoptimizeQuery(c, c->curprg->def);
- if (msg != MAL_SUCCEED) {
- sqlcleanup(m, err);
- goto finalize;
+ if (msg != MAL_SUCCEED) {
+ sqlcleanup(m, err);
+ goto finalize;
+ }
}
}
//printFunction(c->fdout, c->curprg->def, 0, LIST_MAL_ALL);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list