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

Reply via email to