Changeset: 673bc8598a4a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=673bc8598a4a
Modified Files:
        gdk/gdk_join.c
Branch: Oct2020
Log Message:

Fixed a couple of join bugs.


diffs (48 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -1778,14 +1778,23 @@ mergejoin(BAT **r1p, BAT **r2p, BAT *l, 
        BAT *r2 = r2p ? *r2p : NULL;
 
        if (l->tsorted || l->trevsorted) {
-               /* determine opportunistic scan window for l */
-               for (nl = lci->ncand, lscan = 4; nl > 0; lscan++)
-                       nl >>= 1;
                equal_order = (l->tsorted && r->tsorted) ||
                        (l->trevsorted && r->trevsorted &&
                         !BATtvoid(l) && !BATtvoid(r));
                lordering = l->tsorted && (r->tsorted || !equal_order) ? 1 : -1;
                rordering = equal_order ? lordering : -lordering;
+               if (!l->tnonil && !nil_matches && !nil_on_miss) {
+                       nl = binsearch(NULL, 0, l->ttype, lvals, lvars, lwidth, 
0, BATcount(l), nil, lordering, 1);
+                       nl = canditer_search(lci, nl + l->hseqbase, true);
+                       if (l->tsorted) {
+                               canditer_setidx(lci, nl);
+                       } else if (l->trevsorted) {
+                               lci->ncand = nl;
+                       }
+               }
+               /* determine opportunistic scan window for l */
+               for (nl = lci->ncand, lscan = 4; nl > 0; lscan++)
+                       nl >>= 1;
        } else {
                /* if l not sorted, we will always use binary search
                 * on r */
@@ -2243,7 +2252,7 @@ mergejoin(BAT **r1p, BAT **r2p, BAT *l, 
                                /* keyness or r2 can only be assured
                                 * as long as matched values are
                                 * ordered */
-                               int ord = rordering * cmp(prev, v);
+                               int ord = rordering * cmp(prev, v ? v : nil);
                                if (ord < 0) {
                                        /* previous value in l was
                                         * less than current */
@@ -2267,7 +2276,7 @@ mergejoin(BAT **r1p, BAT **r2p, BAT *l, 
                                        }
                                }
                        }
-                       prev = v;
+                       prev = v ? v : nil;
                }
                if (BATcount(r1) > 0) {
                        /* a new, higher value will be inserted into
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to