Changeset: 31bf8768862e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=31bf8768862e Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_aggr.c gdk/gdk_align.c gdk/gdk_analytic_func.c gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_calc.c gdk/gdk_calc.h gdk/gdk_calc_compare.h gdk/gdk_calc_private.h gdk/gdk_cand.c gdk/gdk_cand.h gdk/gdk_cross.c gdk/gdk_firstn.c gdk/gdk_group.c gdk/gdk_hash.c gdk/gdk_join.c gdk/gdk_private.h gdk/gdk_project.c gdk/gdk_search.c gdk/gdk_select.c gdk/gdk_string.c gdk/gdk_unique.c monetdb5/mal/mal_interpreter.c monetdb5/modules/atoms/batxml.c monetdb5/modules/atoms/json.c monetdb5/modules/kernel/batmmath.c monetdb5/modules/mal/pcre.c sql/backends/monet5/generator/generator.c sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql.mal sql/scripts/25_debug.sql sql/storage/sql_storage.h sql/storage/store.c sql/test/SQLite_regress/sqllogictest/Tests/select3.test.stable.out sql/test/SQLite_regress/sqllogictest/Tests/select3.test.stable.out.int128 Branch: default Log Message:
Merge branch candidate-exceptions into default. diffs (truncated from 102011 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -11723,6 +11723,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:bat[:str], attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:any...):int ", "mvc_row_result_wrap;", "Prepare a table result set for the client front-end" ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:str, attr:str, tpe:str, len:int, scale:int, eclass:int, val:any):int ", "mvc_scalar_value_wrap;", "Prepare a table result set for the client front-end." ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:bat[:str], attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:bat[:any]...):int ", "mvc_table_result_wrap;", "Prepare a table result set for the client in default CSV format" ] +[ "sql", "resume_log_flushing", "command sql.resume_log_flushing():void ", "SQLresume_log_flushing;", "Resume WAL log flushing" ] [ "sql", "reuse", "pattern sql.reuse(sch:str, tbl:str):void ", "SQLreuse;", "Consolidate the deletion table over all columns reusing deleted slots" ] [ "sql", "round", "command sql.round(v:bte, d:int, s:int, r:bte):bte ", "bte_round_wrap;", "round off the decimal v(d,s) to r digits behind the dot (if r < 0, before the dot)" ] [ "sql", "round", "command sql.round(v:dbl, r:bte):dbl ", "dbl_round_wrap;", "round off the floating point v to r digits behind the dot (if r < 0, before the dot)" ] @@ -11758,6 +11759,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "sum", "pattern sql.sum(b:int, s:lng, e:lng):lng ", "SQLsum;", "return the sum of groups" ] [ "sql", "sum", "pattern sql.sum(b:lng, s:lng, e:lng):lng ", "SQLsum;", "return the sum of groups" ] [ "sql", "sum", "pattern sql.sum(b:sht, s:lng, e:lng):lng ", "SQLsum;", "return the sum of groups" ] +[ "sql", "suspend_log_flushing", "command sql.suspend_log_flushing():void ", "SQLsuspend_log_flushing;", "Suspend WAL log flushing" ] [ "sql", "sysmon_pause", "pattern sql.sysmon_pause(tag:int):void ", "SYSMONpause;", "" ] [ "sql", "sysmon_pause", "pattern sql.sysmon_pause(tag:lng):void ", "SYSMONpause;", "" ] [ "sql", "sysmon_pause", "pattern sql.sysmon_pause(tag:sht):void ", "SYSMONpause;", "" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -16134,6 +16134,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:bat[:str], attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:any...):int ", "mvc_row_result_wrap;", "Prepare a table result set for the client front-end" ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:str, attr:str, tpe:str, len:int, scale:int, eclass:int, val:any):int ", "mvc_scalar_value_wrap;", "Prepare a table result set for the client front-end." ] [ "sql", "resultSet", "unsafe pattern sql.resultSet(tbl:bat[:str], attr:bat[:str], tpe:bat[:str], len:bat[:int], scale:bat[:int], cols:bat[:any]...):int ", "mvc_table_result_wrap;", "Prepare a table result set for the client in default CSV format" ] +[ "sql", "resume_log_flushing", "command sql.resume_log_flushing():void ", "SQLresume_log_flushing;", "Resume WAL log flushing" ] [ "sql", "reuse", "pattern sql.reuse(sch:str, tbl:str):void ", "SQLreuse;", "Consolidate the deletion table over all columns reusing deleted slots" ] [ "sql", "round", "command sql.round(v:bte, d:int, s:int, r:bte):bte ", "bte_round_wrap;", "round off the decimal v(d,s) to r digits behind the dot (if r < 0, before the dot)" ] [ "sql", "round", "command sql.round(v:dbl, r:bte):dbl ", "dbl_round_wrap;", "round off the floating point v to r digits behind the dot (if r < 0, before the dot)" ] @@ -16175,6 +16176,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "sum", "pattern sql.sum(b:lng, s:lng, e:lng):lng ", "SQLsum;", "return the sum of groups" ] [ "sql", "sum", "pattern sql.sum(b:sht, s:lng, e:lng):hge ", "SQLsum;", "return the sum of groups" ] [ "sql", "sum", "pattern sql.sum(b:sht, s:lng, e:lng):lng ", "SQLsum;", "return the sum of groups" ] +[ "sql", "suspend_log_flushing", "command sql.suspend_log_flushing():void ", "SQLsuspend_log_flushing;", "Suspend WAL log flushing" ] [ "sql", "sysmon_pause", "pattern sql.sysmon_pause(tag:int):void ", "SYSMONpause;", "" ] [ "sql", "sysmon_pause", "pattern sql.sysmon_pause(tag:lng):void ", "SYSMONpause;", "" ] [ "sql", "sysmon_pause", "pattern sql.sysmon_pause(tag:sht):void ", "SYSMONpause;", "" ] 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 @@ -106,7 +106,6 @@ dbl BATcalcvariance_population(dbl *avgp dbl BATcalcvariance_sample(dbl *avgp, BAT *b); BAT *BATcalcxor(BAT *b1, BAT *b2, BAT *s); BAT *BATcalcxorcst(BAT *b, const ValRecord *v, BAT *s); -bool BATcandcontains(BAT *s, oid o); bool BATcheckorderidx(BAT *b); gdk_return BATclear(BAT *b, bool force); void BATcommit(BAT *b); @@ -123,7 +122,7 @@ gdk_return BATfirstn(BAT **topn, BAT **g restrict_t BATgetaccess(BAT *b); PROPrec *BATgetprop(BAT *b, enum prop_t idx); 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); +const char *BATgroupaggrinit(BAT *b, BAT *g, BAT *e, BAT *s, oid *minp, oid *maxp, BUN *ngrpp, struct canditer *ci, BUN *ncand); gdk_return BATgroupavg(BAT **bnp, BAT **cntsp, BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool abort_on_error, int scale); BAT *BATgroupcount(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool abort_on_error); BAT *BATgroupmax(BAT *b, BAT *g, BAT *e, BAT *s, int tp, bool skip_nils, bool abort_on_error); @@ -155,6 +154,7 @@ void *BATmin(BAT *b, void *aggr); void *BATmin_skipnil(BAT *b, void *aggr, bit skipnil); gdk_return BATmode(BAT *b, bool transient); void BATmsync(BAT *b); +gdk_return BATnegcands(BAT *cands, BAT *odels); bool BATordered(BAT *b); bool BATordered_rev(BAT *b); gdk_return BATorderidx(BAT *b, bool stable); @@ -397,6 +397,17 @@ ssize_t bitToStr(str *dst, size_t *len, ssize_t bteFromStr(const char *src, size_t *len, bte **dst, bool external); ssize_t bteToStr(str *dst, size_t *len, const bte *src, bool external); const bte bte_nil; +oid canditer_idx(struct canditer *ci, BUN p); +BUN canditer_init(struct canditer *ci, BAT *b, BAT *s); +oid canditer_last(struct canditer *ci); +oid canditer_peek(struct canditer *ci); +oid canditer_peekprev(struct canditer *ci); +oid canditer_prev(struct canditer *ci); +void canditer_reset(struct canditer *ci); +BUN canditer_search(struct canditer *ci, oid o, bool next); +void canditer_setidx(struct canditer *ci, BUN p); +BAT *canditer_slice(struct canditer *ci, BUN lo, BUN hi); +BAT *canditer_slice2(struct canditer *ci, BUN lo1, BUN hi1, BUN lo2, BUN hi2); int closedir(DIR *dir); ssize_t dblFromStr(const char *src, size_t *len, dbl **dst, bool external); ssize_t dblToStr(str *dst, size_t *len, const dbl *src, bool external); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -550,6 +550,7 @@ typedef uint64_t BUN8type; #define BUN8_NONE ((BUN8type) UINT64_C(0xFFFFFFFFFFFFFFFF)) #endif +#include "gdk_atoms.h" /* * @- Checking and Error definitions: @@ -1219,14 +1220,61 @@ typedef var_t stridx_t; #define BUNtvar(bi,p) (assert((bi).b->ttype && (bi).b->tvarsized), (void *) (Tbase((bi).b)+BUNtvaroff(bi,p))) #define BUNtail(bi,p) ((bi).b->ttype?(bi).b->tvarsized?BUNtvar(bi,p):BUNtloc(bi,p):BUNtpos(bi,p)) +#define BUNlast(b) (assert((b)->batCount <= BUN_MAX), (b)->batCount) + +#define BATcount(b) ((b)->batCount) + /* return the oid value at BUN position p from the (v)oid bat b * works with any TYPE_void or TYPE_oid bat */ -#define BUNtoid(b,p) (assert(ATOMtype((b)->ttype) == TYPE_oid), \ - (is_oid_nil((b)->tseqbase) \ - ? ((b)->ttype == TYPE_void \ - ? (void) (p), oid_nil \ - : ((const oid *) (b)->theap.base)[p]) \ - : (oid) ((b)->tseqbase + (BUN) (p)))) +static inline oid +BUNtoid(BAT *b, BUN p) +{ + assert(ATOMtype(b->ttype) == TYPE_oid); + /* BATcount is the number of valid entries, so with + * exceptions, the last value can well be larger than + * b->tseqbase + BATcount(b) */ + assert(p < BATcount(b)); + assert(b->ttype == TYPE_void || b->tvheap == NULL); + if (is_oid_nil(b->tseqbase)) { + if (b->ttype == TYPE_void) + return b->tseqbase; + return ((const oid *) (b)->theap.base)[p]; + } + oid o = b->tseqbase + p; + if (b->ttype == TYPE_oid || b->tvheap == NULL) { + return o; + } + /* only exceptions allowed on transient BATs */ + assert(b->batRole == TRANSIENT); + /* make sure exception area is a reasonable size */ + assert(b->tvheap->free % SIZEOF_OID == 0); + BUN nexc = (BUN) (b->tvheap->free / SIZEOF_OID); + if (nexc == 0) { + /* no exceptions (why the vheap?) */ + return o; + } + const oid *exc = (oid *) b->tvheap->base; + BUN hi = 0; + if (nexc > 1024) { + BUN lo = 0; + hi = nexc - 1; + while (hi > lo + 1) { + BUN mid = (lo + hi) / 2; + if (exc[mid] == o) { + hi = mid; + break; + } + if (exc[mid] < o) + lo = mid; + else + hi = mid; + } + } + for (; hi < nexc; hi++) + if (o + hi < exc[hi]) + break; + return o + hi; +} static inline BATiter bat_iterator(BAT *b) @@ -1238,10 +1286,6 @@ bat_iterator(BAT *b) return bi; } -#define BUNlast(b) (assert((b)->batCount <= BUN_MAX), (b)->batCount) - -#define BATcount(b) ((b)->batCount) - /* * @- BAT properties * @multitable @columnfractions 0.08 0.7 @@ -1429,7 +1473,8 @@ gdk_export void GDKqsort(void *restrict #define BATtordered(b) ((b)->tsorted) #define BATtrevordered(b) ((b)->trevsorted) /* BAT is dense (i.e., BATtvoid() is true and tseqbase is not NIL) */ -#define BATtdense(b) (!is_oid_nil((b)->tseqbase)) +#define BATtdense(b) (!is_oid_nil((b)->tseqbase) && \ + ((b)->tvheap == NULL || (b)->tvheap->free == 0)) /* BATtvoid: BAT can be (or actually is) represented by TYPE_void */ #define BATtvoid(b) (BATtdense(b) || (b)->ttype==TYPE_void) #define BATtkey(b) ((b)->tkey || BATtdense(b)) @@ -2245,7 +2290,6 @@ gdk_export void GDKclrerr(void); #include "gdk_delta.h" #include "gdk_hash.h" -#include "gdk_atoms.h" #include "gdk_bbp.h" #include "gdk_utils.h" @@ -2366,9 +2410,7 @@ BATdescriptor(bat i) static inline void * Tpos(BATiter *bi, BUN p) { - bi->tvid = bi->b->tseqbase; - if (!is_oid_nil(bi->tvid)) - bi->tvid += p; + bi->tvid = BUNtoid(bi->b, p); return (void*)&bi->tvid; } @@ -2740,11 +2782,11 @@ 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 BAT *BATdiffcand(BAT *a, BAT *b); -gdk_export bool BATcandcontains(BAT *s, oid o); gdk_export gdk_return BATfirstn(BAT **topn, BAT **gids, BAT *b, BAT *cands, BAT *grps, BUN n, bool asc, bool nilslast, bool distinct) __attribute__((__warn_unused_result__)); +#include "gdk_cand.h" #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 @@ -61,14 +61,12 @@ const char * BATgroupaggrinit(BAT *b, BAT *g, BAT *e, BAT *s, /* outputs: */ - oid *minp, oid *maxp, BUN *ngrpp, BUN *startp, BUN *endp, - const oid **candp, const oid **candendp) + oid *minp, oid *maxp, BUN *ngrpp, + struct canditer *ci, BUN *ncand) { oid min, max; BUN i, ngrp; const oid *restrict gids; - BUN start, end, cnt; - const oid *cand = NULL, *candend = NULL; if (b == NULL) return "b must exist"; @@ -136,11 +134,7 @@ BATgroupaggrinit(BAT *b, BAT *g, BAT *e, *maxp = max; *ngrpp = ngrp; - CANDINIT(b, s, start, end, cnt, cand, candend); - *startp = start; - *endp = end; - *candp = cand; - *candendp = candend; + *ncand = canditer_init(ci, b, s); return NULL; } @@ -180,11 +174,12 @@ exchange(double *x, double *y) /* this function was adapted from https://bugs.python.org/file10357/msum4.py */ BUN -dofsum(const void *restrict values, oid seqb, BUN start, BUN end, +dofsum(const void *restrict values, oid seqb, + struct canditer *restrict ci, BUN ncand, void *restrict results, BUN ngrp, int tp1, int tp2, - const oid *restrict cand, const oid *candend, const oid *restrict gids, + const oid *restrict gids, oid min, oid max, bool skip_nils, bool abort_on_error, - bool nil_if_empty, const char *func) + bool nil_if_empty) { struct pergroup { int npartials; @@ -207,7 +202,6 @@ dofsum(const void *restrict values, oid BUN nils = 0; volatile flt f; - ALGODEBUG fprintf(stderr, "#%s: floating point summation\n", func); /* we only deal with the two floating point types */ assert(tp1 == TYPE_flt || tp1 == TYPE_dbl); assert(tp2 == TYPE_flt || tp2 == TYPE_dbl); @@ -236,16 +230,9 @@ dofsum(const void *restrict values, oid return BUN_NONE; } } - for (;;) { - if (cand) { - if (cand >= candend) - break; - listi = *cand++ - seqb; - } else { - if (start >= end) - break; - listi = start++; - } + while (ncand > 0) { + ncand--; + listi = canditer_next(ci) - seqb; grp = gids ? gids[listi] : 0; if (grp < min || grp > max) continue; @@ -457,19 +444,15 @@ dofsum(const void *restrict values, oid do { \ TYPE1 x; \ const TYPE1 *restrict vals = (const TYPE1 *) values; \ - if (ngrp == 1 && cand == NULL) { \ + if (ngrp == 1 && ci->tpe == cand_dense) { \ /* single group, no candidate list */ \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list