Changeset: 2fcd5e98b30e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2fcd5e98b30e
Modified Files:
monetdb5/mal/mal_builder.c
monetdb5/optimizer/opt_deadcode.c
monetdb5/optimizer/opt_evaluate.c
monetdb5/optimizer/opt_support.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_gencode.c
Branch: default
Log Message:
more unchecked malloc failures
diffs (108 lines):
diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c
--- a/monetdb5/mal/mal_builder.c
+++ b/monetdb5/mal/mal_builder.c
@@ -85,7 +85,7 @@ newComment(MalBlkPtr mb, const char *val
InstrPtr q = newInstruction(mb, NULL, NULL);
ValRecord cst;
- if ( q == NULL)
+ if (q == NULL)
return NULL;
q->token = REMsymbol;
q->barrier = 0;
diff --git a/monetdb5/optimizer/opt_deadcode.c
b/monetdb5/optimizer/opt_deadcode.c
--- a/monetdb5/optimizer/opt_deadcode.c
+++ b/monetdb5/optimizer/opt_deadcode.c
@@ -34,8 +34,10 @@ OPTdeadcodeImplementation(Client cntxt,
limit = mb->stop;
slimit = mb->ssize;
- if (newMalBlkStmt(mb, mb->ssize) < 0)
+ if (newMalBlkStmt(mb, mb->ssize) < 0) {
+ actions = -1;
goto wrapup;
+ }
// Calculate the instructions in which a variable is used.
// Variables can be used multiple times in an instruction.
diff --git a/monetdb5/optimizer/opt_evaluate.c
b/monetdb5/optimizer/opt_evaluate.c
--- a/monetdb5/optimizer/opt_evaluate.c
+++ b/monetdb5/optimizer/opt_evaluate.c
@@ -179,7 +179,11 @@ OPTevaluateImplementation(Client cntxt,
profiler = malProfileMode; /* we don't trace it */
malProfileMode = 0;
if ( env == NULL) {
- env = prepareMALstack(mb, 2 * mb->vsize );
+ env = prepareMALstack(mb, 2 * mb->vsize);
+ if (!env) {
+ actions = -1;
+ goto wrapup;
+ }
env->keepAlive = TRUE;
}
msg = reenterMAL(cntxt, mb, i, i + 1, env);
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -144,9 +144,11 @@ optimizeMALBlock(Client cntxt, MalBlkPtr
if (msg) {
str place = getExceptionPlace(msg);
str nmsg =
createException(getExceptionType(msg), place, "%s", getExceptionMessage(msg));
- GDKfree(place);
- GDKfree(msg);
- msg = nmsg;
+ if (nmsg && place) {
+ GDKfree(msg);
+ msg = nmsg;
+ GDKfree(place);
+ }
goto wrapup;
}
if (cntxt->mode == FINISHCLIENT)
@@ -158,11 +160,14 @@ optimizeMALBlock(Client cntxt, MalBlkPtr
wrapup:
/* Keep the total time spent on optimizing the plan for inspection */
- if( actions){
- mb->optimize= GDKusec() - clk;
- snprintf(buf, 256, "%-20s actions=%2d time=" LLFMT " usec",
"total",actions, mb->optimize);
+ if(actions > 0 && msg == MAL_SUCCEED){
+ mb->optimize = GDKusec() - clk;
+ snprintf(buf, 256, "%-20s actions=%2d time=" LLFMT " usec",
"total", actions, mb->optimize);
newComment(mb, buf);
}
+ if (msg != MAL_SUCCEED) {
+ mb->errors++;
+ }
if (cnt >= mb->stop)
throw(MAL, "optimizer.MALoptimizer", OPTIMIZER_CYCLE);
return msg;
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
@@ -319,8 +319,9 @@ SQLrun(Client c, backend *be, mvc *m){
msg = SQLoptimizeQuery(c, mb);
mb->keephistory = FALSE;
- if( mb->errors){
- freeMalBlk(mb);
+ if (mb->errors){
+ //freeMalBlk(mb);
+ // mal block might be so broken free causes segfault
return msg;
}
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
@@ -662,6 +662,10 @@ backend_call(backend *be, Client c, cq *
MalBlkPtr mb = c->curprg->def;
q = newStmt(mb, userRef, cq->name);
+ if (!q) {
+ m->session->status = -3;
+ return;
+ }
/* cached (factorized queries return bit??) */
if (cq->code && getInstrPtr(((Symbol)cq->code)->def, 0)->token ==
FACTORYsymbol) {
setVarType(mb, getArg(q, 0), TYPE_bit);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list