Changeset: dc90f734a15e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dc90f734a15e
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk.h
        gdk/gdk_analytic.h
        gdk/gdk_analytic_bounds.c
        gdk/gdk_analytic_func.c
        gdk/gdk_analytic_statistics.c
        sql/backends/monet5/sql_rank.c
Branch: default
Log Message:

Move COLnew calls into GDK layer for GDKanalytical* functions.


diffs (truncated from 2326 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
@@ -180,7 +180,7 @@ gdk_return BATprod(void *res, int tp, BA
 BAT *BATproject(BAT *restrict l, BAT *restrict r);
 BAT *BATproject2(BAT *restrict l, BAT *restrict r1, BAT *restrict r2);
 BAT *BATprojectchain(BAT **bats);
-gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT *rh, BAT 
*sl, BAT *sr, bool li, bool hi, bool anti, bool symmetric, BUN estimate) 
__attribute__((__warn_unused_result__));
+gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT *rh, BAT 
*sl, BAT *sr, bool li, bool hi, bool anti, bool symmetric, BUN estimate) 
__attribute__((__access__(write_only, 1))) 
__attribute__((__access__(write_only, 2))) 
__attribute__((__warn_unused_result__));
 gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bool force) 
__attribute__((__warn_unused_result__));
 void BATrmprop(BAT *b, enum prop_t idx);
 void BATrmprop_nolock(BAT *b, enum prop_t idx);
@@ -246,29 +246,29 @@ BAT *COLnew(oid hseq, int tltype, BUN ca
 BAT *COLnew2(oid hseq, int tt, BUN cap, role_t role, uint16_t width) 
__attribute__((__warn_unused_result__));
 size_t GDK_mem_maxsize;
 size_t GDK_vm_maxsize;
-gdk_return GDKanalytical_correlation(BAT *r, BAT *p, BAT *o, BAT *b1, BAT *b2, 
BAT *s, BAT *e, int tpe, int frame_type);
-gdk_return GDKanalytical_covariance_pop(BAT *r, BAT *p, BAT *o, BAT *b1, BAT 
*b2, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_return GDKanalytical_covariance_samp(BAT *r, BAT *p, BAT *o, BAT *b1, BAT 
*b2, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_return GDKanalytical_stddev_pop(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
-gdk_return GDKanalytical_stddev_samp(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
+BAT *GDKanalytical_correlation(BAT *p, BAT *o, BAT *b1, BAT *b2, BAT *s, BAT 
*e, int tpe, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalytical_covariance_pop(BAT *p, BAT *o, BAT *b1, BAT *b2, BAT *s, 
BAT *e, int tpe, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalytical_covariance_samp(BAT *p, BAT *o, BAT *b1, BAT *b2, BAT *s, 
BAT *e, int tpe, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalytical_stddev_pop(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, 
int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalytical_stddev_samp(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tpe, int frame_type) __attribute__((__warn_unused_result__));
 gdk_return GDKanalytical_str_group_concat(BAT *r, BAT *p, BAT *o, BAT *b, BAT 
*sep, BAT *s, BAT *e, const char *restrict separator, int frame_type);
-gdk_return GDKanalytical_variance_pop(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
-gdk_return GDKanalytical_variance_samp(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
-gdk_return GDKanalyticalavg(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
-gdk_return GDKanalyticalavginteger(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT 
*e, int tpe, int frame_type);
-gdk_return GDKanalyticalcount(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, 
bit ignore_nils, int tpe, int frame_type);
-gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, const bit *restrict 
npbit, int tpe);
-gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
-gdk_return GDKanalyticallag(BAT *r, BAT *b, BAT *p, BUN lag, const void 
*restrict default_value, int tpe);
-gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
-gdk_return GDKanalyticallead(BAT *r, BAT *b, BAT *p, BUN lead, const void 
*restrict default_value, int tpe);
-gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
-gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, 
int tpe, int frame_type);
-gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *s, BAT *e, BAT *l, lng 
*nth, int tp1);
-gdk_return GDKanalyticalntile(BAT *r, BAT *b, BAT *p, BAT *n, int tpe, const 
void *restrict ntile);
-gdk_return GDKanalyticalprod(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, 
int tp1, int tp2, int frame_type);
-gdk_return GDKanalyticalsum(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, 
int tp1, int tp2, int frame_type);
-gdk_return GDKanalyticalwindowbounds(BAT *r, BAT *b, BAT *p, BAT *l, const 
void *restrict bound, int tp1, int tp2, int unit, bool preceding, oid 
first_half);
+BAT *GDKanalytical_variance_pop(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tpe, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalytical_variance_samp(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tpe, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalavg(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int 
frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalavginteger(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, 
int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalcount(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, bit 
ignore_nils, int tpe, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticaldiff(BAT *b, BAT *p, const bit *restrict npbit, int tpe) 
__attribute__((__warn_unused_result__));
+BAT *GDKanalyticalfirst(BAT *b, BAT *s, BAT *e, int tpe) 
__attribute__((__warn_unused_result__));
+BAT *GDKanalyticallag(BAT *b, BAT *p, BUN lag, const void *restrict 
default_value, int tpe) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticallast(BAT *b, BAT *s, BAT *e, int tpe) 
__attribute__((__warn_unused_result__));
+BAT *GDKanalyticallead(BAT *b, BAT *p, BUN lead, const void *restrict 
default_value, int tpe) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalmax(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int 
frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalmin(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int 
frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalnthvalue(BAT *b, BAT *s, BAT *e, BAT *l, lng *nth, int tp1) 
__attribute__((__warn_unused_result__));
+BAT *GDKanalyticalntile(BAT *b, BAT *p, BAT *n, int tpe, const void *restrict 
ntile) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalprod(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tp1, int 
tp2, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalsum(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tp1, int 
tp2, int frame_type) __attribute__((__warn_unused_result__));
+BAT *GDKanalyticalwindowbounds(BAT *b, BAT *p, BAT *l, const void *restrict 
bound, int tp1, int tp2, int unit, bool preceding, oid first_half) 
__attribute__((__warn_unused_result__));
 gdk_return GDKasciify(char **restrict buf, size_t *restrict buflen, const char 
*restrict s);
 int GDKatomcnt;
 gdk_return GDKcasefold(char **restrict buf, size_t *restrict buflen, const 
char *restrict s) __attribute__((__access__(read_write, 1))) 
__attribute__((__access__(read_write, 2)));
@@ -292,7 +292,7 @@ bool GDKgetenv_istext(const char *name, 
 bool GDKgetenv_istrue(const char *name);
 bool GDKgetenv_isyes(const char *name);
 gdk_return GDKinit(struct opt *set, int setlen, bool embedded, const char 
*caller_revision);
-BAT *GDKinitialize_segment_tree(void);
+BAT *GDKinitialize_segment_tree(void) __attribute__((__warn_unused_result__));
 bool GDKinmemory(int farmid);
 const char *GDKlibversion(void) __attribute__((__const__));
 ATOMIC_TYPE GDKlockcnt;
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2329,6 +2329,8 @@ gdk_export gdk_return BATbandjoin(BAT **
        __attribute__((__access__(write_only, 2)))
        __attribute__((__warn_unused_result__));
 gdk_export gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT 
*rh, BAT *sl, BAT *sr, bool li, bool hi, bool anti, bool symmetric, BUN 
estimate)
+       __attribute__((__access__(write_only, 1)))
+       __attribute__((__access__(write_only, 2)))
        __attribute__((__warn_unused_result__));
 gdk_export BAT *BATproject(BAT *restrict l, BAT *restrict r);
 gdk_export BAT *BATproject2(BAT *restrict l, BAT *restrict r1, BAT *restrict 
r2);
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -18,36 +18,58 @@
 #ifndef _GDK_ANALYTIC_H_
 #define _GDK_ANALYTIC_H_
 
-gdk_export gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, const bit 
*restrict npbit, int tpe);
+gdk_export BAT *GDKanalyticaldiff(BAT *b, BAT *p, const bit *restrict npbit, 
int tpe)
+       __attribute__((__warn_unused_result__));
 
-gdk_export gdk_return GDKanalyticalntile(BAT *r, BAT *b, BAT *p, BAT *n, int 
tpe, const void *restrict ntile);
-gdk_export gdk_return GDKanalyticallag(BAT *r, BAT *b, BAT *p, BUN lag, const 
void *restrict default_value, int tpe);
-gdk_export gdk_return GDKanalyticallead(BAT *r, BAT *b, BAT *p, BUN lead, 
const void *restrict default_value, int tpe);
+gdk_export BAT *GDKanalyticalntile(BAT *b, BAT *p, BAT *n, int tpe, const void 
*restrict ntile)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticallag(BAT *b, BAT *p, BUN lag, const void *restrict 
default_value, int tpe)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticallead(BAT *b, BAT *p, BUN lead, const void 
*restrict default_value, int tpe)
+       __attribute__((__warn_unused_result__));
 
-gdk_export gdk_return GDKanalyticalwindowbounds(BAT *r, BAT *b, BAT *p, BAT *l,
-                                               const void *restrict bound,
-                                               int tp1, int tp2, int unit,
-                                               bool preceding, oid first_half);
+gdk_export BAT *GDKanalyticalwindowbounds(BAT *b, BAT *p, BAT *l,
+                                         const void *restrict bound,
+                                         int tp1, int tp2, int unit,
+                                         bool preceding, oid first_half)
+       __attribute__((__warn_unused_result__));
 
-gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
-gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
-gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *s, BAT *e, 
BAT *l, lng *nth, int tp1);
+gdk_export BAT *GDKanalyticalfirst(BAT *b, BAT *s, BAT *e, int tpe)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticallast(BAT *b, BAT *s, BAT *e, int tpe)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalnthvalue(BAT *b, BAT *s, BAT *e, BAT *l, lng 
*nth, int tp1)
+       __attribute__((__warn_unused_result__));
 
-gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalcount(BAT *r, BAT *p, BAT *o, BAT *b, BAT 
*s, BAT *e, bit ignore_nils, int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalsum(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tp1, int tp2, int frame_type);
-gdk_export gdk_return GDKanalyticalprod(BAT *r, BAT *p, BAT *o, BAT *b, BAT 
*s, BAT *e, int tp1, int tp2, int frame_type);
-gdk_export gdk_return GDKanalyticalavg(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalavginteger(BAT *r, BAT *p, BAT *o, BAT *b, 
BAT *s, BAT *e, int tpe, int frame_type);
+gdk_export BAT *GDKanalyticalmin(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalmax(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalcount(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, bit 
ignore_nils, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalsum(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalprod(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalavg(BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int 
tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalyticalavginteger(BAT *p, BAT *o, BAT *b, BAT *s, BAT 
*e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
 
-gdk_export gdk_return GDKanalytical_stddev_samp(BAT *r, BAT *p, BAT *o, BAT 
*b, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalytical_stddev_pop(BAT *r, BAT *p, BAT *o, BAT *b, 
BAT *s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalytical_variance_samp(BAT *r, BAT *p, BAT *o, BAT 
*b, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalytical_variance_pop(BAT *r, BAT *p, BAT *o, BAT 
*b, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalytical_covariance_pop(BAT *r, BAT *p, BAT *o, BAT 
*b1, BAT *b2, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalytical_covariance_samp(BAT *r, BAT *p, BAT *o, 
BAT *b1, BAT *b2, BAT *s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalytical_correlation(BAT *r, BAT *p, BAT *o, BAT 
*b1, BAT *b2, BAT *s, BAT *e, int tpe, int frame_type);
+gdk_export BAT *GDKanalytical_stddev_samp(BAT *p, BAT *o, BAT *b, BAT *s, BAT 
*e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalytical_stddev_pop(BAT *p, BAT *o, BAT *b, BAT *s, BAT 
*e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalytical_variance_samp(BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalytical_variance_pop(BAT *p, BAT *o, BAT *b, BAT *s, BAT 
*e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalytical_covariance_pop(BAT *p, BAT *o, BAT *b1, BAT *b2, 
BAT *s, BAT *e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalytical_covariance_samp(BAT *p, BAT *o, BAT *b1, BAT 
*b2, BAT *s, BAT *e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
+gdk_export BAT *GDKanalytical_correlation(BAT *p, BAT *o, BAT *b1, BAT *b2, 
BAT *s, BAT *e, int tpe, int frame_type)
+       __attribute__((__warn_unused_result__));
 
 #define SEGMENT_TREE_FANOUT 16 /* Segment tree fanout size. Later we could do 
experiments from it */
 #define NOTHING /* used for not used optional arguments for aggregate 
computation */
@@ -56,7 +78,8 @@ gdk_export gdk_return GDKanalytical_corr
    and 'nlevels' is the number of levels on the current segment tree.
    In order to run in out-of-memory situations they are allocated inside a 
BAT. The 'levels_offset' are allocated after
    the segment tree. The beginning pointers for both are returned. */
-gdk_export BAT *GDKinitialize_segment_tree(void);
+gdk_export BAT *GDKinitialize_segment_tree(void)
+       __attribute__((__warn_unused_result__));
 gdk_export gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, BAT 
*st, void **segment_tree, oid **levels_offset, oid *nlevels);
 
 /* segment_tree, levels_offset and nlevels must be already defined. ARG1, ARG2 
and ARG3 are to be used by the aggregate */
diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c
--- a/gdk/gdk_analytic_bounds.c
+++ b/gdk/gdk_analytic_bounds.c
@@ -91,12 +91,15 @@
                }                                                       \
        } while (0)
 
-gdk_return
-GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, const bit *restrict npbit, int tpe)
+BAT *
+GDKanalyticaldiff(BAT *b, BAT *p, const bit *restrict npbit, int tpe)
 {
        BUN i = 0, cnt = BATcount(b);
        BATiter pi = bat_iterator(p);
        BATiter bi = bat_iterator(b);
+       BAT *r = COLnew(b->hseqbase, TYPE_bit, BATcount(b), TRANSIENT);
+       if (r == NULL)
+               return NULL;
        bit *restrict rb = (bit *) Tloc(r, 0), npb = npbit ? *npbit : 0;
        const bit *restrict np = (bit *) pi.base;
 
@@ -171,7 +174,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
        BATsetcount(r, cnt);
        r->tnonil = true;
        r->tnil = false;
-       return GDK_SUCCEED;
+       return r;
 }
 
 #define ANALYTICAL_WINDOW_BOUNDS_ROWS_PRECEDING(TPE, LIMIT, UPCAST)    \
@@ -610,9 +613,12 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                                       \
        } while(0)
 
-static gdk_return
-GDKanalyticalallbounds(BAT *r, BAT *b, BAT *p, bool preceding)
+static BAT *
+GDKanalyticalallbounds(BAT *b, BAT *p, bool preceding)
 {
+       BAT *r = COLnew(b->hseqbase, TYPE_oid, BATcount(b), TRANSIENT);
+       if (r == NULL)
+               return NULL;
        oid *restrict rb = (oid *) Tloc(r, 0), i = 0, k = 0, j = 0, cnt = 
BATcount(b);
        BATiter pi = bat_iterator(p);
        const bit *restrict np = pi.base;
@@ -649,7 +655,7 @@ GDKanalyticalallbounds(BAT *r, BAT *b, B
        BATsetcount(r, cnt);
        r->tnonil = false;
        r->tnil = false;
-       return GDK_SUCCEED;
+       return r;
 }
 
 #define ANALYTICAL_WINDOW_BOUNDS_PEERS_FIXED_PRECEDING(TPE, NAN_CHECK) \
@@ -706,9 +712,12 @@ GDKanalyticalallbounds(BAT *r, BAT *b, B
 
 #define NO_NAN_CHECK /* nulls match on this operator */
 
-static gdk_return
-GDKanalyticalpeers(BAT *r, BAT *b, BAT *p, bool preceding) /* used in range 
when the limit is 0, ie match peer rows */
+static BAT *
+GDKanalyticalpeers(BAT *b, BAT *p, bool preceding) /* used in range when the 
limit is 0, ie match peer rows */
 {
+       BAT *r = COLnew(b->hseqbase, TYPE_oid, BATcount(b), TRANSIENT);
+       if (r == NULL)
+               return NULL;
        oid *restrict rb = (oid *) Tloc(r, 0), i = 0, k = 0, j = 0, l = 0, cnt 
= BATcount(b);
        BATiter pi = bat_iterator(p);
        BATiter bi = bat_iterator(b);
@@ -848,23 +857,27 @@ GDKanalyticalpeers(BAT *r, BAT *b, BAT *
        BATsetcount(r, cnt);
        r->tnonil = false;
        r->tnil = false;
-       return GDK_SUCCEED;
+       return r;
 }
 
-static gdk_return
-GDKanalyticalrowbounds(BAT *r, BAT *b, BAT *p, BAT *l, const void *restrict 
bound, int tp2, bool preceding, oid second_half)
+static BAT *
+GDKanalyticalrowbounds(BAT *b, BAT *p, BAT *l, const void *restrict bound, int 
tp2, bool preceding, oid second_half)
 {
        oid cnt = BATcount(b), nils = 0, i = 0, k = 0, j = 0;
        BATiter pi = bat_iterator(p);
        BATiter bi = bat_iterator(b);
        BATiter li = bat_iterator(l);
        const bit *restrict np = pi.base;
-       oid *restrict rb = (oid *) Tloc(r, 0);
        bool last = false;
+       BAT *r = NULL;
 
        if (l) {                /* dynamic bounds */
                if (li.nil)
                        goto invalid_bound;
+               r = COLnew(b->hseqbase, TYPE_oid, BATcount(b), TRANSIENT);
+               if (r == NULL)
+                       return NULL;
+               oid *restrict rb = (oid *) Tloc(r, 0);
                switch (tp2) {
                case TYPE_bte:{
                        const bte *restrict limit = (bte *) li.base;
@@ -959,10 +972,16 @@ GDKanalyticalrowbounds(BAT *r, BAT *b, B
                        bat_iterator_end(&pi);
                        bat_iterator_end(&bi);
                        bat_iterator_end(&li);
-                       return GDKanalyticalallbounds(r, b, p, preceding);
-               } else if (is_lng_nil(limit) || limit < 0) { /* this check is 
needed if the input is empty */
+                       return GDKanalyticalallbounds(b, p, preceding);
+               }
+               if (is_lng_nil(limit) || limit < 0) { /* this check is needed 
if the input is empty */
                        goto invalid_bound;
-               } else if (preceding) {
+               }
+               r = COLnew(b->hseqbase, TYPE_oid, BATcount(b), TRANSIENT);
+               if (r == NULL)
+                       return NULL;
+               oid *restrict rb = (oid *) Tloc(r, 0);
+               if (preceding) {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to