Changeset: 48cfba96feb4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=48cfba96feb4
Added Files:
        sql/test/BugTracker-2015/Tests/and_or_in.Bug-3655.sql
        sql/test/BugTracker-2015/Tests/and_or_in.Bug-3655.stable.err
        sql/test/BugTracker-2015/Tests/and_or_in.Bug-3655.stable.out
Modified Files:
        gdk/ChangeLog.Oct2014
        gdk/gdk_imprints.c
        gdk/gdk_join.c
        gdk/gdk_private.h
        gdk/gdk_select.c
        sql/backends/monet5/rel_bin.c
        sql/common/sql_changeset.c
        sql/test/BugTracker-2015/Tests/All
Branch: default
Log Message:

Merge with Oct2014 branch.


diffs (truncated from 1364 to 300 lines):

diff --git a/gdk/ChangeLog.Oct2014 b/gdk/ChangeLog.Oct2014
--- a/gdk/ChangeLog.Oct2014
+++ b/gdk/ChangeLog.Oct2014
@@ -1,3 +1,7 @@
 # ChangeLog file for MonetDB
 # This file is updated with Maddlog
 
+* Tue Jan 27 2015 Sjoerd Mullender <sjo...@acm.org>
+- Replaced the rangejoin implementation with one that uses imprints if
+  it can.
+
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -642,7 +642,7 @@ BATimprints(BAT *b)
                sprintf(imprints->imprints->filename, "%s.%cimprints", nme,
                        b->batCacheid > 0 ? 't' : 'h');
                pages = (((size_t) BATcount(b) * b->T->width) + IMPS_PAGE - 1) 
/ IMPS_PAGE;
-               imprints->imprints->farmid = BBPselectfarm(PERSISTENT, b->ttype,
+               imprints->imprints->farmid = BBPselectfarm(b->batRole, b->ttype,
                                                           imprintsheap);
                if ((fd = GDKfdlocate(imprints->imprints->farmid, nme, "rb",
                                      b->batCacheid > 0 ? "timprints" : 
"himprints")) >= 0) {
@@ -810,7 +810,8 @@ BATimprints(BAT *b)
                ((size_t *) imprints->imprints->base)[1] = (size_t) 
imprints->impcnt;
                ((size_t *) imprints->imprints->base)[2] = (size_t) 
imprints->dictcnt;
                ((size_t *) imprints->imprints->base)[3] = (size_t) BATcount(b);
-               if (HEAPsave(imprints->imprints, nme, b->batCacheid > 0 ? 
"timprints" : "himprints") == 0 &&
+               if (b->batRole == PERSISTENT &&
+                   HEAPsave(imprints->imprints, nme, b->batCacheid > 0 ? 
"timprints" : "himprints") == 0 &&
                    (fd = GDKfdlocate(imprints->imprints->farmid, nme, "rb+",
                                      b->batCacheid > 0 ? "timprints" : 
"himprints")) >= 0) {
                        /* add version number */
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2257,311 +2257,6 @@ bandjoin(BAT *r1, BAT *r2, BAT *l, BAT *
        return GDK_FAIL;
 }
 
-static gdk_return
-rangejoin(BAT *r1, BAT *r2, BAT *l, BAT *rl, BAT *rh, BAT *sl, BAT *sr, int 
li, int hi)
-{
-       BUN lstart, lend, lcnt;
-       const oid *lcand = NULL, *lcandend = NULL;
-       BUN rstart, rend, rcnt;
-       const oid *rcand = NULL, *rcandend = NULL;
-       const char *lvals, *rlvals, *rhvals;
-       const char *lvars, *rlvars, *rhvars;
-       int lwidth, rlwidth, rhwidth;
-       const void *nil = ATOMnilptr(l->ttype);
-       int (*cmp)(const void *, const void *) = BATatoms[l->ttype].atomCmp;
-       int t;
-       const char *vl, *vrl, *vrh;
-       const oid *p;
-       oid lastr = 0;
-       BUN n, nr, newcap;
-       oid lo, ro;
-       int c;
-       int lskipped = 0;
-       wrd loff = 0;
-       oid lval = oid_nil, rlval = oid_nil, rhval = oid_nil;
-
-       assert(BAThdense(l));
-       assert(BAThdense(rl));
-       assert(BAThdense(rh));
-       assert(ATOMtype(l->ttype) == ATOMtype(rl->ttype));
-       assert(ATOMtype(l->ttype) == ATOMtype(rh->ttype));
-       assert(sl == NULL || sl->tsorted);
-       assert(sr == NULL || sr->tsorted);
-
-       ALGODEBUG fprintf(stderr, "#rangejoin(l=%s#" BUNFMT "[%s]%s%s,"
-                         "rl=%s#" BUNFMT "[%s]%s%s,rh=%s#" BUNFMT "[%s]%s%s,"
-                         "sl=%s#" BUNFMT "%s%s,sr=%s#" BUNFMT "%s%s)\n",
-                         BATgetId(l), BATcount(l), ATOMname(l->ttype),
-                         l->tsorted ? "-sorted" : "",
-                         l->trevsorted ? "-revsorted" : "",
-                         BATgetId(rl), BATcount(rl), ATOMname(rl->ttype),
-                         rl->tsorted ? "-sorted" : "",
-                         rl->trevsorted ? "-revsorted" : "",
-                         BATgetId(rh), BATcount(rh), ATOMname(rh->ttype),
-                         rh->tsorted ? "-sorted" : "",
-                         rh->trevsorted ? "-revsorted" : "",
-                         sl ? BATgetId(sl) : "NULL", sl ? BATcount(sl) : 0,
-                         sl && sl->tsorted ? "-sorted" : "",
-                         sl && sl->trevsorted ? "-revsorted" : "",
-                         sr ? BATgetId(sr) : "NULL", sr ? BATcount(sr) : 0,
-                         sr && sr->tsorted ? "-sorted" : "",
-                         sr && sr->trevsorted ? "-revsorted" : "");
-
-       CANDINIT(l, sl, lstart, lend, lcnt, lcand, lcandend);
-       CANDINIT(rl, sr, rstart, rend, rcnt, rcand, rcandend);
-
-       lvals = l->ttype == TYPE_void ? NULL : (const char *) Tloc(l, 
BUNfirst(l));
-       rlvals = rl->ttype == TYPE_void ? NULL : (const char *) Tloc(rl, 
BUNfirst(rl));
-       rhvals = rh->ttype == TYPE_void ? NULL : (const char *) Tloc(rh, 
BUNfirst(rh));
-       if (l->tvarsized && l->ttype) {
-               assert(rl->tvarsized && rl->ttype);
-               assert(rh->tvarsized && rh->ttype);
-               lvars = l->T->vheap->base;
-               rlvars = rl->T->vheap->base;
-               rhvars = rh->T->vheap->base;
-       } else {
-               assert(!rl->tvarsized || !rl->ttype);
-               assert(!rh->tvarsized || !rh->ttype);
-               lvars = rlvars = rhvars = NULL;
-       }
-       lwidth = l->T->width;
-       rlwidth = rl->T->width;
-       rhwidth = rh->T->width;
-
-       if (l->ttype == TYPE_void) {
-               if (l->tseqbase == oid_nil) {
-                       /* trivial: nils don't match anything */
-                       return GDK_SUCCEED;
-               }
-               if (lcand) {
-                       lstart = 0;
-                       lend = (BUN) (lcandend - lcand);
-                       lvals = (const char *) lcand;
-                       lcand = NULL;
-                       lwidth = SIZEOF_OID;
-               }
-               loff = (wrd) l->tseqbase - (wrd) l->hseqbase;
-       }
-
-       t = ATOMtype(l->ttype);
-       if (t != ATOMstorage(t) &&
-           ATOMnilptr(ATOMstorage(t)) == nil &&
-           BATatoms[ATOMstorage(t)].atomCmp == cmp)
-               t = ATOMstorage(t);
-
-       /* nested loop implementation for range join */
-       for (;;) {
-               if (lcand) {
-                       if (lcand == lcandend)
-                               break;
-                       lo = *lcand++;
-                       vl = VALUE(l, lstart);
-               } else {
-                       if (lstart == lend)
-                               break;
-                       if (lvals) {
-                               vl = VALUE(l, lstart);
-                               if (loff != 0) {
-                                       lval = (oid) (*(const oid *)vl + loff);
-                                       vl = (const char *) &lval;
-                               }
-                       } else {
-                               lval = lstart + l->tseqbase;
-                               vl = (const char *) &lval;
-                       }
-                       lo = lstart++ + l->hseqbase;
-               }
-               if (cmp(vl, nil) == 0)
-                       continue;
-               nr = 0;
-               p = rcand;
-               n = rstart;
-               for (;;) {
-                       if (rcand) {
-                               if (p == rcandend)
-                                       break;
-                               ro = *p++;
-                               if (rlvals)
-                                       vrl = VALUE(rl, ro - rl->hseqbase);
-                               else {
-                                       /* TYPE_void */
-                                       rlval = ro;
-                                       vrl = (const char *) &rlval;
-                               }
-                               if (rhvals)
-                                       vrh = VALUE(rh, ro - rh->hseqbase);
-                               else {
-                                       /* TYPE_void */
-                                       rhval = ro;
-                                       vrh = (const char *) &rhval;
-                               }
-                       } else {
-                               if (n == rend)
-                                       break;
-                               if (rlvals) {
-                                       vrl = VALUE(rl, n);
-                               } else {
-                                       /* TYPE_void */
-                                       rlval = n + rl->tseqbase;
-                                       vrl = (const char *) &rlval;
-                               }
-                               if (rhvals) {
-                                       vrh = VALUE(rh, n);
-                               } else {
-                                       /* TYPE_void */
-                                       rhval = n + rh->tseqbase;
-                                       vrh = (const char *) &rhval;
-                               }
-                               ro = n++ + rl->hseqbase;
-                       }
-                       switch (t) {
-                       case TYPE_bte:
-                               if (*(const bte*)vrl == bte_nil ||
-                                   *(const bte*)vrh == bte_nil ||
-                                   *(const bte*)vl < *(const bte*)vrl ||
-                                   *(const bte*)vl > *(const bte*)vrh ||
-                                   (!li && *(const bte*)vl == *(const 
bte*)vrl) ||
-                                   (!hi && *(const bte*)vl == *(const 
bte*)vrh))
-                                       continue;
-                               break;
-                       case TYPE_sht:
-                               if (*(const sht*)vrl == sht_nil ||
-                                   *(const sht*)vrh == sht_nil ||
-                                   *(const sht*)vl < *(const sht*)vrl ||
-                                   *(const sht*)vl > *(const sht*)vrh ||
-                                   (!li && *(const sht*)vl == *(const 
sht*)vrl) ||
-                                   (!hi && *(const sht*)vl == *(const 
sht*)vrh))
-                                       continue;
-                               break;
-                       case TYPE_int:
-                               if (*(const int*)vrl == int_nil ||
-                                   *(const int*)vrh == int_nil ||
-                                   *(const int*)vl < *(const int*)vrl ||
-                                   *(const int*)vl > *(const int*)vrh ||
-                                   (!li && *(const int*)vl == *(const 
int*)vrl) ||
-                                   (!hi && *(const int*)vl == *(const 
int*)vrh))
-                                       continue;
-                               break;
-                       case TYPE_lng:
-                               if (*(const lng*)vrl == lng_nil ||
-                                   *(const lng*)vrh == lng_nil ||
-                                   *(const lng*)vl < *(const lng*)vrl ||
-                                   *(const lng*)vl > *(const lng*)vrh ||
-                                   (!li && *(const lng*)vl == *(const 
lng*)vrl) ||
-                                   (!hi && *(const lng*)vl == *(const 
lng*)vrh))
-                                       continue;
-                               break;
-#ifdef HAVE_HGE
-                       case TYPE_hge:
-                               if (*(const hge*)vrl == hge_nil ||
-                                   *(const hge*)vrh == hge_nil ||
-                                   *(const hge*)vl < *(const hge*)vrl ||
-                                   *(const hge*)vl > *(const hge*)vrh ||
-                                   (!li && *(const hge*)vl == *(const 
hge*)vrl) ||
-                                   (!hi && *(const hge*)vl == *(const 
hge*)vrh))
-                                       continue;
-                               break;
-#endif
-                       case TYPE_flt:
-                               if (*(const flt*)vrl == flt_nil ||
-                                   *(const flt*)vrh == flt_nil ||
-                                   *(const flt*)vl < *(const flt*)vrl ||
-                                   *(const flt*)vl > *(const flt*)vrh ||
-                                   (!li && *(const flt*)vl == *(const 
flt*)vrl) ||
-                                   (!hi && *(const flt*)vl == *(const 
flt*)vrh))
-                                       continue;
-                               break;
-                       case TYPE_dbl:
-                               if (*(const dbl*)vrl == dbl_nil ||
-                                   *(const dbl*)vrh == dbl_nil ||
-                                   *(const dbl*)vl < *(const dbl*)vrl ||
-                                   *(const dbl*)vl > *(const dbl*)vrh ||
-                                   (!li && *(const dbl*)vl == *(const 
dbl*)vrl) ||
-                                   (!hi && *(const dbl*)vl == *(const 
dbl*)vrh))
-                                       continue;
-                               break;
-                       default:
-                               assert(t != TYPE_oid);
-                               assert(t != TYPE_wrd);
-                               if (cmp(vrl, nil) == 0 || cmp(vrh, nil) == 0)
-                                       continue;
-                               c = cmp(vl, vrl);
-                               if (c < 0 || (c == 0 && !li))
-                                       continue;
-                               c = cmp(vl, vrh);
-                               if (c > 0 || (c == 0 && !hi))
-                                       continue;
-                               break;
-                       }
-                       if (BUNlast(r1) == BATcapacity(r1)) {
-                               newcap = BATgrows(r1);
-                               BATsetcount(r1, BATcount(r1));
-                               BATsetcount(r2, BATcount(r2));
-                               r1 = BATextend(r1, newcap);
-                               r2 = BATextend(r2, newcap);
-                               if (r1 == NULL || r2 == NULL)
-                                       goto bailout;
-                               assert(BATcapacity(r1) == BATcapacity(r2));
-                       }
-                       if (BATcount(r2) > 0) {
-                               if (lastr + 1 != ro)
-                                       r2->tdense = 0;
-                               if (nr == 0) {
-                                       r1->trevsorted = 0;
-                                       if (lastr > ro) {
-                                               r2->tsorted = 0;
-                                               r2->tkey = 0;
-                                       } else if (lastr < ro) {
-                                               r2->trevsorted = 0;
-                                       } else {
-                                               r2->tkey = 0;
-                                       }
-                               }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to