Changeset: ddba345b8dc0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ddba345b8dc0
Modified Files:
monetdb5/mal/mal_profiler.c
sql/backends/monet5/sql.c
Branch: default
Log Message:
BUNappend checks.
diffs (223 lines):
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -858,8 +858,13 @@ cachedProfilerEvent(MalBlkPtr mb, MalStk
errors += BUNappend(TRACE_id_majflt, &v4, FALSE) != GDK_SUCCEED;
errors += BUNappend(TRACE_id_nvcsw, &v5, FALSE) != GDK_SUCCEED;
errors += BUNappend(TRACE_id_stmt, c, FALSE) != GDK_SUCCEED;
- TRACE_event++;
- eventcounter++;
+ if (errors > 0) {
+ /* stop profiling if an error occurred */
+ sqlProfiling = FALSE;
+ } else {
+ TRACE_event++;
+ eventcounter++;
+ }
MT_lock_unset(&mal_profileLock);
GDKfree(stmt);
}
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -570,8 +570,12 @@ sql_variables(Client cntxt, MalBlkPtr mb
vars = COLnew(0, TYPE_str, m->topvars, TRANSIENT);
if (vars == NULL)
throw(SQL, "sql.variables", MAL_MALLOC_FAIL);
- for (i = 0; i < m->topvars && !m->vars[i].frame; i++)
- BUNappend(vars, m->vars[i].name, FALSE);
+ for (i = 0; i < m->topvars && !m->vars[i].frame; i++) {
+ if (BUNappend(vars, m->vars[i].name, FALSE) != GDK_SUCCEED) {
+ BBPreclaim(vars);
+ throw(SQL, "sql.variables", MAL_MALLOC_FAIL);
+ }
+ }
*res = vars->batCacheid;
BBPkeepref(vars->batCacheid);
return MAL_SUCCEED;
@@ -686,7 +690,12 @@ mvc_bat_next_value(Client cntxt, MalBlkP
seqbulk_destroy(sb);
throw(SQL, "sql.next_value", "error");
}
- BUNappend(r, &l, FALSE);
+ if (BUNappend(r, &l, FALSE) != GDK_SUCCEED) {
+ BBPunfix(b->batCacheid);
+ BBPunfix(r->batCacheid);
+ seqbulk_destroy(sb);
+ throw(SQL, "sql.next_value", MAL_MALLOC_FAIL);
+ }
}
if (sb)
seqbulk_destroy(sb);
@@ -2689,27 +2698,36 @@ mvc_bin_import_table_wrap(Client cntxt,
throw(SQL, "sql", MAL_MALLOC_FAIL);
/* this code should be extended to deal with larger
text strings. */
f = fopen(*getArgReference_str(stk, pci, i), "r");
- if (f == NULL)
+ if (f == NULL) {
+ BBPreclaim(c);
throw(SQL, "sql", "Failed to re-open file %s",
fname);
+ }
buf = GDKmalloc(bufsiz);
if (!buf) {
fclose(f);
+ BBPreclaim(c);
throw(SQL, "sql", "Failed to create buffer");
}
while (fgets(buf, bufsiz, f) != NULL) {
char *t = strrchr(buf, '\n');
if (t)
*t = 0;
- BUNappend(c, buf, FALSE);
+ if (BUNappend(c, buf, FALSE) != GDK_SUCCEED) {
+ BBPreclaim(c);
+ fclose(f);
+ throw(SQL, "sql", MAL_MALLOC_FAIL);
+ }
}
fclose(f);
GDKfree(buf);
} else {
throw(SQL, "sql", "Failed to attach file %s", fname);
}
- if (init && cnt != BATcount(c))
+ if (init && cnt != BATcount(c)) {
+ BBPunfix(c->batCacheid);
throw(SQL, "sql", "binary files for table '%s' have
inconsistent counts", tname);
+ }
cnt = BATcount(c);
init = 1;
*getArgReference_bat(stk, pci, i - (2 + pci->retc)) =
c->batCacheid;
@@ -2728,8 +2746,13 @@ mvc_bin_import_table_wrap(Client cntxt,
const void* nil = ATOMnilptr(tpe);
// fill the new BAT with NULL values
c = COLnew(0, tpe, cnt, TRANSIENT);
+ if (c == NULL)
+ throw(SQL, "sql", MAL_MALLOC_FAIL);
for(loop = 0; loop < cnt; loop++) {
- BUNappend(c, nil, 0);
+ if (BUNappend(c, nil, 0) !=
GDK_SUCCEED) {
+ BBPreclaim(c);
+ throw(SQL, "sql",
MAL_MALLOC_FAIL);
+ }
}
*getArgReference_bat(stk, pci, i - (2 +
pci->retc)) = c->batCacheid;
BBPkeepref(c->batCacheid);
@@ -3120,7 +3143,10 @@ SQLbat_alpha_cst(bat *res, const bat *de
c2 = cos(radians(d + *theta));
r = degrees(fabs(atan(s / sqrt(fabs(c1 * c2)))));
}
- BUNappend(bn, &r, FALSE);
+ if (BUNappend(bn, &r, FALSE) != GDK_SUCCEED) {
+ BBPreclaim(bn);
+ throw(SQL, "sql.alpha", MAL_MALLOC_FAIL);
+ }
}
*res = bn->batCacheid;
BBPkeepref(bn->batCacheid);
@@ -3160,7 +3186,10 @@ SQLcst_alpha_bat(bat *res, const dbl *de
c2 = cos(radians(d + *theta));
r = degrees(fabs(atan(s / sqrt(fabs(c1 * c2)))));
}
- BUNappend(bn, &r, FALSE);
+ if (BUNappend(bn, &r, FALSE) != GDK_SUCCEED) {
+ BBPreclaim(bn);
+ throw(SQL, "sql.alpha", MAL_MALLOC_FAIL);
+ }
}
BBPkeepref(*res = bn->batCacheid);
BBPunfix(b->batCacheid);
@@ -3381,8 +3410,12 @@ dump_cache(Client cntxt, MalBlkPtr mb, M
for (q = m->qc->q; q; q = q->next) {
if (q->type != Q_PREPARE) {
- BUNappend(query, q->codestring, FALSE);
- BUNappend(count, &q->count, FALSE);
+ if (BUNappend(query, q->codestring, FALSE) !=
GDK_SUCCEED ||
+ BUNappend(count, &q->count, FALSE) != GDK_SUCCEED) {
+ BBPunfix(query->batCacheid);
+ BBPunfix(count->batCacheid);
+ throw(SQL, "sql.dumpcache", MAL_MALLOC_FAIL);
+ }
}
}
*rquery = query->batCacheid;
@@ -3403,20 +3436,24 @@ dump_opt_stats(Client cntxt, MalBlkPtr m
bat *rrewrite = getArgReference_bat(stk, pci, 0);
bat *rcount = getArgReference_bat(stk, pci, 1);
- if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
- return msg;
- if ((msg = checkSQLContext(cntxt)) != NULL)
+ if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL ||
+ (msg = checkSQLContext(cntxt)) != NULL)
return msg;
cnt = m->qc->id;
rewrite = COLnew(0, TYPE_str, cnt, TRANSIENT);
- if (rewrite == NULL)
+ count = COLnew(0, TYPE_int, cnt, TRANSIENT);
+ if (rewrite == NULL || count == NULL) {
+ BBPreclaim(rewrite);
+ BBPreclaim(count);
throw(SQL, "sql.optstats", MAL_MALLOC_FAIL);
- count = COLnew(0, TYPE_int, cnt, TRANSIENT);
- if (count == NULL)
+ }
+
+ if (BUNappend(rewrite, "joinidx", FALSE) != GDK_SUCCEED ||
+ BUNappend(count, &m->opt_stats[0], FALSE) != GDK_SUCCEED) {
+ BBPreclaim(rewrite);
+ BBPreclaim(count);
throw(SQL, "sql.optstats", MAL_MALLOC_FAIL);
-
- BUNappend(rewrite, "joinidx", FALSE);
- BUNappend(count, &m->opt_stats[0], FALSE);
+ }
/* TODO add other rewrites */
*rrewrite = rewrite->batCacheid;
@@ -3590,7 +3627,12 @@ do_sql_rank_grp(bat *rid, const bat *bid
c = rank = nrank = 1;
oc = on;
gc = gn;
- BUNappend(r, &rank, FALSE);
+ if (BUNappend(r, &rank, FALSE) != GDK_SUCCEED) {
+ BBPunfix(b->batCacheid);
+ BBPunfix(g->batCacheid);
+ BBPunfix(r->batCacheid);
+ throw(SQL, name, MAL_MALLOC_FAIL);
+ }
nrank += !dense || c;
}
BBPunfix(b->batCacheid);
@@ -3625,7 +3667,8 @@ do_sql_rank(bat *rid, const bat *bid, in
}
if (BATtdense(b)) {
BATloop(b, p, q) {
- BUNappend(r, &rank, FALSE);
+ if (BUNappend(r, &rank, FALSE) != GDK_SUCCEED)
+ goto bailout;
rank++;
}
} else {
@@ -3634,13 +3677,18 @@ do_sql_rank(bat *rid, const bat *bid, in
if ((c = cmp(n, cur)) != 0)
rank = nrank;
cur = n;
- BUNappend(r, &rank, FALSE);
+ if (BUNappend(r, &rank, FALSE) != GDK_SUCCEED)
+ goto bailout;
nrank += !dense || c;
}
}
BBPunfix(b->batCacheid);
BBPkeepref(*rid = r->batCacheid);
return MAL_SUCCEED;
+ bailout:
+ BBPunfix(b->batCacheid);
+ BBPunfix(r->batCacheid);
+ throw(SQL, name, MAL_MALLOC_FAIL);
}
str
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list