Changeset: 2a062bb99bbf for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a062bb99bbf
Modified Files:
        gdk/gdk_batop.c
Branch: Dec2016
Log Message:

Fix candidate merge/intersect when the result is empty.


diffs (54 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1501,6 +1501,8 @@ BATcount_no_nil(BAT *b)
        return cnt;
 }
 
+/* create a new, dense candidate list with values from `first' up to,
+ * but not including, `last' */
 static BAT *
 newdensecand(oid first, oid last)
 {
@@ -1510,7 +1512,7 @@ newdensecand(oid first, oid last)
                return NULL;
        if (last < first)
                first = last = 0; /* empty range */
-       BATsetcount(bn, last - first + 1);
+       BATsetcount(bn, last - first);
        BATtseqbase(bn, first);
        return bn;
 }
@@ -1562,19 +1564,19 @@ BATmergecand(BAT *a, BAT *b)
                if (af <= bf && bf <= al + 1) {
                        /* partial overlap starting with a, or b is
                         * smack bang after a */
-                       return newdensecand(af, al < bl ? bl : al);
+                       return newdensecand(af, al < bl ? bl + 1 : al + 1);
                }
                if (bf <= af && af <= bl + 1) {
                        /* partial overlap starting with b, or a is
                         * smack bang after b */
-                       return newdensecand(bf, al < bl ? bl : al);
+                       return newdensecand(bf, al < bl ? bl + 1 : al + 1);
                }
        }
        if (ad && af <= bf && al >= bl) {
-               return newdensecand(af, al);
+               return newdensecand(af, al + 1);
        }
        if (bd && bf <= af && bl >= al) {
-               return newdensecand(bf, bl);
+               return newdensecand(bf, bl + 1);
        }
 
        bn = COLnew(0, TYPE_oid, BATcount(a) + BATcount(b), TRANSIENT);
@@ -1684,7 +1686,7 @@ BATintersectcand(BAT *a, BAT *b)
 
        if ((af + BATcount(a) - 1 == al) && (bf + BATcount(b) - 1 == bl)) {
                /* both lists are VOID */
-               return newdensecand(MAX(af, bf), MIN(al, bl));
+               return newdensecand(MAX(af, bf), MIN(al, bl) + 1);
        }
 
        bn = COLnew(0, TYPE_oid, MIN(BATcount(a), BATcount(b)), TRANSIENT);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to