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

Better check to see whether join result is empty.

This fixes bug 6237.


diffs (94 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -117,10 +117,17 @@ joininitresults(BAT **r1p, BAT **r2p, BU
        *r1p = NULL;
        if (r2p)
                *r2p = NULL;
-       if (rkey | semi | only_misses) {
+       if (lcnt == 0) {
+               /* there is nothing to match */
+               maxsize = 0;
+       } else if (!only_misses && !nil_on_miss && rcnt == 0) {
+               /* if right is empty, we have no hits, so if we don't
+                * want misses, the result is empty */
+               maxsize = 0;
+       } else if (rkey | semi | only_misses) {
                /* each entry left matches at most one on right, in
                 * case nil_on_miss is also set, each entry matches
-                * exactly one */
+                * exactly one (see below) */
                maxsize = lcnt;
        } else if (lkey) {
                /* each entry on right is matched at most once */
@@ -149,6 +156,25 @@ joininitresults(BAT **r1p, BAT **r2p, BU
                size = maxsize;
        }
 
+       if (maxsize == 0) {
+               r1 = COLnew(0, TYPE_void, 0, TRANSIENT);
+               if (r1 == NULL) {
+                       return BUN_NONE;
+               }
+               BATtseqbase(r1, 0);
+               if (r2p) {
+                       r2 = COLnew(0, TYPE_void, 0, TRANSIENT);
+                       if (r2 == NULL) {
+                               BBPreclaim(r1);
+                               return BUN_NONE;
+                       }
+                       BATtseqbase(r2, 0);
+                       *r2p = r2;
+               }
+               *r1p = r1;
+               return 0;
+       }
+
        r1 = COLnew(0, TYPE_oid, size, TRANSIENT);
        if (r1 == NULL) {
                return BUN_NONE;
@@ -3797,6 +3823,8 @@ subleftjoin(BAT **r1p, BAT **r2p, BAT *l
        *r1p = r1;
        if (r2p)
                *r2p = r2;
+       if (maxsize == 0)
+               return GDK_SUCCEED;
        if (BATtdense(r) && (sr == NULL || BATtdense(sr)) && lcount > 0 && 
rcount > 0) {
                /* use special implementation for dense right-hand side */
                return mergejoin_void(r1, r2, l, r, sl, sr,
@@ -3907,6 +3935,8 @@ BATthetajoin(BAT **r1p, BAT **r2p, BAT *
                return GDK_FAIL;
        *r1p = r1;
        *r2p = r2;
+       if (maxsize == 0)
+               return GDK_SUCCEED;
 
        return thetajoin(r1, r2, l, r, sl, sr, opcode, maxsize, t0);
 }
@@ -3957,6 +3987,8 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                return GDK_FAIL;
        *r1p = r1;
        *r2p = r2;
+       if (maxsize == 0)
+               return GDK_SUCCEED;
        swap = 0;
 
        /* some statistics to help us decide */
@@ -4085,6 +4117,8 @@ BATbandjoin(BAT **r1p, BAT **r2p, BAT *l
                return GDK_FAIL;
        *r1p = r1;
        *r2p = r2;
+       if (maxsize == 0)
+               return GDK_SUCCEED;
 
        return bandjoin(r1, r2, l, r, sl, sr, c1, c2, li, hi, maxsize, t0);
 }
@@ -4104,6 +4138,8 @@ BATrangejoin(BAT **r1p, BAT **r2p, BAT *
                return GDK_FAIL;
        *r1p = r1;
        *r2p = r2;
+       if (maxsize == 0)
+               return GDK_SUCCEED;
 
        /* note, the rangejoin implementation is in gdk_select.c since
         * it uses the imprints code there */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to