Changeset: 005ffe3f0a32 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=005ffe3f0a32
Added Files:
        sql/test/BugTracker-2018/Tests/copy-into-doubled.Bug-6666.sql
        sql/test/BugTracker-2018/Tests/copy-into-doubled.Bug-6666.stable.err
        sql/test/BugTracker-2018/Tests/copy-into-doubled.Bug-6666.stable.out
Modified Files:
        gdk/gdk_join.c
        monetdb5/modules/mal/mal_io.c
        sql/backends/monet5/sql.c
        sql/test/BugTracker-2018/Tests/All
Branch: default
Log Message:

Merge with Aug2018 branch.


diffs (truncated from 2059 to 300 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -208,102 +208,96 @@ joininitresults(BAT **r1p, BAT **r2p, BU
 
 #define APPEND(b, o)           (((oid *) b->theap.base)[b->batCount++] = (o))
 
+/* Return BATs through r1p and r2p for the case that there is no
+ * match between l and r, taking all flags into consideration.
+ *
+ * This means, if nil_on_miss is set or only_misses is set, *r1p is a
+ * copy of the left candidate list or a dense list of all "head"
+ * values of l, and *r2p (if r2p is not NULL) is all nil.  If neither
+ * of those flags is set, the result is two empty BATs. */
 static gdk_return
-nomatch(BAT *r1, BAT *r2, BAT *l, BAT *r, BUN lstart, BUN lend,
+nomatch(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BUN lstart, BUN lend,
        const oid *lcand, const oid *lcandend,
        bool nil_on_miss, bool only_misses, const char *func, lng t0)
 {
        BUN cnt;
+       BAT *r1, *r2;
 
-       r1->tkey = true;
-       r1->tnokey[0] = r1->tnokey[1] = 0;
-       r1->tsorted = true;
-       r1->tnosorted = 0;
-       r1->tseqbase = oid_nil;
-       r1->tnil = false;
-       r1->tnonil = true;
-       if (r2) {
-               r2->tkey = true;
-               r2->tnokey[0] = r2->tnokey[1] = 0;
-               r2->tsorted = true;
-               r2->tnosorted = 0;
-               r2->tseqbase = oid_nil;
-               r2->tnil = false;
-               r2->tnonil = true;
-       }
        if (lstart == lend || !(nil_on_miss | only_misses)) {
-               virtualize(r1);
-               r1->trevsorted = true;
-               r1->tnorevsorted = 0;
-               if (r2) {
-                       virtualize(r2);
-                       r2->trevsorted = true;
-                       r2->tnorevsorted = 0;
+               /* return empty BATs */
+               if ((*r1p = BATdense(0, 0, 0)) == NULL)
+                       return GDK_FAIL;
+               if (r2p && (*r2p = BATdense(0, 0, 0)) == NULL) {
+                       BBPreclaim(*r1p);
+                       *r1p = NULL;
+                       return GDK_FAIL;
                }
+               r1 = *r1p;
+               r2 = r2p ? *r2p : NULL;
                ALGODEBUG fprintf(stderr,
                                  "#%s(l=%s,r=%s)=(" ALGOBATFMT "," 
ALGOOPTBATFMT ") " LLFMT "us -- nomatch\n",
-                                 func,
-                                 BATgetId(l), BATgetId(r),
+                                 func, BATgetId(l), BATgetId(r),
                                  ALGOBATPAR(r1), ALGOOPTBATPAR(r2),
                                  GDKusec() - t0);
                return GDK_SUCCEED;
        }
+
        if (lcand) {
+               BAT *r1;
+
                cnt = (BUN) (lcandend - lcand);
-               if (BATextend(r1, cnt) != GDK_SUCCEED)
-                       goto bailout;
-               memcpy(Tloc(r1, 0), lcand, (lcandend - lcand) * sizeof(oid));
+               r1 = COLnew(0, TYPE_oid, cnt, TRANSIENT);
+               if (r1 == NULL)
+                       return GDK_FAIL;
+               memcpy(Tloc(r1, 0), lcand, cnt * SIZEOF_OID);
+               r1->tkey = true;
+               r1->tnokey[0] = r1->tnokey[1] = 0;
+               r1->tsorted = true;
+               r1->tnosorted = 0;
+               if (cnt == 1) {
+                       r1->trevsorted = true;
+                       r1->tnorevsorted = 0;
+               } else {
+                       r1->trevsorted = false;
+                       r1->tnorevsorted = 1;
+               }
+               r1->tseqbase = oid_nil;
+               r1->tnil = false;
+               r1->tnonil = true;
                BATsetcount(r1, cnt);
+               *r1p = r1;
        } else {
                cnt = lend - lstart;
-               HEAPfree(&r1->theap, true);
-               r1->theap.storage = r1->theap.newstorage = STORE_MEM;
-               r1->theap.size = 0;
-               r1->ttype = TYPE_void;
-               r1->tvarsized = true;
-               r1->twidth = 0;
-               r1->tshift = 0;
-               if (BATextend(r1, cnt) != GDK_SUCCEED)
-                       goto bailout;
-               BATsetcount(r1, cnt);
-               BATtseqbase(r1, lstart + l->hseqbase);
+               if ((*r1p = BATdense(0, l->hseqbase + lstart, cnt)) == NULL)
+                       return GDK_FAIL;
        }
-       r1->tnorevsorted = !(r1->trevsorted = BATcount(r1) <= 1);
-       if (r2) {
-               HEAPfree(&r2->theap, true);
-               r2->theap.storage = r2->theap.newstorage = STORE_MEM;
-               r2->theap.size = 0;
-               r2->ttype = TYPE_void;
-               r2->tvarsized = true;
-               r2->twidth = 0;
-               r2->tshift = 0;
-               if (BATextend(r2, cnt) != GDK_SUCCEED)
-                       goto bailout;
-               BATsetcount(r2, cnt);
-               BATtseqbase(r2, oid_nil);
+       if (r2p &&
+           (*r2p = BATconstant(0, TYPE_void, &oid_nil, cnt, TRANSIENT)) == 
NULL) {
+               BBPreclaim(*r1p);
+               *r1p = NULL;
+               return GDK_FAIL;
        }
+       r1 = *r1p;
+       r2 = r2p ? *r2p : NULL;
        ALGODEBUG fprintf(stderr,
                          "#%s(l=%s,r=%s)=(" ALGOBATFMT "," ALGOOPTBATFMT ") " 
LLFMT "us -- nomatch\n",
-                         func,
-                         BATgetId(l), BATgetId(r),
+                         func, BATgetId(l), BATgetId(r),
                          ALGOBATPAR(r1), ALGOOPTBATPAR(r2),
                          GDKusec() - t0);
        return GDK_SUCCEED;
-
-  bailout:
-       BBPreclaim(r1);
-       BBPreclaim(r2);
-       return GDK_FAIL;
 }
 
+/* Implementation of join where there is a single value (possibly
+ * repeated multiple times) on the left.  This means we can use a
+ * point select to find matches in the right column. */
 static gdk_return
-selectjoin(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr,
+selectjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
+          BUN lstart, BUN lend, BUN lcnt,
+          const oid *restrict lcand, const oid *lcandend,
           bool nil_matches, lng t0, bool swapped)
 {
        BATiter li = bat_iterator(l);
        const void *v;
-       const oid *restrict lcand, *lcandend;
-       BUN lstart, lend, lcnt;
        BAT *bn = NULL;
 
        ALGODEBUG fprintf(stderr, "#selectjoin(l=" ALGOBATFMT ","
@@ -313,18 +307,9 @@ selectjoin(BAT *r1, BAT *r2, BAT *l, BAT
                          nil_matches,
                          swapped ? " swapped" : "");
 
-       assert(BATcount(l) > 0);
-       CANDINIT(l, sl, lstart, lend, lcnt, lcand, lcandend);
-       if (lcand)
-               lcnt = lcandend - lcand;
-       else
-               lcnt = lend - lstart;
-       if (lcnt == 0) {
-               return nomatch(r1, r2, l, r, lstart, lend,
-                              lcand, lcandend, false, false,
-                              "selectjoin", t0);
-       }
+       assert(lcnt > 0);
        assert(lcnt == 1 || (l->tsorted && l->trevsorted));
+
        if (lcand) {
                v = BUNtail(li, *lcand - l->hseqbase);
        } else {
@@ -334,24 +319,29 @@ selectjoin(BAT *r1, BAT *r2, BAT *l, BAT
        if (!nil_matches &&
            (*ATOMcompare(l->ttype))(v, ATOMnilptr(l->ttype)) == 0) {
                /* NIL doesn't match anything */
-               return nomatch(r1, r2, l, r, lstart, lend,
+               return nomatch(r1p, r2p, l, r, lstart, lend,
                               lcand, lcandend, false, false,
                               "selectjoin", t0);
        }
 
        bn = BATselect(r, sr, v, NULL, true, true, false);
        if (bn == NULL) {
-               goto bailout;
+               return GDK_FAIL;
        }
        if (BATcount(bn) == 0) {
                BBPunfix(bn->batCacheid);
-               return nomatch(r1, r2, l, r, lstart, lend,
+               return nomatch(r1p, r2p, l, r, lstart, lend,
                               lcand, lcandend, false, false,
                               "selectjoin", t0);
        }
-       if (BATextend(r1, lcnt * BATcount(bn)) != GDK_SUCCEED ||
-           BATextend(r2, lcnt * BATcount(bn)) != GDK_SUCCEED)
-               goto bailout;
+       BAT *r1 = COLnew(0, TYPE_oid, lcnt * BATcount(bn), TRANSIENT);
+       BAT *r2 = COLnew(0, TYPE_oid, lcnt * BATcount(bn), TRANSIENT);
+       if (r1 == NULL || r2 == NULL) {
+               BBPunfix(bn->batCacheid);
+               BBPreclaim(r1);
+               BBPreclaim(r2);
+               return GDK_FAIL;
+       }
 
        r1->tsorted = true;
        r1->trevsorted = lcnt == 1;
@@ -366,47 +356,47 @@ selectjoin(BAT *r1, BAT *r2, BAT *l, BAT
        r2->tnil = false;
        r2->tnonil = true;
        if (BATtdense(bn)) {
-               oid *r1p = (oid *) Tloc(r1, 0);
-               oid *r2p = (oid *) Tloc(r2, 0);
+               oid *o1p = (oid *) Tloc(r1, 0);
+               oid *o2p = (oid *) Tloc(r2, 0);
                oid bno = bn->tseqbase;
                BUN q = BATcount(bn);
 
                if (lcand) {
                        while (lcand < lcandend) {
                                for (BUN p = 0; p < q; p++) {
-                                       *r1p++ = *lcand;
-                                       *r2p++ = bno + p;
+                                       *o1p++ = *lcand;
+                                       *o2p++ = bno + p;
                                }
                                lcand++;
                        }
                } else {
                        while (lstart < lend) {
                                for (BUN p = 0; p < q; p++) {
-                                       *r1p++ = lstart + l->hseqbase;
-                                       *r2p++ = bno + p;
+                                       *o1p++ = lstart + l->hseqbase;
+                                       *o2p++ = bno + p;
                                }
                                lstart++;
                        }
                }
        } else {
-               oid *r1p = (oid *) Tloc(r1, 0);
-               oid *r2p = (oid *) Tloc(r2, 0);
+               oid *o1p = (oid *) Tloc(r1, 0);
+               oid *o2p = (oid *) Tloc(r2, 0);
                const oid *bnp = (const oid *) Tloc(bn, 0);
                BUN q = BATcount(bn);
 
                if (lcand) {
                        while (lcand < lcandend) {
                                for (BUN p = 0; p < q; p++) {
-                                       *r1p++ = *lcand;
-                                       *r2p++ = bnp[p];
+                                       *o1p++ = *lcand;
+                                       *o2p++ = bnp[p];
                                }
                                lcand++;
                        }
                } else {
                        while (lstart < lend) {
                                for (BUN p = 0; p < q; p++) {
-                                       *r1p++ = lstart + l->hseqbase;
-                                       *r2p++ = bnp[p];
+                                       *o1p++ = lstart + l->hseqbase;
+                                       *o2p++ = bnp[p];
                                }
                                lstart++;
                        }
@@ -415,18 +405,13 @@ selectjoin(BAT *r1, BAT *r2, BAT *l, BAT
        BATsetcount(r1, lcnt * BATcount(bn));
        BATsetcount(r2, lcnt * BATcount(bn));
        BBPunfix(bn->batCacheid);
+       *r1p = r1;
+       *r2p = r2;
        ALGODEBUG fprintf(stderr, "#selectjoin(l=%s,r=%s)=(" ALGOBATFMT "," 
ALGOOPTBATFMT ") " LLFMT "us\n",
                          BATgetId(l), BATgetId(r),
                          ALGOBATPAR(r1), ALGOOPTBATPAR(r2),
                          GDKusec() - t0);
        return GDK_SUCCEED;
-
-  bailout:
-       if (bn)
-               BBPunfix(bn->batCacheid);
-       BBPreclaim(r1);
-       BBPreclaim(r2);
-       return GDK_FAIL;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to