Changeset: 23d6d6d1c5f8 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=23d6d6d1c5f8
Modified Files:
gdk/gdk.h
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_join.c
gdk/gdk_join_legacy.c
gdk/gdk_sample.c
gdk/gdk_select.c
gdk/gdk_utils.c
monetdb5/extras/sphinx/sphinx.c
monetdb5/modules/atoms/mtime.c
monetdb5/modules/kernel/algebra.c
monetdb5/modules/kernel/array.c
monetdb5/modules/kernel/bat5.c
monetdb5/modules/kernel/batmmath.c
monetdb5/modules/kernel/batstr.c
monetdb5/modules/kernel/microbenchmark.c
monetdb5/modules/mal/clients.c
monetdb5/modules/mal/cluster.c
monetdb5/modules/mal/mat.c
monetdb5/modules/mal/mdb.c
monetdb5/modules/mal/pcre.c
monetdb5/modules/mal/zorder.c
sql/backends/monet5/sql.c
sql/storage/bat/bat_utils.c
Branch: Jan2014
Log Message:
Check result of BATnew.
Almost all calls are checked. An important set not properly checked
yet is in gdk_logger.c.
diffs (truncated from 717 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1159,7 +1159,8 @@ gdk_export void HEAP_free(Heap *heap, va
*/
#define BATDELETE (-9999)
-gdk_export BAT *BATnew(int hdtype, int tltype, BUN capacity);
+gdk_export BAT *BATnew(int hdtype, int tltype, BUN capacity)
+ __attribute__((warn_unused_result));
gdk_export BAT *BATextend(BAT *b, BUN newcap);
/* internal */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -382,10 +382,12 @@ BATclone(BAT *b, BUN cap)
{
BAT *c = BATnew(b->htype, b->ttype, cap);
- if (c && c->htype == TYPE_void && b->hseqbase != oid_nil)
- BATseqbase(c, b->hseqbase);
- if (c && c->ttype == TYPE_void && b->tseqbase != oid_nil)
- BATseqbase(BATmirror(c), b->tseqbase);
+ if (c) {
+ if (c->htype == TYPE_void && b->hseqbase != oid_nil)
+ BATseqbase(c, b->hseqbase);
+ if (c->ttype == TYPE_void && b->tseqbase != oid_nil)
+ BATseqbase(BATmirror(c), b->tseqbase);
+ }
return c;
}
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2457,8 +2457,10 @@ BATintersectcand(BAT *a, BAT *b)
if (BATcount(a) == 0 || BATcount(b) == 0) {
bn = BATnew(TYPE_void, TYPE_void, 0);
- BATseqbase(bn, 0);
- BATseqbase(BATmirror(bn), 0);
+ if (bn) {
+ BATseqbase(bn, 0);
+ BATseqbase(BATmirror(bn), 0);
+ }
return bn;
}
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2506,9 +2506,14 @@ subleftjoin(BAT **r1p, BAT **r2p, BAT *l
rcount = MIN(rcount, BATcount(sr));
if (lcount == 0 || rcount == 0) {
r1 = BATnew(TYPE_void, TYPE_void, 0);
+ r2 = BATnew(TYPE_void, TYPE_void, 0);
+ if (r1 == NULL || r2 == NULL) {
+ BBPreclaim(r1);
+ BBPreclaim(r2);
+ return GDK_FAIL;
+ }
BATseqbase(r1, 0);
BATseqbase(BATmirror(r1), 0);
- r2 = BATnew(TYPE_void, TYPE_void, 0);
BATseqbase(r2, 0);
BATseqbase(BATmirror(r2), 0);
*r1p = r1;
@@ -2641,9 +2646,14 @@ BATsubjoin(BAT **r1p, BAT **r2p, BAT *l,
rcount = MIN(rcount, BATcount(sr));
if (lcount == 0 || rcount == 0) {
r1 = BATnew(TYPE_void, TYPE_void, 0);
+ r2 = BATnew(TYPE_void, TYPE_void, 0);
+ if (r1 == NULL || r2 == NULL) {
+ BBPreclaim(r1);
+ BBPreclaim(r2);
+ return GDK_FAIL;
+ }
BATseqbase(r1, 0);
BATseqbase(BATmirror(r1), 0);
- r2 = BATnew(TYPE_void, TYPE_void, 0);
BATseqbase(r2, 0);
BATseqbase(BATmirror(r2), 0);
*r1p = r1;
diff --git a/gdk/gdk_join_legacy.c b/gdk/gdk_join_legacy.c
--- a/gdk/gdk_join_legacy.c
+++ b/gdk/gdk_join_legacy.c
@@ -35,10 +35,12 @@ BATsemijoin(BAT *l, BAT *r)
return BATcopy(l, l->htype, l->ttype, 0);
if (BATcount(r) == 0) {
bn = BATnew(l->htype, l->ttype, 0);
- if (BAThdense(l))
- BATseqbase(bn, l->hseqbase);
- if (BATtdense(l))
- BATseqbase(BATmirror(bn), l->tseqbase);
+ if (bn) {
+ if (BAThdense(l))
+ BATseqbase(bn, l->hseqbase);
+ if (BATtdense(l))
+ BATseqbase(BATmirror(bn), l->tseqbase);
+ }
return bn;
}
diff --git a/gdk/gdk_sample.c b/gdk/gdk_sample.c
--- a/gdk/gdk_sample.c
+++ b/gdk/gdk_sample.c
@@ -131,12 +131,20 @@ BATsample_(BAT *b, BUN n)
/* empty sample size */
if (n == 0) {
bn = BATnew(TYPE_void, TYPE_void, 0);
+ if (bn == NULL) {
+ GDKerror("BATsample: memory allocation error");
+ return NULL;
+ }
BATsetcount(bn, 0);
BATseqbase(bn, 0);
BATseqbase(BATmirror(bn), 0);
/* sample size is larger than the input BAT, return all oids */
} else if (cnt <= n) {
bn = BATnew(TYPE_void, TYPE_void, cnt);
+ if (bn == NULL) {
+ GDKerror("BATsample: memory allocation error");
+ return NULL;
+ }
BATsetcount(bn, cnt);
BATseqbase(bn, 0);
BATseqbase(BATmirror(bn), b->H->seq);
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -46,9 +46,13 @@ float nextafterf(float x, float y);
} while (0)
static BAT *
-newempty(void)
+newempty(const char *func)
{
BAT *bn = BATnew(TYPE_void, TYPE_void, 0);
+ if (bn == NULL) {
+ GDKerror("%s: memory allocation error", func);
+ return NULL;
+ }
BATseqbase(bn, 0);
BATseqbase(BATmirror(bn), 0);
return bn;
@@ -868,7 +872,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
if (!li) { \
/* open range on left */ \
if (*(TYPE*)tl == MAXVALUE##TYPE) \
- return newempty(); \
+ return
newempty("BATsubselect"); \
/* vl < x === vl+1 <= x */ \
vl.v_##TYPE =
NEXTVALUE##TYPE(*(TYPE*)tl); \
li = 1; \
@@ -886,7 +890,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
if (!hi) { \
/* open range on right */ \
if (*(TYPE*)th == MINVALUE##TYPE) \
- return newempty(); \
+ return
newempty("BATsubselect"); \
/* x < vh === x <= vh-1 */ \
vh.v_##TYPE =
PREVVALUE##TYPE(*(TYPE*)th); \
hi = 1; \
@@ -971,7 +975,7 @@ BATsubselect(BAT *b, BAT *s, const void
",s=%s,anti=%d): trivially empty\n",
BATgetId(b), BATcount(b),
s ? BATgetId(s) : "NULL", anti);
- return newempty();
+ return newempty("BATsubselect");
}
t = b->ttype;
@@ -1020,7 +1024,7 @@ BATsubselect(BAT *b, BAT *s, const void
"nil-nil range, nonil\n",
BATgetId(b), BATcount(b),
s ? BATgetId(s) : "NULL", anti);
- return newempty();
+ return newempty("BATsubselect");
} else if (equi && lnil) {
/* antiselect for nil value: turn into range
* select for nil-nil range (i.e. everything
@@ -1060,7 +1064,7 @@ BATsubselect(BAT *b, BAT *s, const void
",s=%s,anti=%d): empty range\n",
BATgetId(b), BATcount(b),
s ? BATgetId(s) : "NULL", anti);
- return newempty();
+ return newempty("BATsubselect");
}
if (equi && lnil && b->T->nonil) {
/* return all nils, but there aren't any */
@@ -1068,7 +1072,7 @@ BATsubselect(BAT *b, BAT *s, const void
",s=%s,anti=%d): equi-nil, nonil\n",
BATgetId(b), BATcount(b),
s ? BATgetId(s) : "NULL", anti);
- return newempty();
+ return newempty("BATsubselect");
}
if (!equi && !lval && !hval && lnil && b->T->nonil) {
@@ -1379,7 +1383,7 @@ BATthetasubselect(BAT *b, BAT *s, const
nil = ATOMnilptr(b->ttype);
if (ATOMcmp(b->ttype, val, nil) == 0)
- return newempty();
+ return newempty("BATthetasubselect");
if (op[0] == '=' && ((op[1] == '=' && op[2] == 0) || op[2] == 0)) {
/* "=" or "==" */
return BATsubselect(b, s, val, NULL, 1, 1, 0);
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1111,10 +1111,10 @@ GDKinit(opt *set, int setlen)
GDKkey = BATnew(TYPE_void, TYPE_str, 100);
GDKval = BATnew(TYPE_void, TYPE_str, 100);
- if (GDKkey == NULL)
+ if (GDKkey == NULL || GDKval == NULL) {
+ /* no cleanup necessary before GDKfatal */
GDKfatal("GDKinit: Could not create environment BAT");
- if (GDKval == NULL)
- GDKfatal("GDKinit: Could not create environment BAT");
+ }
BATseqbase(GDKkey,0);
BATkey(GDKkey, BOUND2BTRUE);
BATrename(GDKkey, "environment_key");
diff --git a/monetdb5/extras/sphinx/sphinx.c b/monetdb5/extras/sphinx/sphinx.c
--- a/monetdb5/extras/sphinx/sphinx.c
+++ b/monetdb5/extras/sphinx/sphinx.c
@@ -37,7 +37,7 @@
* SIGNATURE: SPHINXsearchIndexLimit(str, str, int) : bat[oid,lng]; */
static str
sphinx_searchIndexLimit(BAT **ret, /* put pointer to BAT[oid,int] record here.
*/
- str query, str index, int limit)
+ str query, str index, int limit)
{
int i;
BAT *bn;
@@ -54,8 +54,12 @@ sphinx_searchIndexLimit(BAT **ret, /* pu
res = sphinx_query ( client, query, index, NULL );
if (!res || (res && res->num_matches == 0)) {
bn = BATnew(TYPE_void, TYPE_lng, 0);
+ if (bn == NULL)
+ throw(MAL, "sphinx.searchIndex", MAL_MALLOC_FAIL);
} else {
bn = BATnew(TYPE_void, TYPE_lng, res->num_matches);
+ if (bn == NULL)
+ throw(MAL, "sphinx.searchIndex", MAL_MALLOC_FAIL);
for ( i = 0; i < res->num_matches; i++ ) {
lng sphinx_id = sphinx_get_id ( res, i );
o++;
@@ -66,9 +70,9 @@ sphinx_searchIndexLimit(BAT **ret, /* pu
sphinx_destroy (client);
bn->hseqbase = 0;
- bn->T->sorted = 0;
- bn->T->revsorted = 0;
- bn->T->nonil = 1;
+ bn->T->sorted = 0;
+ bn->T->revsorted = 0;
+ bn->T->nonil = 1;
BATkey(BATmirror(bn), FALSE);
*ret = bn;
@@ -82,8 +86,7 @@ SPHINXsearchIndexLimit(int *ret, str *qu
str msg = sphinx_searchIndexLimit(&b, *query, *index, *limit);
if (msg) {
- GDKfree(msg);
- throw(MAL, "sphinx.searchIndex", "Cannot create Sphinx object");
+ return msg;
}
assert(b != NULL);
*ret = b->batCacheid;
diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -1289,8 +1289,11 @@ MTIMEprelude(void)
BAT *tzbatnme = BATnew(TYPE_void, TYPE_str, 30);
BAT *tzbatdef = BATnew(TYPE_void, ATOMindex("timezone"), 30);
- if (tzbatnme == NULL || tzbatdef == NULL)
+ if (tzbatnme == NULL || tzbatdef == NULL) {
+ BBPreclaim(tzbatnme);
+ BBPreclaim(tzbatdef);
throw(MAL, "time.prelude", "failed to create box");
+ }
BBPrename(tzbatnme->batCacheid, "timezone_name");
BBPrename(tzbatdef->batCacheid, "timezone_def");
BATseqbase(tzbatnme,0);
diff --git a/monetdb5/modules/kernel/algebra.c
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -121,6 +121,8 @@ CMDgen_group(BAT **result, BAT *gids, BA
wrd j, gcnt = BATcount(gids);
BAT *r = BATnew(TYPE_void, TYPE_oid, BATcount(gids)*2);
+ if (r == NULL)
+ return GDK_FAIL;
BATseqbase(r, 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list