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