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