Changeset: 9022024ba881 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9022024ba881
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_aggr.c
        monetdb5/mal/mal_authorize.c
        monetdb5/modules/kernel/bat5.c
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_table.c
Branch: default
Log Message:

More error checking and warning about unused results.


diffs (truncated from 540 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -19,11 +19,11 @@ int ATOMlen(int id, const void *v);
 str ATOMname(int id);
 ptr ATOMnil(int id);
 int ATOMprint(int id, const void *val, stream *fd);
-gdk_return BATappend(BAT *b, BAT *n, BAT *s, bit force);
+gdk_return BATappend(BAT *b, BAT *n, BAT *s, bit force) 
__attribute__((__warn_unused_result__));
 void BATassertProps(BAT *b);
 atomDesc BATatoms[];
 BAT *BATattach(int tt, const char *heapfile, int role);
-gdk_return BATbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
const void *c1, const void *c2, int li, int hi, BUN estimate);
+gdk_return BATbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
const void *c1, const void *c2, int li, int hi, BUN estimate) 
__attribute__((__warn_unused_result__));
 BAT *BATcalcabsolute(BAT *b, BAT *s);
 BAT *BATcalcadd(BAT *b1, BAT *b2, BAT *s, int tp, int abort_on_error);
 BAT *BATcalcaddcst(BAT *b, const ValRecord *v, BAT *s, int tp, int 
abort_on_error);
@@ -114,15 +114,15 @@ void BATcommit(BAT *b);
 BAT *BATconstant(oid hseq, int tt, const void *val, BUN cnt, int role);
 BAT *BATconvert(BAT *b, BAT *s, int tp, int abort_on_error);
 BUN BATcount_no_nil(BAT *b);
-gdk_return BATdel(BAT *b, BAT *d);
+gdk_return BATdel(BAT *b, BAT *d) __attribute__((__warn_unused_result__));
 BAT *BATdense(oid hseq, oid tseq, BUN cnt) __attribute__((warn_unused_result));
 BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, int nil_matches, BUN estimate);
-gdk_return BATextend(BAT *b, BUN newcap);
+gdk_return BATextend(BAT *b, BUN newcap) 
__attribute__((__warn_unused_result__));
 void BATfakeCommit(BAT *b);
-gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, BAT *grps, 
BUN n, int asc, int distinct);
+gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, BAT *grps, 
BUN n, int asc, int distinct) __attribute__((__warn_unused_result__));
 int BATgetaccess(BAT *b);
 PROPrec *BATgetprop(BAT *b, int idx);
-gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT *b, BAT *s, 
BAT *g, BAT *e, BAT *h);
+gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT *b, BAT *s, 
BAT *g, BAT *e, BAT *h) __attribute__((__warn_unused_result__));
 const char *BATgroupaggrinit(BAT *b, BAT *g, BAT *e, BAT *s, oid *minp, oid 
*maxp, BUN *ngrpp, BUN *startp, BUN *endp, const oid **candp, const oid 
**candendp);
 gdk_return BATgroupavg(BAT **bnp, BAT **cntsp, BAT *b, BAT *g, BAT *e, BAT *s, 
int tp, int skip_nils, int abort_on_error);
 BAT *BATgroupcount(BAT *b, BAT *g, BAT *e, BAT *s, int tp, int skip_nils, int 
abort_on_error);
@@ -142,10 +142,10 @@ gdk_return BAThash(BAT *b, BUN masksize)
 void BAThseqbase(BAT *b, oid o);
 gdk_return BATimprints(BAT *b);
 BAT *BATintersectcand(BAT *a, BAT *b);
-gdk_return BATjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int 
nil_matches, BUN estimate);
+gdk_return BATjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int 
nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
 gdk_return BATkey(BAT *b, int onoff);
 int BATkeyed(BAT *b);
-gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
int nil_matches, BUN estimate);
+gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
int nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
 void *BATmax(BAT *b, void *aggr);
 size_t BATmemsize(BAT *b, int dirty);
 BAT *BATmergecand(BAT *a, BAT *b);
@@ -155,27 +155,27 @@ void BATmsync(BAT *b);
 int BATordered(BAT *b);
 int BATordered_rev(BAT *b);
 gdk_return BATorderidx(BAT *b, int stable);
-gdk_return BATouterjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT 
*sr, int nil_matches, BUN estimate);
+gdk_return BATouterjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT 
*sr, int nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
 gdk_return BATprint(BAT *b);
 gdk_return BATprintcolumns(stream *s, int argc, BAT *argv[]);
 gdk_return BATprod(void *res, int tp, BAT *b, BAT *s, int skip_nils, int 
abort_on_error, int nil_if_empty);
 BAT *BATproject(BAT *l, BAT *r);
 BAT *BATprojectchain(BAT **bats);
-gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT *rh, BAT 
*sl, BAT *sr, int li, int hi, BUN estimate);
-gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bit force);
+gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT *rh, BAT 
*sl, BAT *sr, int li, int hi, BUN estimate) 
__attribute__((__warn_unused_result__));
+gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bit force) 
__attribute__((__warn_unused_result__));
 void BATroles(BAT *b, const char *tnme);
 BAT *BATsample(BAT *b, BUN n);
 BAT *BATselect(BAT *b, BAT *s, const void *tl, const void *th, int li, int hi, 
int anti);
-gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
int nil_matches, BUN estimate);
+gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, 
int nil_matches, BUN estimate) __attribute__((__warn_unused_result__));
 gdk_return BATsetaccess(BAT *b, int mode);
 void BATsetcapacity(BAT *b, BUN cnt);
 void BATsetcount(BAT *b, BUN cnt);
 void BATsetprop(BAT *b, int idx, int type, void *v);
 BAT *BATslice(BAT *b, BUN low, BUN high);
-gdk_return BATsort(BAT **sorted, BAT **order, BAT **groups, BAT *b, BAT *o, 
BAT *g, int reverse, int stable);
-gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr);
+gdk_return BATsort(BAT **sorted, BAT **order, BAT **groups, BAT *b, BAT *o, 
BAT *g, int reverse, int stable) __attribute__((__warn_unused_result__));
+gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr) 
__attribute__((__warn_unused_result__));
 gdk_return BATsum(void *res, int tp, BAT *b, BAT *s, int skip_nils, int 
abort_on_error, int nil_if_empty);
-gdk_return BATthetajoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT 
*sr, int op, int nil_matches, BUN estimate);
+gdk_return BATthetajoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT 
*sr, int op, int nil_matches, BUN estimate) 
__attribute__((__warn_unused_result__));
 BAT *BATthetaselect(BAT *b, BAT *s, const void *val, const char *op);
 void BATtseqbase(BAT *b, oid o);
 void BATundo(BAT *b);
@@ -204,10 +204,10 @@ void BBPshare(bat b);
 gdk_return BBPsync(int cnt, bat *subcommit);
 int BBPunfix(bat b);
 void BBPunlock(void);
-gdk_return BUNappend(BAT *b, const void *right, bit force);
-gdk_return BUNdelete(BAT *b, oid o);
+gdk_return BUNappend(BAT *b, const void *right, bit force) 
__attribute__((__warn_unused_result__));
+gdk_return BUNdelete(BAT *b, oid o) __attribute__((__warn_unused_result__));
 BUN BUNfnd(BAT *b, const void *right);
-gdk_return BUNinplace(BAT *b, BUN p, const void *right, bit force);
+gdk_return BUNinplace(BAT *b, BUN p, const void *right, bit force) 
__attribute__((__warn_unused_result__));
 BAT *COLcopy(BAT *b, int tt, int writeable, int role);
 BAT *COLnew(oid hseq, int tltype, BUN capacity, int role) 
__attribute__((warn_unused_result));
 size_t GDK_mem_maxsize;
@@ -273,7 +273,7 @@ str GDKstrndup(const char *s, size_t n) 
 void GDKsyserror(_In_z_ _Printf_format_string_ const char *format, ...) 
__attribute__((__format__(__printf__, 1, 2)));
 ThreadRec GDKthreads[THREADS];
 size_t GDKuniqueid(size_t offset);
-gdk_return GDKupgradevarheap(BAT *b, var_t v, int copyall, int mayshare);
+gdk_return GDKupgradevarheap(BAT *b, var_t v, int copyall, int mayshare) 
__attribute__((__warn_unused_result__));
 lng GDKusec(void);
 BAT *GDKval;
 const char *GDKversion(void);
@@ -285,7 +285,7 @@ BUN HASHprobe(const Hash *h, const void 
 void HEAP_free(Heap *heap, var_t block);
 void HEAP_initialize(Heap *heap, size_t nbytes, size_t nprivate, int 
alignment);
 var_t HEAP_malloc(Heap *heap, size_t nbytes);
-gdk_return HEAPextend(Heap *h, size_t size, int mayshare);
+gdk_return HEAPextend(Heap *h, size_t size, int mayshare) 
__attribute__((__warn_unused_result__));
 size_t HEAPmemsize(Heap *h);
 size_t HEAPvmsize(Heap *h);
 void IMPSdestroy(BAT *b);
@@ -483,8 +483,8 @@ BUN strHash(const char *s);
 int strLen(const char *s);
 int strNil(const char *s);
 const char str_nil[2];
-gdk_return void_inplace(BAT *b, oid id, const void *val, bit force);
-BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force);
+gdk_return void_inplace(BAT *b, oid id, const void *val, bit force) 
__attribute__((__warn_unused_result__));
+BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force) 
__attribute__((__warn_unused_result__));
 int win_mkdir(const char *, const int mode);
 int win_rename(const char *, const char *);
 int win_rmdir(const char *);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -952,7 +952,8 @@ typedef struct BATiter {
  * These routines should be used to alloc free or extend heaps; they
  * isolate you from the different ways heaps can be accessed.
  */
-gdk_export gdk_return HEAPextend(Heap *h, size_t size, int mayshare);
+gdk_export gdk_return HEAPextend(Heap *h, size_t size, int mayshare)
+       __attribute__ ((__warn_unused_result__));
 gdk_export size_t HEAPvmsize(Heap *h);
 gdk_export size_t HEAPmemsize(Heap *h);
 
@@ -1021,7 +1022,8 @@ gdk_export BAT *COLnew(oid hseq, int tlt
        __attribute__((warn_unused_result));
 gdk_export BAT *BATdense(oid hseq, oid tseq, BUN cnt)
        __attribute__((warn_unused_result));
-gdk_export gdk_return BATextend(BAT *b, BUN newcap);
+gdk_export gdk_return BATextend(BAT *b, BUN newcap)
+       __attribute__ ((__warn_unused_result__));
 
 /* internal */
 gdk_export bte ATOMelmshift(int sz);
@@ -1260,7 +1262,8 @@ gdk_export bte ATOMelmshift(int sz);
                bunfastapp_nocheck(b, _p, t, Tsize(b));                 \
        } while (0)
 
-gdk_export gdk_return GDKupgradevarheap(BAT *b, var_t v, int copyall, int 
mayshare);
+gdk_export gdk_return GDKupgradevarheap(BAT *b, var_t v, int copyall, int 
mayshare)
+       __attribute__ ((__warn_unused_result__));
 gdk_export gdk_return BUNappend(BAT *b, const void *right, bit force)
        __attribute__ ((__warn_unused_result__));
 gdk_export gdk_return BATappend(BAT *b, BAT *n, BAT *s, bit force)
@@ -1271,8 +1274,10 @@ gdk_export gdk_return BUNdelete(BAT *b, 
 gdk_export gdk_return BATdel(BAT *b, BAT *d)
        __attribute__ ((__warn_unused_result__));
 
-gdk_export gdk_return BUNinplace(BAT *b, BUN p, const void *right, bit force);
-gdk_export gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bit force);
+gdk_export gdk_return BUNinplace(BAT *b, BUN p, const void *right, bit force)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bit force)
+       __attribute__ ((__warn_unused_result__));
 
 /* Functions to perform a binary search on a sorted BAT.
  * See gdk_search.c for details. */
@@ -1434,7 +1439,8 @@ gdk_export int BATgetaccess(BAT *b);
 gdk_export gdk_return BATclear(BAT *b, int force);
 gdk_export BAT *COLcopy(BAT *b, int tt, int writeable, int role);
 
-gdk_export gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT 
*b, BAT *s, BAT *g, BAT *e, BAT *h);
+gdk_export gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT 
*b, BAT *s, BAT *g, BAT *e, BAT *h)
+       __attribute__ ((__warn_unused_result__));
 
 /*
  * @- BAT Input/Output
@@ -1513,7 +1519,8 @@ gdk_export gdk_return BATprint(BAT *b);
 gdk_export int BATkeyed(BAT *b);
 gdk_export int BATordered(BAT *b);
 gdk_export int BATordered_rev(BAT *b);
-gdk_export gdk_return BATsort(BAT **sorted, BAT **order, BAT **groups, BAT *b, 
BAT *o, BAT *g, int reverse, int stable);
+gdk_export gdk_return BATsort(BAT **sorted, BAT **order, BAT **groups, BAT *b, 
BAT *o, BAT *g, int reverse, int stable)
+       __attribute__ ((__warn_unused_result__));
 
 
 gdk_export void GDKqsort(void *h, void *t, const void *base, size_t n, int hs, 
int ts, int tpe);
@@ -2326,8 +2333,10 @@ gdk_export void GDKclrerr(void);
 #include "gdk_utils.h"
 
 /* functions defined in gdk_bat.c */
-gdk_export BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force);
-gdk_export gdk_return void_inplace(BAT *b, oid id, const void *val, bit force);
+gdk_export BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return void_inplace(BAT *b, oid id, const void *val, bit force)
+       __attribute__ ((__warn_unused_result__));
 gdk_export BAT *BATattach(int tt, const char *heapfile, int role);
 
 #ifdef NATIVE_WIN32
@@ -2807,16 +2816,24 @@ gdk_export BAT *BATselect(BAT *b, BAT *s
 gdk_export BAT *BATthetaselect(BAT *b, BAT *s, const void *val, const char 
*op);
 
 gdk_export BAT *BATconstant(oid hseq, int tt, const void *val, BUN cnt, int 
role);
-gdk_export gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr);
+gdk_export gdk_return BATsubcross(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr)
+       __attribute__ ((__warn_unused_result__));
 
-gdk_export gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int nil_matches, BUN estimate);
-gdk_export gdk_return BATouterjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int nil_matches, BUN estimate);
-gdk_export gdk_return BATthetajoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int op, int nil_matches, BUN estimate);
-gdk_export gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int nil_matches, BUN estimate);
+gdk_export gdk_return BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int nil_matches, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return BATouterjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int nil_matches, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return BATthetajoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int op, int nil_matches, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, int nil_matches, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
 gdk_export BAT *BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr, int nil_matches, BUN 
estimate);
-gdk_export gdk_return BATjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, 
BAT *sr, int nil_matches, BUN estimate);
-gdk_export gdk_return BATbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, const void *c1, const void *c2, int li, int hi, BUN estimate);
-gdk_export gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT 
*rh, BAT *sl, BAT *sr, int li, int hi, BUN estimate);
+gdk_export gdk_return BATjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, 
BAT *sr, int nil_matches, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return BATbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, const void *c1, const void *c2, int li, int hi, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
+gdk_export gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT 
*rh, BAT *sl, BAT *sr, int li, int hi, BUN estimate)
+       __attribute__ ((__warn_unused_result__));
 gdk_export BAT *BATproject(BAT *l, BAT *r);
 gdk_export BAT *BATprojectchain(BAT **bats);
 
@@ -2827,7 +2844,8 @@ gdk_export BAT *BATunique(BAT *b, BAT *s
 gdk_export BAT *BATmergecand(BAT *a, BAT *b);
 gdk_export BAT *BATintersectcand(BAT *a, BAT *b);
 
-gdk_export gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, 
BAT *grps, BUN n, int asc, int distinct);
+gdk_export gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, 
BAT *grps, BUN n, int asc, int distinct)
+       __attribute__ ((__warn_unused_result__));
 
 #include "gdk_calc.h"
 
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2531,7 +2531,8 @@ BATgroupquantile(BAT *b, BAT *g, BAT *e,
                     BATcheckorderidx(pb))) {
                        ords = (const oid *) (pb ? pb->torderidx->base : 
b->torderidx->base) + ORDERIDXOFF;
                } else {
-                       BATsort(NULL, &t1, NULL, b, NULL, g, 0, 0);
+                       if (BATsort(NULL, &t1, NULL, b, NULL, g, 0, 0) != 
GDK_SUCCEED)
+                               goto bunins_failed;
                        if (BATtdense(t1))
                                ords = NULL;
                        else
diff --git a/monetdb5/mal/mal_authorize.c b/monetdb5/mal/mal_authorize.c
--- a/monetdb5/mal/mal_authorize.c
+++ b/monetdb5/mal/mal_authorize.c
@@ -424,7 +424,8 @@ AUTHchangeUsername(Client cntxt, const c
                throw(MAL, "changeUsername", "user '%s' already exists", 
newuser);
 
        /* ok, just do it! (with force, because sql makes view over it) */
-       BUNinplace(user, p, newuser, TRUE);
+       if (BUNinplace(user, p, newuser, TRUE) != GDK_SUCCEED)
+               throw(MAL, "changeUsername", GDK_EXCEPTION);
        AUTHcommit();
        return(MAL_SUCCEED);
 }
@@ -475,7 +476,10 @@ AUTHchangePassword(Client cntxt, const c
 
        /* ok, just overwrite the password field for this user */
        assert(id == p);
-       BUNinplace(pass, p, hash, TRUE);
+       if (BUNinplace(pass, p, hash, TRUE) != GDK_SUCCEED) {
+               GDKfree(hash);
+               throw(INVCRED, "changePassword", GDK_EXCEPTION);
+       }
        GDKfree(hash);
        AUTHcommit();
        return(MAL_SUCCEED);
@@ -526,7 +530,10 @@ AUTHsetPassword(Client cntxt, const char
        /* ok, just overwrite the password field for this user */
        assert (p != BUN_NONE);
        assert(id == p);
-       BUNinplace(pass, p, hash, TRUE);
+       if (BUNinplace(pass, p, hash, TRUE) != GDK_SUCCEED) {
+               GDKfree(hash);
+               throw(MAL, "setPassword", GDK_EXCEPTION);
+       }
        GDKfree(hash);
        AUTHcommit();
        return(MAL_SUCCEED);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to