Changeset: e6ae560608a1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e6ae560608a1
Modified Files:
        sql/backends/monet5/sql_execute.c
Branch: default
Log Message:

Fix a few memory leaks under error conditions


diffs (58 lines):

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
@@ -308,6 +308,7 @@ SQLrun(Client c, backend *be, mvc *m)
                if( getFunctionId(p) &&  p->blk && 
qc_isaquerytemplate(getFunctionId(p)) ) {
                        mc = copyMalBlk(p->blk);
                        if (!mc) {
+                               freeMalBlk(mb);
                                throw(SQL, "sql.prepare", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                        }
                        retc = p->retc;
@@ -323,8 +324,10 @@ SQLrun(Client c, backend *be, mvc *m)
                                        throw(SQL, "sql.prepare", 
SQLSTATE(07001) "EXEC: wrong type for argument %d of " "query template : %s, 
expected %s", i + 1, atom_type(arg)->type->sqlname, pt->type->sqlname);
                                }
                                val= (ValPtr) &arg->data;
-                               if (VALcopy(&mb->var[j+retc].value, val) == 
NULL)
+                               if (VALcopy(&mb->var[j+retc].value, val) == 
NULL){
+                                       freeMalBlk(mb);
                                        throw(MAL, "sql.prepare", 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                               }
                                setVarConstant(mb, j+retc);
                                setVarFixed(mb, j+retc);
                        }
@@ -337,10 +340,14 @@ SQLrun(Client c, backend *be, mvc *m)
        if( m->emod & mod_debug)
                mb->keephistory = TRUE;
        msg = SQLoptimizeQuery(c, mb);
+       if( msg != MAL_SUCCEED){
+               // freeMalBlk(mb);
+               return msg;
+       }
        mb->keephistory = FALSE;
 
        if (mb->errors){
-               //freeMalBlk(mb);
+               // freeMalBlk(mb);
                // mal block might be so broken free causes segfault
                return msg;
        }
@@ -507,6 +514,8 @@ SQLstatementIntern(Client c, str *expr, 
        if (!m->sa)
                m->sa = sa_create();
        if (!m->sa) {
+               *m = *o;
+               _DELETE(o);
                bstream_destroy(m->scanner.rs);
                throw(SQL,"sql.statement",MAL_MALLOC_FAIL);
        }
@@ -830,7 +839,8 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                        msg = SQLoptimizeFunction(c,c->curprg->def);
                }
                rel_destroy(rel);
-               SQLrun(c,b,m);
+               if( msg == MAL_SUCCEED)
+                       msg = SQLrun(c,b,m);
                if (!msg) {
                        resetMalBlk(c->curprg->def, oldstop);
                        freeVariables(c, c->curprg->def, NULL, oldvtop);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to