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 -- [email protected]
To unsubscribe send an email to [email protected]