Changeset: 06db13bef999 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=06db13bef999
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_bin.h
        sql/test/BugTracker-2016/Tests/trigger_bulk.Bug-4045.stable.err
Branch: Apr2019
Log Message:

Cleanup and restore after error.


diffs (170 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
@@ -3033,13 +3033,13 @@ rel2bin_sample(backend *be, sql_rel *rel
 }
 
 stmt *
-sql_parse(backend *be, sql_allocator *sa, char *query, char mode)
+sql_parse(backend *be, sql_allocator *sa, const char *query, char mode)
 {
        mvc *m = be->mvc;
        mvc *o = NULL;
        stmt *sq = NULL;
        buffer *b;
-       char *n;
+       char *nquery;
        int len = _strlen(query);
        stream *buf;
        bstream * bst;
@@ -3060,23 +3060,36 @@ sql_parse(backend *be, sql_allocator *sa
        be->depth++;
 
        b = (buffer*)GDKmalloc(sizeof(buffer));
-       if (b == 0)
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       n = GDKmalloc(len + 1 + 1);
-       if (n == 0)
+       if (b == 0) {
+               *m = *o;
+               GDKfree(o);
                return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       snprintf(n, len + 2, "%s\n", query);
-       query = n;
+       }
+       nquery = GDKmalloc(len + 1 + 1);
+       if (nquery == 0) {
+               *m = *o;
+               GDKfree(o);
+               GDKfree(b);
+               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
+       }
+       snprintf(nquery, len + 2, "%s\n", query);
        len++;
-       buffer_init(b, query, len);
+       buffer_init(b, nquery, len);
        buf = buffer_rastream(b, "sqlstatement");
        if(buf == NULL) {
-               buffer_destroy(b);
+               *m = *o;
+               GDKfree(o);
+               GDKfree(b);
+               GDKfree(nquery);
                be->depth--;
                return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
        if((bst = bstream_create(buf, b->len)) == NULL) {
                close_stream(buf);
+               *m = *o;
+               GDKfree(o);
+               GDKfree(b);
+               GDKfree(nquery);
                be->depth--;
                return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
@@ -3093,9 +3106,11 @@ sql_parse(backend *be, sql_allocator *sa
        /* create private allocator */
        m->sa = (sa)?sa:sa_create();
        if (!m->sa) {
-               GDKfree(query);
+               bstream_destroy(bst);
+               *m = *o;
+               GDKfree(o);
                GDKfree(b);
-               bstream_destroy(m->scanner.rs);
+               GDKfree(nquery);
                be->depth--;
                return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
        }
@@ -3103,21 +3118,15 @@ sql_parse(backend *be, sql_allocator *sa
        if (sqlparse(m) || !m->sym) {
                /* oops an error */
                snprintf(m->errstr, ERRSIZE, "An error occurred when executing "
-                               "internal query: %s", query);
+                               "internal query: %s", nquery);
        } else {
                sql_rel *r = rel_semantic(m, m->sym);
 
-               if (r) {
-                       r = rel_optimizer(m, r, 1);
-                       if(!r)
-                               return NULL;
+               if (r && (r = rel_optimizer(m, r, 1)) != NULL)
                        sq = rel_bin(be, r);
-                       if(!sq)
-                               return NULL;
-               }
-       }
-
-       GDKfree(query);
+       }
+
+       GDKfree(nquery);
        GDKfree(b);
        bstream_destroy(m->scanner.rs);
        be->depth--;
@@ -3125,31 +3134,19 @@ sql_parse(backend *be, sql_allocator *sa
                sa_destroy(m->sa);
        m->sym = NULL;
        {
-               char *e = NULL;
                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;
 
-               if (m->session->status || m->errstr[0]) {
-                       e = _STRDUP(m->errstr);
-                       if (!e) {
-                               _DELETE(o);
-                               return NULL;
-                       }
-               }
+               strcpy(o->errstr, m->errstr);
                *m = *o;
                m->sizevars = sizevars;
                m->topvars = topvars;
                m->vars = vars;
                m->session->status = status;
                m->cascade_action = cascade_action;
-               if (e) {
-                       strncpy(m->errstr, e, ERRSIZE);
-                       m->errstr[ERRSIZE - 1] = '\0';
-                       _DELETE(e);
-               }
        }
        _DELETE(o);
        return sq;
diff --git a/sql/backends/monet5/rel_bin.h b/sql/backends/monet5/rel_bin.h
--- a/sql/backends/monet5/rel_bin.h
+++ b/sql/backends/monet5/rel_bin.h
@@ -13,9 +13,9 @@
 #include "sql_statement.h"
 #include "mal_backend.h"
 
-extern stmt * output_rel_bin(backend *be, sql_rel *rel);
+extern stmt *output_rel_bin(backend *be, sql_rel *rel);
 
-extern stmt * sql_parse(backend *be, sql_allocator *sa, char *query, char 
mode);
+extern stmt *sql_parse(backend *be, sql_allocator *sa, const char *query, char 
mode);
 
 extern list *rel_dependencies(mvc *sql, sql_rel *r);
 
diff --git a/sql/test/BugTracker-2016/Tests/trigger_bulk.Bug-4045.stable.err 
b/sql/test/BugTracker-2016/Tests/trigger_bulk.Bug-4045.stable.err
--- a/sql/test/BugTracker-2016/Tests/trigger_bulk.Bug-4045.stable.err
+++ b/sql/test/BugTracker-2016/Tests/trigger_bulk.Bug-4045.stable.err
@@ -31,11 +31,11 @@ stderr of test 'trigger_bulk.Bug-4045` i
 
 MAPI  = (monetdb) /var/tmp/mtest-15541/.s.monetdb.33804
 QUERY = INSERT INTO t111 SELECT * FROM t111;
-ERROR = !SELECT: too many nested operators
+ERROR = !query too complex: running out of stack space
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-21551/.s.monetdb.38677
 QUERY = INSERT INTO t111 VALUES(30,'single');
-ERROR = !SELECT: too many nested operators
+ERROR = !query too complex: running out of stack space
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-21551/.s.monetdb.38677
 QUERY = DROP TABLE t111;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to