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