Changeset: 1556d7390b49 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1556d7390b49
Modified Files:
        monetdb5/mal/mal_builder.c
        monetdb5/mal/mal_instruction.c
        monetdb5/optimizer/opt_mergetable.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/common/sql_list.c
Branch: Jun2023
Log Message:

Lots of error checking.


diffs (truncated from 951 to 300 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
@@ -536,7 +536,6 @@ getStrConstant(MalBlkPtr mb, str val)
                memcpy(cst.val.sval, val, cst.len); /* includes terminating \0 
*/
                _t = defConstant(mb, TYPE_str, &cst);
        }
-       assert(_t >= 0);
        return _t;
 }
 
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
@@ -1191,8 +1191,8 @@ extendInstruction(MalBlkPtr mb, InstrPtr
 InstrPtr
 pushArgument(MalBlkPtr mb, InstrPtr p, int varid)
 {
-       if (p == NULL)
-               return NULL;
+       if (p == NULL || mb->errors)
+               return p;
        if (varid < 0) {
                /* leave everything as is in this exceptional programming error 
*/
                mb->errors = createMalException(mb, 0, TYPE,"improper variable 
id");
@@ -1221,8 +1221,8 @@ setArgument(MalBlkPtr mb, InstrPtr p, in
 {
        int i;
 
-       if (p == NULL)
-               return NULL;
+       if (p == NULL || mb->errors)
+               return p;
        p = pushArgument(mb, p, varid); /* make space */
        if (p == NULL)
                return NULL;
@@ -1235,8 +1235,8 @@ setArgument(MalBlkPtr mb, InstrPtr p, in
 InstrPtr
 pushReturn(MalBlkPtr mb, InstrPtr p, int varid)
 {
-       if (p == NULL)
-               return NULL;
+       if (p == NULL || mb->errors)
+               return p;
        if (p->retc == 1 && p->argv[0] == -1) {
                p->argv[0] = varid;
                return p;
@@ -1258,8 +1258,8 @@ pushArgumentId(MalBlkPtr mb, InstrPtr p,
 {
        int v;
 
-       if (p == NULL)
-               return NULL;
+       if (p == NULL || mb->errors)
+               return p;
        v = findVariable(mb, name);
        if (v < 0) {
                size_t namelen = strlen(name);
@@ -1348,28 +1348,27 @@ pushInstruction(MalBlkPtr mb, InstrPtr p
        extra = mb->vsize - mb->vtop; // the extra variables already known
        if (mb->stop + 1 >= mb->ssize) {
                int s = ((mb->ssize + extra) / MALCHUNK + 1) * MALCHUNK;
-               if( resizeMalBlk(mb, s) < 0 ){
-                       /* perhaps we can continue with a smaller increment.
-                        * But the block remains marked as faulty.
+               if (resizeMalBlk(mb, s) < 0) {
+                       /* we are now left with the situation that the new
+                        * instruction is dangling.
+                        * The hack is to take an instruction out of the block 
that
+                        * is likely not referenced independently.
+                        * The last resort is to take the first, which should 
always
+                        * be there.
+                        * This assumes that no references are kept elsewhere 
to the
+                        * statement.
                         */
-                       if( resizeMalBlk(mb,mb->ssize + 1) < 0){
-                               /* we are now left with the situation that the 
new instruction is dangling .
-                                * The hack is to take an instruction out of 
the block that is likely not referenced independently
-                                * The last resort is to take the first, which 
should always be there
-                                * This assumes that no references are kept 
elsewhere to the statement
-                                */
-                               for( i = 1; i < mb->stop; i++){
-                                       q= getInstrPtr(mb,i);
-                                       if( q->token == REMsymbol){
-                                               freeInstruction(q);
-                                               mb->stmt[i] = p;
-                                               return;
-                                       }
+                       for (i = 1; i < mb->stop; i++) {
+                               q = getInstrPtr(mb,i);
+                               if (q->token == REMsymbol) {
+                                       freeInstruction(q);
+                                       mb->stmt[i] = p;
+                                       return;
                                }
-                               freeInstruction(getInstrPtr(mb,0));
-                               mb->stmt[0] = p;
-                               return;
                        }
+                       freeInstruction(getInstrPtr(mb, 0));
+                       mb->stmt[0] = p;
+                       return;
                }
        }
        if (mb->stmt[mb->stop])
diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -176,6 +176,12 @@ mat_pack(MalBlkPtr mb, matlist_t *ml, in
                getArg(r,0) = getArg(ml->v[m].mi, 0);
                for(l=ml->v[m].mi->retc; l< ml->v[m].mi->argc; l++)
                        r= pushArgument(mb,r, getArg(ml->v[m].mi,l));
+               if (mb->errors) {
+                       freeInstruction(r);
+                       char *msg = mb->errors;
+                       mb->errors = NULL;
+                       return msg;
+               }
        }
        matlist_pack(ml, m);
        pushInstruction(mb, r);
@@ -188,7 +194,10 @@ checksize(matlist_t *ml, int v)
        if (v >= ml->vsize) {
                int sz = ml->vsize, i, *nhorigin, *ntorigin, *nvars;
 
-               unsigned int nvsize = ml->vsize * 2;
+               int nvsize = ml->vsize * 2;
+               assert(v < nvsize);
+               if (v >= nvsize)
+                       nvsize = v + 10;
                nhorigin = (int*) GDKrealloc(ml->horigin, sizeof(int)* nvsize);
                if (nhorigin == NULL)
                        return -1;
@@ -222,6 +231,7 @@ setPartnr(matlist_t *ml, int ivar, int o
                tpnr = ml->torigin[ivar];
        if (tpnr >= 0)
                ml->torigin[ovar] = tpnr;
+       assert(ovar < ml->vsize);
        ml->horigin[ovar] = pnr;
        //printf("%d %d ", pnr, tpnr);
        return 0;
@@ -239,6 +249,7 @@ propagatePartnr(matlist_t *ml, int ivar,
                tpnr = ml->horigin[ivar];
        if (tpnr >= 0)
                ml->torigin[ovar] = tpnr;
+       assert(ovar < ml->vsize);
        ml->horigin[ovar] = pnr;
        //printf("%d %d ", pnr, tpnr);
        return 0;
@@ -254,6 +265,7 @@ propagateMirror(matlist_t *ml, int ivar,
                return -1;
        tpnr = ml->horigin[ivar];
        if (tpnr >= 0) {
+               assert(ovar < ml->vsize);
                ml->horigin[ovar] = tpnr;
                ml->torigin[ovar] = tpnr;
        }
@@ -331,7 +343,11 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I
                                        getArg(q, ovar) = getArg(mat[o].mi, j);
                                        getArg(q, evar) = getArg(mat[e].mi, k);
                                        pushInstruction(mb, q);
-                                       if(setPartnr(ml, getArg(mat[m].mi, j), 
getArg(q,0), nr)) {
+                                       if (mb->errors) {
+                                               freeInstruction(r);
+                                               return NULL;
+                                       }
+                                       if (setPartnr(ml, getArg(mat[m].mi, j), 
getArg(q,0), nr)) {
                                                freeInstruction(r);
                                                return NULL;
                                        }
@@ -356,6 +372,10 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I
                        if (e >= 0)
                                getArg(q, evar) = getArg(mat[e].mi, k);
                        pushInstruction(mb, q);
+                       if (mb->errors) {
+                               freeInstruction(r);
+                               return NULL;
+                       }
                        if(setPartnr(ml, is_subdelta?getArg(mat[m].mi, k):-1, 
getArg(q,0), k)) {
                                freeInstruction(r);
                                return NULL;
@@ -374,6 +394,8 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I
                        q = pushArgument(mb, q, getArg(r, 0));
                        pushInstruction(mb, r);
                        pushInstruction(mb, q);
+                       if (mb->errors)
+                               return NULL;
                        pushed = 1;
                        r = q;
                }
@@ -450,6 +472,10 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat
                q = pushOid(mb, q, 0);
                ident_var = getArg(q, 0);
                pushInstruction(mb, q);
+               if (mb->errors) {
+                       freeInstruction(r);
+                       return -1;
+               }
        }
        for(k=1; k < mat[m].mi->argc; k++) {
                int res = 0;
@@ -477,6 +503,10 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat
                }
                ident_var = getArg(q, 1);
                pushInstruction(mb, q);
+               if (mb->errors) {
+                       freeInstruction(r);
+                       return -1;
+               }
                if (is_mirror || is_identity) {
                        res = propagateMirror(ml, getArg(mat[m].mi, k), 
getArg(q,0));
                } else if (is_select)
@@ -489,6 +519,10 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat
                }
                r = pushArgument(mb, r, getArg(q, 0));
        }
+       if (mb->errors) {
+               freeInstruction(r);
+               return -1;
+       }
        if(!r || mat_add(ml, r, mat_type(ml->v, m), getFunctionId(p))) {
                return -1;
        }
@@ -523,9 +557,9 @@ mat_apply(MalBlkPtr mb, InstrPtr p, matl
        if(!r)
                return -1;
        for(k=0; k < p->retc; k++) {
-               if((r[k] = newInstructionArgs(mb, matRef, packRef, parts)) == 
NULL) {
-                       for(l=0; l < k; l++)
-                               freeInstruction(r[l]);
+               if ((r[k] = newInstructionArgs(mb, matRef, packRef, parts)) == 
NULL) {
+                       while (k > 0)
+                               freeInstruction(r[--k]);
                        GDKfree(r);
                        return -1;
                }
@@ -535,7 +569,9 @@ mat_apply(MalBlkPtr mb, InstrPtr p, matl
        for(k = 1; k < ml->v[matvar[0]].mi->argc; k++) {
                int tpe;
                InstrPtr q = copyInstruction(p);
-               if(!q) {
+               if (q == NULL) {
+                       for (k = 0; k < p->retc; k++)
+                               freeInstruction(r[k]);
                        GDKfree(r);
                        return -1;
                }
@@ -1272,10 +1308,14 @@ mat_group_project(MalBlkPtr mb, InstrPtr
        mat_t *mat = ml->v;
        InstrPtr ai1 = newInstructionArgs(mb, matRef, packRef, 
mat[a].mi->argc), r;
 
-       if(!ai1)
+       if (!ai1)
                return -1;
 
        getArg(ai1,0) = newTmpVariable(mb, tp);
+       if (mb->errors) {
+               freeInstruction(ai1);
+               return -1;
+       }
 
        assert(mat[e].mi->argc == mat[a].mi->argc);
        for(k=1; k<mat[a].mi->argc; k++) {
@@ -1289,6 +1329,10 @@ mat_group_project(MalBlkPtr mb, InstrPtr
                getArg(q,1) = getArg(mat[e].mi,k);
                getArg(q,2) = getArg(mat[a].mi,k);
                pushInstruction(mb,q);
+               if (mb->errors) {
+                       freeInstruction(ai1);
+                       return -1;
+               }
                if(setPartnr(ml, getArg(mat[a].mi,k), getArg(q,0), k)){
                        freeInstruction(ai1);
                        return -1;
@@ -1298,13 +1342,16 @@ mat_group_project(MalBlkPtr mb, InstrPtr
                ai1 = pushArgument(mb,ai1,getArg(q,0));
        }
        pushInstruction(mb, ai1);
+       if (mb->errors) {
+               return -1;
+       }
 
        if((r = copyInstruction(p)) == NULL)
                return -1;
        getArg(r,1) = mat[e].mv;
        getArg(r,2) = getArg(ai1,0);
        pushInstruction(mb,r);
-       return 0;
+       return mb->errors ? -1 : 0;
 }
 
 /* Per partition aggregates are merged and aggregated together. For
@@ -2173,7 +2220,7 @@ OPTmergetableImplementation(Client cntxt
        ml.vsize = mb->vsize;
        ml.horigin = (int*) GDKmalloc(sizeof(int)* ml.vsize);
        ml.torigin = (int*) GDKmalloc(sizeof(int)* ml.vsize);
-       ml.vars = (int*) GDKzalloc(sizeof(int)* ml.vsize);
+       ml.vars = (int*) GDKmalloc(sizeof(int)* ml.vsize);
        if ( ml.v == NULL || ml.horigin == NULL || ml.torigin == NULL || 
ml.vars == NULL) {
                goto cleanup;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to