Changeset: e5adba1aea41 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e5adba1aea41
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
Branch: Jun2023
Log Message:

More contortions to make setjmp/longjmp work.


diffs (truncated from 1133 to 300 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
@@ -137,51 +137,15 @@ relational_func_create_result_part2(MalB
 }
 
 static int
-_create_relational_function(mvc *m, const char *mod, const char *name, sql_rel 
*r, stmt *call, list *rel_ops, int inline_func)
+_create_relational_function_body(mvc *m, sql_rel *r, stmt *call, list 
*rel_ops, int inline_func)
 {
        Client c = MCgetClient(m->clientid);
        backend *be = (backend *) c->sqlcontext;
        MalBlkPtr curBlk = 0;
        InstrPtr curInstr = 0;
-       Symbol symbackup = NULL;
-       int res = 0, added_to_cache;
+       int res = 0, added_to_cache = 0;
        str msg = MAL_SUCCEED;
-       backend bebackup;
-       exception_buffer ebsave = m->sa->eb;
-
-       if (strlen(mod) >= IDLENGTH) {
-               (void) sql_error(m, 10, SQLSTATE(42000) "Module name '%s' too 
large for the backend", mod);
-               res = -1;
-               goto bailout;
-       }
-       if (strlen(name) >= IDLENGTH) {
-               (void) sql_error(m, 10, SQLSTATE(42000) "Function name '%s' too 
large for the backend", name);
-               res = -1;
-               goto bailout;
-       }
-       symbackup = c->curprg;
-       bebackup = *be;                         /* backup current backend */
-       backend_reset(be);
 
-       int nargs;
-       relational_func_create_result_part1(m, &r, &nargs);
-       nargs += (call && call->type == st_list) ? list_length(call->op4.lval) 
: rel_ops ? list_length(rel_ops) : 0;
-
-       c->curprg = newFunctionArgs(putName(mod), putName(name), 
FUNCTIONsymbol, nargs);
-       if(c->curprg  == NULL) {
-               added_to_cache = 0;
-               sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
-               goto cleanup;
-       }
-       if (eb_savepoint(&m->sa->eb)) {
-               added_to_cache = 0;
-               sql_error(m, 10, "%s", m->sa->eb.msg);
-               res = -1;
-               goto cleanup;
-       }
-
-       added_to_cache = 0;
        curBlk = c->curprg->def;
        curInstr = getInstrPtr(curBlk, 0);
 
@@ -300,13 +264,55 @@ cleanup:
                else
                        SQLremoveQueryFromCache(c);
        }
+       return res;
+}
+
+static int
+_create_relational_function(mvc *m, const char *mod, const char *name, sql_rel 
*r, stmt *call, list *rel_ops, int inline_func)
+{
+       Client c = MCgetClient(m->clientid);
+       backend *be = (backend *) c->sqlcontext;
+       Symbol symbackup = c->curprg;
+       backend bebackup = *be;         /* backup current backend */
+       exception_buffer ebsave = m->sa->eb;
+
+       if (strlen(mod) >= IDLENGTH) {
+               (void) sql_error(m, 10, SQLSTATE(42000) "Module name '%s' too 
large for the backend", mod);
+               goto bailout;
+       }
+       if (strlen(name) >= IDLENGTH) {
+               (void) sql_error(m, 10, SQLSTATE(42000) "Function name '%s' too 
large for the backend", name);
+               goto bailout;
+       }
+
+       backend_reset(be);
+
+       int nargs;
+       relational_func_create_result_part1(m, &r, &nargs);
+       nargs += (call && call->type == st_list) ? list_length(call->op4.lval) 
: rel_ops ? list_length(rel_ops) : 0;
+
+       c->curprg = newFunctionArgs(putName(mod), putName(name), 
FUNCTIONsymbol, nargs);
+       if (c->curprg == NULL) {
+               sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               goto bailout;
+       } else if (eb_savepoint(&m->sa->eb)) {
+               sql_error(m, 10, "%s", m->sa->eb.msg);
+               freeSymbol(c->curprg);
+               goto bailout;
+       } else if (_create_relational_function_body(m, r, call, rel_ops, 
inline_func) < 0) {
+               goto bailout;
+       }
        *be = bebackup;
        c->curprg = symbackup;
        m->sa->eb = ebsave;
+       return 0;
   bailout:
-       if (res < 0 && m->sa->eb.enabled)
+       *be = bebackup;
+       c->curprg = symbackup;
+       m->sa->eb = ebsave;
+       if (m->sa->eb.enabled)
                eb_error(&m->sa->eb, m->errstr[0] ? m->errstr : be->mb->errors 
? be->mb->errors : *GDKerrbuf ? GDKerrbuf : "out of memory", 1000);
-       return res;
+       return -1;
 }
 
 static str
@@ -342,42 +348,23 @@ cleanup:
 
 /* stub and remote function */
 static int
-_create_relational_remote(mvc *m, const char *mod, const char *name, sql_rel 
*rel, stmt *call, prop *prp)
+_create_relational_remote_body(mvc *m, const char *mod, const char *name, 
sql_rel *rel, sql_rel *rel2, stmt *call, prop *prp)
 {
        Client c = MCgetClient(m->clientid);
        MalBlkPtr curBlk = 0;
        InstrPtr curInstr = 0, p, o;
-       Symbol backup = NULL;
        sqlid table_id = prp->id;
        node *n;
-       int i, q, v, res = 0, added_to_cache,  *lret, *rret;
+       int i, q, v, res = -1, added_to_cache = 0, *lret, *rret;
        size_t len = 1024, nr, pwlen = 0;
        char *lname = NULL, *buf = NULL, *mal_session_uuid, *err = NULL, 
*pwhash = NULL;
        str username = NULL, password = NULL, msg = NULL;
        sql_rel *r = rel;
-       exception_buffer ebsave = m->sa->eb;
-
-       if (table_id == 0) {
-               sql_error(m, 003, SQLSTATE(42000) "Missing property on the 
input relation");
-               res = -1;
-               goto bailout;
-       }
-       if (strlen(mod) >= IDLENGTH) {
-               sql_error(m, 10, SQLSTATE(42000) "Module name '%s' too large 
for the backend", mod);
-               res = -1;
-               goto bailout;
-       }
-       if (strlen(name) >= IDLENGTH) {
-               sql_error(m, 10, SQLSTATE(42000) "Function name '%s' too large 
for the backend", name);
-               res = -1;
-               goto bailout;
-       }
 
        lname = sa_strdup(m->ta, name);
        if (lname == NULL) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
-               goto bailout;
+               goto cleanup;
        }
 
        if (is_topn(r->op) || is_sample(r->op))
@@ -387,37 +374,14 @@ static int
        lret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps));
        if (lret == NULL) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
-               goto bailout;
+               goto cleanup;
        }
        rret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps));
        if (rret == NULL) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
-               goto bailout;
+               goto cleanup;
        }
 
-       /* create stub */
-       backup = c->curprg;
-       int nargs;
-       sql_rel *rel2 = rel;
-       relational_func_create_result_part1(m, &rel2, &nargs);
-       if (call && call->type == st_list)
-               nargs += list_length(call->op4.lval);
-       c->curprg = newFunctionArgs(putName(mod), putName(name), 
FUNCTIONsymbol, nargs);
-       if( c->curprg == NULL) {
-               sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               c->curprg = backup;
-               res = -1;
-               goto bailout;
-       }
-       if (eb_savepoint(&m->sa->eb)) {
-               added_to_cache = 0;
-               sql_error(m, 10, "%s", m->sa->eb.msg);
-               res = -1;
-               goto cleanup;
-       }
-       added_to_cache = 0;
        lname[0] = 'l';
        curBlk = c->curprg->def;
        curInstr = getInstrPtr(curBlk, 0);
@@ -426,13 +390,11 @@ static int
        const char *uri = mapiuri_uri(rt->query, m->sa);
        if (!rt) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        curInstr = relational_func_create_result_part2(curBlk, curInstr, rel2);
        if( curInstr == NULL) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
 
@@ -449,7 +411,6 @@ static int
                        sprintf(nbuf, "A%d", i++);
                        if ((varid = newVariable(curBlk, nbuf, strlen(nbuf), 
type)) < 0) {
                                sql_error(m, 10, SQLSTATE(42000) "Internal 
error while compiling statement: variable id too long");
-                               res = -1;
                                goto cleanup;
                        }
                        curInstr = pushArgument(curBlk, curInstr, varid);
@@ -467,7 +428,6 @@ static int
                        p = newFcnCall(curBlk, batRef, newRef);
                        if (p == NULL) {
                                sql_error(m, 10, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-                               res = -1;
                                goto cleanup;
                        }
                        p = pushType(curBlk, p, getBatType(type));
@@ -483,7 +443,6 @@ static int
                sql_error(m, 10, "%s", msg);
                freeException(msg);
                msg = NULL;
-               res = -1;
                goto cleanup;
        }
        /* q := remote.connect("uri", "username", "password", "msql"); */
@@ -492,7 +451,6 @@ static int
                GDKfree(username);
                GDKfree(password);
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        p = pushStr(curBlk, p, uri);
@@ -502,7 +460,6 @@ static int
     pwhash = (char*)GDKmalloc(pwlen + 2);
        if (pwhash == NULL) {
                GDKfree(password);
-               res = -1;
                goto cleanup;
        }
        strconcat_len(pwhash, pwlen + 2, "\1", password, NULL);
@@ -517,7 +474,6 @@ static int
        p = newInstructionArgs(curBlk, remoteRef, execRef, 10);
        if (p == NULL) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        p = pushArgument(curBlk, p, q);
@@ -528,7 +484,6 @@ static int
        if (o == NULL) {
                freeInstruction(p);
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        o = pushArgument(curBlk, o, q);
@@ -540,7 +495,6 @@ static int
        if (o == NULL) {
                freeInstruction(p);
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        o = pushArgument(curBlk, o, q);
@@ -552,7 +506,6 @@ static int
        if (o == NULL) {
                freeInstruction(p);
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        o = pushArgument(curBlk, o, q);
@@ -563,7 +516,6 @@ static int
        if (!(buf = rel2str(m, rel))) {
                freeInstruction(p);
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
                goto cleanup;
        }
        o = newFcnCall(curBlk, remoteRef, putRef);
@@ -571,7 +523,6 @@ static int
                free(buf);
                freeInstruction(p);
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               res = -1;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to