Changeset: 01f48e7688a6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=01f48e7688a6
Modified Files:
gdk/gdk_select.c
Branch: default
Log Message:
revised and extended Niels' scan-select fixes (changeset 9188bb6aecfe):
- BUNtail() expects and SORTfndfirst() return physical BUN indexes,
i.e., relative to b->[HT]->heap.base
- BATslice() & BATslice2() expects logical BUN indexes,
i.e., relative to b->U->first aka. b->batFirst aka. BUNfirst(b)
- OIDs are OIDs (i.e., relative to b->[HT]->seq aka. b->[ht]seqbase
make sure we properly translate between all three of them
diffs (71 lines):
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -173,9 +173,9 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn,
"scanselect %s\n", BATgetId(b), BATcount(b), \
s ? BATgetId(s) : "NULL", anti, #TEST); \
while (p < q) { \
- v = BUNtail(bi, p-off); \
+ v = BUNtail(bi, p); \
if (TEST) { \
- o = (oid) p; \
+ o = (oid) p + off; \
bunfastins(bn, NULL, &o); \
} \
p++; \
@@ -254,14 +254,14 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
p = (BUN) s->tseqbase;
q = p + BATcount(s);
if ((oid) p < b->hseqbase)
- p = b->hseqbase;
+ p = (BUN) b->hseqbase;
if ((oid) q > b->hseqbase + BATcount(b))
- q = b->hseqbase + BATcount(b);
- p += BUNfirst(b);
- q += BUNfirst(b);
+ q = (BUN) b->hseqbase + BATcount(b);
+ p -= off;
+ q -= off;
} else {
- p = BUNfirst(b) + off;
- q = BUNlast(b) + off;
+ p = BUNfirst(b);
+ q = BUNlast(b);
}
if (equi) {
assert(li && hi);
@@ -563,27 +563,27 @@ BATsubselect(BAT *b, BAT *s, const void
}
}
if (anti) {
- BUN first = SORTfndlast(b, nil);
+ BUN first = SORTfndlast(b, nil) - BUNfirst(b);
/* match: [first..low) + [high..count) */
if (s) {
oid o = (oid) first + b->H->seq;
- first = SORTfndfirst(s, &o);
+ first = SORTfndfirst(s, &o) - BUNfirst(s);
o = (oid) low + b->H->seq;
- low = SORTfndfirst(s, &o);
+ low = SORTfndfirst(s, &o) - BUNfirst(s);
o = (oid) high + b->H->seq;
- high = SORTfndfirst(s, &o);
+ high = SORTfndfirst(s, &o) - BUNfirst(s);
v = VIEWhead(BATmirror(s));
} else {
v = VIEWhead(b); /* [oid,nil] */
}
- bn = BATslice2(v, first, low, high, BUNlast(v));
+ bn = BATslice2(v, first, low, high, BATcount(v));
} else {
/* match: [low..high) */
if (s) {
oid o = (oid) low + b->H->seq;
- low = SORTfndfirst(s, &o);
+ low = SORTfndfirst(s, &o) - BUNfirst(s);
o = (oid) high + b->H->seq;
- high = SORTfndfirst(s, &o);
+ high = SORTfndfirst(s, &o) - BUNfirst(s);
v = VIEWhead(BATmirror(s));
} else {
v = VIEWhead(b); /* [oid,nil] */
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list