Changeset: 86079a1a6efe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=86079a1a6efe
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_execute.c
        sql/server/rel_semantic.c
        sql/server/rel_updates.c
Branch: Jun2020
Log Message:

Reset more mvc values at rel_parse calls


diffs (145 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1435,11 +1435,18 @@ rel_parse_value(backend *be, char *query
        if (m->session->status || m->errstr[0]) {
                int status = m->session->status;
 
-               memcpy(o.errstr, m->errstr, sizeof(o.errstr));
+               strcpy(o.errstr, m->errstr);
                *m = o;
                m->session->status = status;
        } else {
+               int label = m->label;
+
+               while (m->topvars > o.topvars) {
+                       if (m->vars[--m->topvars].name)
+                               c_delete(m->vars[m->topvars].name);
+               }
                *m = o;
+               m->label = label;
        }
        return s;
 }
@@ -3595,19 +3602,23 @@ sql_parse(backend *be, sql_allocator *sa
                sa_destroy(m->sa);
        m->sym = NULL;
        {
+               int label = m->label;
                int status = m->session->status;
                int sizevars = m->sizevars, topvars = m->topvars;
                sql_var *vars = m->vars;
                /* cascade list maybe removed */
                list *cascade_action = m->cascade_action;
+               char *mquery = m->query;
 
                strcpy(o->errstr, m->errstr);
                *m = *o;
+               m->label = label;
                m->sizevars = sizevars;
                m->topvars = topvars;
                m->vars = vars;
                m->session->status = status;
                m->cascade_action = cascade_action;
+               m->query = mquery;
        }
        _DELETE(o);
        return sq;
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
@@ -448,20 +448,16 @@ SQLescapeString(str s)
 str
 SQLstatementIntern(Client c, str *expr, str nme, bit execute, bit output, 
res_table **result)
 {
-       int status = 0;
-       int err = 0;
+       int status = 0, err = 0, oldvtop, oldstop = 1, inited = 0, label, ac, 
sizevars, topvars;
        mvc *o, *m;
-       int ac, sizevars, topvars;
        sql_var *vars;
-       int oldvtop, oldstop = 1;
        buffer *b;
-       char *n;
+       char *n, *mquery;
        bstream *bs;
        stream *buf;
        str msg = MAL_SUCCEED;
        backend *be, *sql = (backend *) c->sqlcontext;
        size_t len = strlen(*expr);
-       int inited = 0;
 
 #ifdef _SQL_COMPILE
        mnstr_printf(c->fdout, "#SQLstatement:%s\n", *expr);
@@ -700,17 +696,21 @@ endofcompile:
        m->sa = NULL;
        m->sym = NULL;
        /* variable stack maybe resized, ie we need to keep the new stack */
+       label = m->label;
        status = m->session->status;
        sizevars = m->sizevars;
        topvars = m->topvars;
        vars = m->vars;
+       mquery = m->query;
        *m = *o;
        _DELETE(o);
+       m->label = label;
        m->sizevars = sizevars;
        m->topvars = topvars;
        m->vars = vars;
        m->session->status = status;
        m->session->auto_commit = ac;
+       m->query = mquery;
        if (inited)
                SQLresetClient(c);
        return msg;
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -94,7 +94,7 @@ rel_parse(mvc *m, sql_schema *s, char *q
        if (m->session->status || m->errstr[0]) {
                int status = m->session->status;
 
-               memcpy(o.errstr, m->errstr, sizeof(o.errstr));
+               strcpy(o.errstr, m->errstr);
                *m = o;
                m->session->status = status;
        } else {
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -2043,7 +2043,7 @@ rel_parse_val(mvc *m, char *query, char 
        m->user_id = USER_MONETDB;
 
        (void) sqlparse(m);     
-       
+
        /* get out the single value as we don't want an enclosing projection! */
        if (m->sym && m->sym->token == SQL_SELECT) {
                SelectNode *sn = (SelectNode *)m->sym;
@@ -2061,18 +2061,21 @@ rel_parse_val(mvc *m, char *query, char 
        m->sym = NULL;
        o.vars = m->vars;       /* may have been realloc'ed */
        o.sizevars = m->sizevars;
+       o.query = m->query;
        if (m->session->status || m->errstr[0]) {
                int status = m->session->status;
-               char errstr[ERRSIZE];
 
-               strcpy(errstr, m->errstr);
+               strcpy(o.errstr, m->errstr);
                *m = o;
                m->session->status = status;
-               strcpy(m->errstr, errstr);
        } else {
                int label = m->label;
+
+               while (m->topvars > o.topvars) {
+                       if (m->vars[--m->topvars].name)
+                               c_delete(m->vars[m->topvars].name);
+               }
                *m = o;
-
                m->label = label;
        }
        return e;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to