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

Reply via email to