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