Changeset: 350a1e762bea for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=350a1e762bea
Modified Files:
monetdb5/mal/mal_instruction.c
sql/backends/monet5/sql_gencode.c
Branch: Jan2014
Log Message:
Added error checking.
diffs (truncated from 1665 to 300 lines):
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
@@ -1579,6 +1579,10 @@ pushArgument(MalBlkPtr mb, InstrPtr p, i
{
if (p == NULL)
return NULL;
+ if (varid < 0) {
+ freeInstruction(p);
+ return NULL;
+ }
assert(varid >= 0);
if (p->argc + 1 == p->maxarg) {
InstrPtr pn;
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
@@ -576,15 +576,20 @@ static int
q = newStmt2(mb, mod, name);
q = pushArgument(mb, q, o1);
+ if (q == NULL)
+ return -1;
return getDestVar(q);
}
-static void
+static int
dump_1(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
{
int o1 = _dumpstmt(sql, mb, s->op1);
+ if (o1 < 0)
+ return -1;
s->nr = _dump_1(mb, mod, name, o1);
+ return s->nr;
}
static int
@@ -595,29 +600,43 @@ static int
q = newStmt2(mb, mod, name);
q = pushArgument(mb, q, o1);
q = pushArgument(mb, q, o2);
+ if (q == NULL)
+ return -1;
return getDestVar(q);
}
-static void
+static int
dump_2(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
{
int o1 = _dumpstmt(sql, mb, s->op1);
int o2 = _dumpstmt(sql, mb, s->op2);
+ if ((o1 = _dumpstmt(sql, mb, s->op1)) < 0)
+ return -1;
+ if ((o2 = _dumpstmt(sql, mb, s->op2)) < 0)
+ return -1;
s->nr = _dump_2(mb, mod, name, o1, o2);
+ return s->nr;
}
-static void
+static int
dump_2_(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
{
InstrPtr q;
- int o1 = _dumpstmt(sql, mb, s->op1);
- int o2 = _dumpstmt(sql, mb, s->op2);
+ int o1, o2;
+
+ if ((o1 = _dumpstmt(sql, mb, s->op1)) < 0)
+ return -1;
+ if ((o2 = _dumpstmt(sql, mb, s->op2)) < 0)
+ return -1;
q = newStmt1(mb, mod, name);
q = pushArgument(mb, q, o1);
q = pushArgument(mb, q, o2);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
+ return 0;
}
static InstrPtr
@@ -626,6 +645,8 @@ multiplex2(MalBlkPtr mb, char *mod, char
InstrPtr q;
q = newStmt(mb, "mal", "multiplex");
+ if (q == NULL)
+ return NULL;
setVarType(mb, getArg(q, 0), newBatType(TYPE_oid, rtype));
setVarUDFtype(mb, getArg(q, 0));
q = pushStr(mb, q, convertMultiplexMod(mod, name));
@@ -635,16 +656,6 @@ multiplex2(MalBlkPtr mb, char *mod, char
return q;
}
-static InstrPtr
-multiplexN(MalBlkPtr mb, char *mod, char *name)
-{
- InstrPtr q = NULL;
-
- if (strcmp(name, "rotate_xor_hash") == 0 && strcmp(mod, "calc") == 0)
- q = newStmt(mb, "mkey", "bulk_rotate_xor_hash");
- return q;
-}
-
#define SMALLBUFSIZ 64
static int
dump_joinN(backend *sql, MalBlkPtr mb, stmt *s)
@@ -725,6 +736,8 @@ static int
switch (s->type) {
case st_none:{
q = newAssignment(mb);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
(void) pushInt(mb, q, 1);
} break;
@@ -736,6 +749,8 @@ static int
q = newStmt1(mb, sqlRef, "getVariable");
q = pushArgument(mb, q, sql->mvc_var);
q = pushStr(mb, q,
s->op1->op4.aval->data.val.sval);
+ if (q == NULL)
+ return -1;
setVarType(mb, getArg(q, 0), tt);
setVarUDFtype(mb, getArg(q, 0));
} else if ((s->flag & VAR_DECLARE) == 0) {
@@ -744,6 +759,8 @@ static int
(void) snprintf(buf, MAXIDENTLEN,
"A%s", s->op1->op4.aval->data.val.sval);
q = newAssignment(mb);
q = pushArgumentId(mb, q, buf);
+ if (q == NULL)
+ return -1;
} else {
int tt = tail_type(s)->type->localtype;
char *buf = GDKmalloc(MAXIDENTLEN);
@@ -757,10 +774,14 @@ static int
}
(void) snprintf(buf, MAXIDENTLEN,
"A%s", s->op1->op4.aval->data.val.sval);
q = newInstruction(mb, ASSIGNsymbol);
+ if (q == NULL)
+ return -1;
q->argc = q->retc = 0;
q = pushArgumentId(mb, q, buf);
q = pushNil(mb, q, tt);
pushInstruction(mb, q);
+ if (q == NULL)
+ return -1;
q->retc++;
}
} else {
@@ -773,6 +794,8 @@ static int
(void) snprintf(buf, SMALLBUFSIZ,
"A%d", s->flag);
q = pushArgumentId(mb, q, buf);
}
+ if (q == NULL)
+ return -1;
}
s->nr = getDestVar(q);
} break;
@@ -781,9 +804,15 @@ static int
int tt = s->op4.typeval.type->localtype;
int val = _dumpstmt(sql, mb, s->op1);
+ if (val < 0)
+ return -1;
q = newStmt1(mb, sqlRef, "single");
+ if (q == NULL)
+ return -1;
setVarType(mb, getArg(q, 0), newBatType(ht, tt));
q = pushArgument(mb, q, val);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
} break;
case st_temp:{
@@ -791,10 +820,14 @@ static int
int tt = s->op4.typeval.type->localtype;
q = newStmt1(mb, batRef, "new");
+ if (q == NULL)
+ return -1;
setVarType(mb, getArg(q, 0), newBatType(ht, tt));
setVarUDFtype(mb, getArg(q, 0));
q = pushType(mb, q, ht);
q = pushType(mb, q, tt);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
} break;
@@ -804,11 +837,15 @@ static int
sql_table *t = s->op4.tval;
q = newStmt1(mb, sqlRef, "tid");
+ if (q == NULL)
+ return -1;
setVarType(mb, getArg(q, 0), newBatType(ht, tt));
setVarUDFtype(mb, getArg(q, 0));
q = pushArgument(mb, q, sql->mvc_var);
q = pushSchema(mb, q, t);
q = pushStr(mb, q, t->base.name);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
}
break;
@@ -818,6 +855,8 @@ static int
sql_table *t = s->op4.cval->t;
q = newStmt2(mb, sqlRef, bindRef);
+ if (q == NULL)
+ return -1;
if (s->flag == RD_UPD) {
q = pushReturn(mb, q, newTmpVariable(mb,
newBatType(ht, tt)));
} else
@@ -827,6 +866,8 @@ static int
q = pushStr(mb, q, t->base.name);
q = pushStr(mb, q, s->op4.cval->base.name);
q = pushInt(mb, q, s->flag);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
if (s->flag == RD_UPD) {
@@ -841,6 +882,8 @@ static int
sql_table *t = s->op4.idxval->t;
q = newStmt2(mb, sqlRef, bindidxRef);
+ if (q == NULL)
+ return -1;
if (s->flag == RD_UPD) {
q = pushReturn(mb, q, newTmpVariable(mb,
newBatType(ht, tt)));
} else
@@ -850,6 +893,8 @@ static int
q = pushStr(mb, q, t->base.name);
q = pushStr(mb, q, s->op4.idxval->base.name);
q = pushInt(mb, q, s->flag);
+ if (q == NULL)
+ return -1;
s->nr = getDestVar(q);
if (s->flag == RD_UPD) {
@@ -859,36 +904,49 @@ static int
}
break;
case st_const:{
- if (s->op2)
- dump_2(sql, mb, s, algebraRef, projectRef);
- else
- dump_1(sql, mb, s, algebraRef, projectRef);
+ if (s->op2) {
+ if (dump_2(sql, mb, s, algebraRef, projectRef)
< 0)
+ return -1;
+ } else {
+ if (dump_1(sql, mb, s, algebraRef, projectRef)
< 0)
+ return -1;
+ }
}
break;
case st_mark:{
- dump_2(sql, mb, s, algebraRef, markTRef);
+ if (dump_2(sql, mb, s, algebraRef, markTRef) < 0)
+ return -1;
}
break;
case st_gen_group:{
- dump_2(sql, mb, s, algebraRef, groupbyRef);
+ if (dump_2(sql, mb, s, algebraRef, groupbyRef) < 0)
+ return -1;
}
break;
case st_reverse:{
- dump_1(sql, mb, s, batRef, reverseRef);
+ if (dump_1(sql, mb, s, batRef, reverseRef) < 0)
+ return -1;
}
break;
case st_mirror:{
- dump_1(sql, mb, s, batRef, mirrorRef);
+ if (dump_1(sql, mb, s, batRef, mirrorRef) < 0)
+ return -1;
}
break;
case st_limit2:
case st_limit:{
- int l = _dumpstmt(sql, mb, s->op1);
- stmt *l1 = (s->type == st_limit2) ?
s->op1->op4.lval->h->data : s->op1;
- stmt *l2 = (s->type == st_limit2) ?
s->op1->op4.lval->t->data : NULL;
- int offset = _dumpstmt(sql, mb, s->op2);
- int len = _dumpstmt(sql, mb, s->op3);
- int la = (l2) ? l2->nr : 0;
+ stmt *l1, *l2;
+ int l, offset, len, la;
+
+ if ((l = _dumpstmt(sql, mb, s->op1)) < 0)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list