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