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

Reply via email to