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