Changeset: 7c0e4baa6fed for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7c0e4baa6fed
Modified Files:
monetdb5/mal/mal_instruction.c
monetdb5/optimizer/opt_wrapper.c
sql/backends/monet5/sql_execute.c
sql/test/malloc_fail/Tests/All
sql/test/malloc_fail/Tests/mallocs.SQL.py
Branch: default
Log Message:
more malloc fail checks and re-enabled test case
diffs (110 lines):
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -263,13 +263,17 @@ copyMalBlk(MalBlkPtr old)
// copy all variable records
for (i = 0; i < old->vtop; i++) {
mb->var[i]= old->var[i];
- VALcopy(&(mb->var[i].value), &(old->var[i].value));
+ if (!VALcopy(&(mb->var[i].value), &(old->var[i].value))) {
+ GDKfree(mb);
+ GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
+ return NULL;
+ }
}
mb->stmt = (InstrPtr *) GDKzalloc(sizeof(InstrPtr) * old->ssize);
if (mb->stmt == NULL) {
- GDKfree(mb->var);
+ GDKfree(mb->var); // this leaks strings in var
GDKfree(mb);
GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
return NULL;
@@ -278,10 +282,20 @@ copyMalBlk(MalBlkPtr old)
mb->stop = old->stop;
mb->ssize = old->ssize;
assert(old->stop < old->ssize);
- for (i = 0; i < old->stop; i++)
+ for (i = 0; i < old->stop; i++) {
mb->stmt[i] = copyInstruction(old->stmt[i]);
-
+ if(!mb->stmt[i]) {
+ GDKfree(mb);
+ GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
+ return NULL;
+ }
+ }
mb->help = old->help ? GDKstrdup(old->help) : NULL;
+ if (old->help && !mb->help) {
+ GDKfree(mb);
+ GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
+ return NULL;
+ }
strncpy(mb->binding, old->binding, IDLENGTH);
mb->errors = old->errors;
mb->tag = old->tag;
diff --git a/monetdb5/optimizer/opt_wrapper.c b/monetdb5/optimizer/opt_wrapper.c
--- a/monetdb5/optimizer/opt_wrapper.c
+++ b/monetdb5/optimizer/opt_wrapper.c
@@ -146,7 +146,7 @@ str OPTwrapper (Client cntxt, MalBlkPtr
for (i=0; codes[i].nme; i++)
if (strcmp(codes[i].nme, optimizer) == 0){
actions = (int)(*(codes[i].fcn))(cntxt, mb, stk, 0);
- if (actions < 1) {
+ if (actions < 0) {
throw(MAL, optimizer, "Error in optimizer %s",
optimizer);
}
break;
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
@@ -271,6 +271,9 @@ SQLrun(Client c, backend *be, mvc *m){
return createException(PARSE, "SQLparser", "%s", m->errstr);
// locate and inline the query template instruction
mb = copyMalBlk(c->curprg->def);
+ if (!mb) {
+ throw(SQL, "sql.prepare", "Out of memory");
+ }
mb->history = c->curprg->def->history;
c->curprg->def->history = 0;
diff --git a/sql/test/malloc_fail/Tests/All b/sql/test/malloc_fail/Tests/All
--- a/sql/test/malloc_fail/Tests/All
+++ b/sql/test/malloc_fail/Tests/All
@@ -1,1 +1,1 @@
-# mallocs not run for now since it hangs mserver
+# mallocs still hangs
diff --git a/sql/test/malloc_fail/Tests/mallocs.SQL.py
b/sql/test/malloc_fail/Tests/mallocs.SQL.py
--- a/sql/test/malloc_fail/Tests/mallocs.SQL.py
+++ b/sql/test/malloc_fail/Tests/mallocs.SQL.py
@@ -1,6 +1,10 @@
import pymonetdb
import os
+import logging
+logging.basicConfig()
+
+
dbh = pymonetdb.connect(database = os.environ['TSTDB'],
port = int(os.environ['MAPIPORT']),
hostname = "localhost")
@@ -15,14 +19,15 @@ create procedure setmallocsuccesscount(c
call setmallocsuccesscount(%d);
SELECT * FROM tables;
"""
-i = 3300
+i = 3000
+
while i > 1000:
- #print(i)
+ print(i)
i-=1
try:
cursor.execute(q % (i))
except Exception as e:
- #print(e)
+ # print(e)
pass
finally:
dbh.rollback()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list