Changeset: e1de1f2e60fe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e1de1f2e60fe
Modified Files:
        gdk/gdk_join.c
Branch: groupjoin
Log Message:

Merge with default branch.


diffs (184 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -366,6 +366,8 @@ selectjoin(BAT **r1p, BAT **r2p, BAT **r
        BATiter li = bat_iterator(l);
        const void *v;
        BAT *bn = NULL;
+       BAT *r1 = NULL;
+       BAT *r2 = NULL;
        BUN bncount;
 
        assert(lci->ncand > 0);
@@ -416,46 +418,30 @@ selectjoin(BAT **r1p, BAT **r2p, BAT **r
                if (semi)
                        bncount = 1;
                if (max_one) {
-                       BBPreclaim(bn);
                        GDKerror("more than one match");
-                       return GDK_FAIL;
+                       goto bailout;
                }
        }
-       BAT *r1 = COLnew(0, TYPE_oid, lci->ncand * bncount, TRANSIENT);
-       if (r1 == NULL) {
-               BBPreclaim(bn);
-               return GDK_FAIL;
-       }
+       r1 = COLnew(0, TYPE_oid, lci->ncand * bncount, TRANSIENT);
+       if (r1 == NULL)
+               goto bailout;
        r1->tsorted = true;
        r1->trevsorted = lci->ncand == 1;
        r1->tseqbase = bncount == 1 && lci->tpe == cand_dense ? o : oid_nil;
        r1->tkey = bncount == 1;
        r1->tnil = false;
        r1->tnonil = true;
-       BAT *r2 = NULL;
-       if (r2p) {
-               if (bn)
-                       r2 = COLnew(0, TYPE_oid, lci->ncand * bncount, 
TRANSIENT);
-               else
-                       r2 = BATconstant(0, TYPE_void, &oid_nil, lci->ncand * 
bncount, TRANSIENT);
-               if (r2 == NULL) {
-                       BBPreclaim(bn);
-                       BBPreclaim(r1);
-                       return GDK_FAIL;
-               }
-               if (bn) {
-                       r2->tsorted = lci->ncand == 1 || bncount == 1;
-                       r2->trevsorted = bncount == 1;
-                       r2->tseqbase = lci->ncand == 1 && BATtdense(bn) ? 
bn->tseqbase : oid_nil;
-                       r2->tkey = lci->ncand == 1;
-                       r2->tnil = false;
-                       r2->tnonil = true;
-               }
-       }
        if (bn == NULL) {
+               /* left outer join, no match, we're returning nil in r2 */
                oid *o1p = (oid *) Tloc(r1, 0);
                BUN p, q = bncount;
 
+               if (r2p) {
+                       r2 = BATconstant(0, TYPE_void, &oid_nil, lci->ncand * 
bncount, TRANSIENT);
+                       if (r2 == NULL)
+                               goto bailout;
+                       *r2p = r2;
+               }
                do {
                        GDK_CHECK_TIMEOUT(timeoffset, counter,
                                          GOTO_LABEL_TIMEOUT_HANDLER(bailout));
@@ -464,51 +450,65 @@ selectjoin(BAT **r1p, BAT **r2p, BAT **r
                        }
                        o = canditer_next(lci);
                } while (!is_oid_nil(o));
-       } else if (BATtdense(bn)) {
-               oid *o1p = (oid *) Tloc(r1, 0);
-               oid *o2p = r2 ? (oid *) Tloc(r2, 0) : NULL;
-               oid bno = bn->tseqbase;
-               BUN p, q = bncount;
-
-               do {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                         GOTO_LABEL_TIMEOUT_HANDLER(bailout));
-                       for (p = 0; p < q; p++) {
-                               *o1p++ = o;
-                       }
-                       if (o2p) {
-                               for (p = 0; p < q; p++) {
-                                       *o2p++ = bno + p;
-                               }
-                       }
-                       o = canditer_next(lci);
-               } while (!is_oid_nil(o));
        } else {
                oid *o1p = (oid *) Tloc(r1, 0);
-               oid *o2p = r2 ? (oid *) Tloc(r2, 0) : NULL;
-               const oid *bnp = (const oid *) Tloc(bn, 0);
+               oid *o2p;
                BUN p, q = bncount;
 
-               do {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                         GOTO_LABEL_TIMEOUT_HANDLER(bailout));
-                       for (p = 0; p < q; p++) {
-                               *o1p++ = o;
-                       }
-                       if (o2p) {
+               if (r2p) {
+                       r2 = COLnew(0, TYPE_oid, lci->ncand * bncount, 
TRANSIENT);
+                       if (r2 == NULL)
+                               goto bailout;
+                       r2->tsorted = lci->ncand == 1 || bncount == 1;
+                       r2->trevsorted = bncount == 1;
+                       r2->tseqbase = lci->ncand == 1 && BATtdense(bn) ? 
bn->tseqbase : oid_nil;
+                       r2->tkey = lci->ncand == 1;
+                       r2->tnil = false;
+                       r2->tnonil = true;
+                       *r2p = r2;
+                       o2p = (oid *) Tloc(r2, 0);
+               } else {
+                       o2p = NULL;
+               }
+
+               if (BATtdense(bn)) {
+                       oid bno = bn->tseqbase;
+
+                       do {
+                               GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                                 
GOTO_LABEL_TIMEOUT_HANDLER(bailout));
                                for (p = 0; p < q; p++) {
-                                       *o2p++ = bnp[p];
+                                       *o1p++ = o;
+                               }
+                               if (o2p) {
+                                       for (p = 0; p < q; p++) {
+                                               *o2p++ = bno + p;
+                                       }
                                }
-                       }
-                       o = canditer_next(lci);
-               } while (!is_oid_nil(o));
+                               o = canditer_next(lci);
+                       } while (!is_oid_nil(o));
+               } else {
+                       const oid *bnp = (const oid *) Tloc(bn, 0);
+
+                       do {
+                               GDK_CHECK_TIMEOUT(timeoffset, counter,
+                                                 
GOTO_LABEL_TIMEOUT_HANDLER(bailout));
+                               for (p = 0; p < q; p++) {
+                                       *o1p++ = o;
+                               }
+                               if (o2p) {
+                                       for (p = 0; p < q; p++) {
+                                               *o2p++ = bnp[p];
+                                       }
+                               }
+                               o = canditer_next(lci);
+                       } while (!is_oid_nil(o));
+               }
+               if (r2)
+                       BATsetcount(r2, lci->ncand * bncount);
        }
        BATsetcount(r1, lci->ncand * bncount);
        *r1p = r1;
-       if (r2 && r2p) {
-               BATsetcount(r2, lci->ncand * bncount);
-               *r2p = r2;
-       }
        BAT *r3 = NULL;
        if (r3p) {
                bit mark;
@@ -547,8 +547,11 @@ selectjoin(BAT **r1p, BAT **r2p, BAT **r
        return GDK_SUCCEED;
 
   bailout:
+       BBPreclaim(bn);
        BBPreclaim(r1);
        BBPreclaim(r2);
+       if (r2p)
+               *r2p = NULL;
        return GDK_FAIL;
 }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to