Changeset: 3776dcd011f1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3776dcd011f1
Modified Files:
gdk/gdk_join.c
Branch: default
Log Message:
We need width, not shift, and we need it per input bat.
VarHeapVal uses width, and we use that in the VALUE macro.
diffs (91 lines):
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -64,7 +64,7 @@ joininitresults(BAT **r1p, BAT **r2p, BU
return GDK_SUCCEED;
}
-#define VALUE(side, x) (side##vars ? side##vars +
VarHeapVal(side##vals, (x), shift) : side##vals + ((x) << shift))
+#define VALUE(side, x) (side##vars ? side##vars +
VarHeapVal(side##vals, (x), side##width) : side##vals + ((x) * side##width))
/* Do a binary search for the first/last occurrence of v between lo and hi
* (lo inclusive, hi not inclusive) in values.
@@ -76,7 +76,7 @@ joininitresults(BAT **r1p, BAT **r2p, BU
static BUN
binsearch(const oid *rcand, oid offset,
const char *rvals, const char *rvars,
- int shift, BUN lo, BUN hi, const char *v,
+ int rwidth, BUN lo, BUN hi, const char *v,
int (*cmp)(const void *, const void *), int reverse, int last)
{
BUN mid;
@@ -119,7 +119,7 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
BUN lscan, rscan;
const char *lvals, *rvals;
const char *lvars, *rvars;
- int shift;
+ int lwidth, rwidth;
const void *nil = ATOMnilptr(l->ttype);
int (*cmp)(const void *, const void *) = BATatoms[l->ttype].atomCmp;
const char *v;
@@ -150,7 +150,8 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
assert(!r->tvarsized || !r->ttype);
lvars = rvars = NULL;
}
- shift = l->T->shift;
+ lwidth = l->T->width;
+ rwidth = r->T->width;
/* equal_order is set if we can scan both BATs in the same
* order, so when both are sorted or both are reverse
* sorted */
@@ -196,12 +197,12 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
if (lscan < (BUN) (lcandend - lcand) &&
lreverse * cmp(VALUE(l, *lcand -
l->hseqbase + lscan),
(v = VALUE(r, rcand ? *rcand
- r->hseqbase : rstart))) < 0)
- lcand += binsearch(lcand, l->hseqbase,
lvals, lvars, shift, lscan, lcandend - lcand, v, cmp, lreverse, 0);
+ lcand += binsearch(lcand, l->hseqbase,
lvals, lvars, lwidth, lscan, lcandend - lcand, v, cmp, lreverse, 0);
} else {
if (lscan < lend - lstart &&
lreverse * cmp(VALUE(l, lstart + lscan),
(v = VALUE(r, rcand ? *rcand
- r->hseqbase : rstart))) < 0)
- lstart = binsearch(NULL, 0, lvals,
lvars, shift, lstart + lscan, lend, v, cmp, lreverse, 0);
+ lstart = binsearch(NULL, 0, lvals,
lvars, lwidth, lstart + lscan, lend, v, cmp, lreverse, 0);
}
}
/* v is the value we're going to work with in this
@@ -233,7 +234,7 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
rreverse * cmp(v, VALUE(r, *rcand -
r->hseqbase + rscan)) > 0) {
/* value too far away in r:
* use binary search */
- rcand += binsearch(rcand, r->hseqbase,
rvals, rvars, shift, rscan, rcandend - rcand, v, cmp, rreverse, 0);
+ rcand += binsearch(rcand, r->hseqbase,
rvals, rvars, rwidth, rscan, rcandend - rcand, v, cmp, rreverse, 0);
} else {
/* scan r for v */
while (rcand < rcandend &&
@@ -248,7 +249,7 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
rreverse * cmp(v, VALUE(r, rstart + rscan))
> 0) {
/* value too far away in r:
* use binary search */
- rstart = binsearch(NULL, 0, rvals,
rvars, shift, rstart + rscan, rend, v, cmp, rreverse, 0);
+ rstart = binsearch(NULL, 0, rvals,
rvars, rwidth, rstart + rscan, rend, v, cmp, rreverse, 0);
} else {
/* scan r for v */
while (rstart < rend &&
@@ -267,7 +268,7 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
rreverse * cmp(v, VALUE(r, *rcandend -
r->hseqbase - rscan - 1)) < 0) {
/* value too far away in r:
* use binary search */
- rcandend = rcand + binsearch(rcand,
r->hseqbase, rvals, rvars, shift, 0, (BUN) (rcandend - rcand) - rscan, v, cmp,
rreverse, 1);
+ rcandend = rcand + binsearch(rcand,
r->hseqbase, rvals, rvars, rwidth, 0, (BUN) (rcandend - rcand) - rscan, v, cmp,
rreverse, 1);
} else {
/* scan r for v */
while (rcand < rcandend &&
@@ -282,7 +283,7 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT
rreverse * cmp(v, VALUE(r, rend - rscan -
1)) < 0) {
/* value too far away in r:
* use binary search */
- rend = binsearch(NULL, 0, rvals, rvars,
shift, rstart, rend - rscan, v, cmp, rreverse, 1);
+ rend = binsearch(NULL, 0, rvals, rvars,
rwidth, rstart, rend - rscan, v, cmp, rreverse, 1);
} else {
/* scan r for v */
while (rstart < rend &&
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list