Changeset: 581273b0c613 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=581273b0c613
Added Files:
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.sql
Modified Files:
gdk/gdk_join.c
gdk/gdk_select.c
sql/test/BugTracker-2018/Tests/All
sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:
Merge with Mar2018 branch.
diffs (truncated from 387 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
@@ -295,6 +295,163 @@ nomatch(BAT *r1, BAT *r2, BAT *l, BAT *r
return GDK_FAIL;
}
+static gdk_return
+selectjoin(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr,
+ 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=%s#" BUNFMT "[%s]%s%s%s,"
+ "r=%s#" BUNFMT "[%s]%s%s%s,sl=%s#" BUNFMT "%s%s%s,"
+ "sr=%s#" BUNFMT "%s%s%s,nil_matches=%d)%s\n",
+ BATgetId(l), BATcount(l), ATOMname(l->ttype),
+ l->tsorted ? "-sorted" : "",
+ l->trevsorted ? "-revsorted" : "",
+ l->tkey ? "-key" : "",
+ BATgetId(r), BATcount(r), ATOMname(r->ttype),
+ r->tsorted ? "-sorted" : "",
+ r->trevsorted ? "-revsorted" : "",
+ r->tkey ? "-key" : "",
+ sl ? BATgetId(sl) : "NULL", sl ? BATcount(sl) : 0,
+ sl && sl->tsorted ? "-sorted" : "",
+ sl && sl->trevsorted ? "-revsorted" : "",
+ sl && sl->tkey ? "-key" : "",
+ sr ? BATgetId(sr) : "NULL", sr ? BATcount(sr) : 0,
+ sr && sr->tsorted ? "-sorted" : "",
+ sr && sr->trevsorted ? "-revsorted" : "",
+ sr && sr->tkey ? "-key" : "",
+ 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 == 1 || (l->tsorted && l->trevsorted));
+ if (lcand) {
+ v = BUNtail(li, *lcand - l->hseqbase);
+ } else {
+ v = BUNtail(li, lstart);
+ }
+
+ if (!nil_matches &&
+ (*ATOMcompare(l->ttype))(v, ATOMnilptr(l->ttype)) == 0) {
+ /* NIL doesn't match anything */
+ return nomatch(r1, r2, l, r, lstart, lend,
+ lcand, lcandend, false, false,
+ "selectjoin", t0);
+ }
+
+ bn = BATselect(r, sr, v, NULL, true, true, false);
+ if (bn == NULL) {
+ goto bailout;
+ }
+ if (BATcount(bn) == 0) {
+ BBPunfix(bn->batCacheid);
+ return nomatch(r1, r2, 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;
+
+ r1->tsorted = true;
+ r1->trevsorted = lcnt == 1;
+ r1->tseqbase = BATcount(bn) == 1 && lcand == NULL ? l->hseqbase +
lstart : oid_nil;
+ r1->tkey = BATcount(bn) == 1;
+ r1->tnil = false;
+ r1->tnonil = true;
+ r2->tsorted = lcnt == 1 || BATcount(bn) == 1;
+ r2->trevsorted = BATcount(bn) == 1;
+ r2->tseqbase = lcnt == 1 && BATtdense(bn) ? bn->tseqbase : oid_nil;
+ r2->tkey = lcnt == 1;
+ r2->tnil = false;
+ r2->tnonil = true;
+ if (BATtdense(bn)) {
+ oid *r1p = (oid *) Tloc(r1, 0);
+ oid *r2p = (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;
+ }
+ lcand++;
+ }
+ } else {
+ while (lstart < lend) {
+ for (BUN p = 0; p < q; p++) {
+ *r1p++ = lstart + l->hseqbase;
+ *r2p++ = bno + p;
+ }
+ lstart++;
+ }
+ }
+ } else {
+ oid *r1p = (oid *) Tloc(r1, 0);
+ oid *r2p = (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];
+ }
+ lcand++;
+ }
+ } else {
+ while (lstart < lend) {
+ for (BUN p = 0; p < q; p++) {
+ *r1p++ = lstart + l->hseqbase;
+ *r2p++ = bnp[p];
+ }
+ lstart++;
+ }
+ }
+ }
+ BATsetcount(r1, lcnt * BATcount(bn));
+ BATsetcount(r2, lcnt * BATcount(bn));
+ BBPunfix(bn->batCacheid);
+ ALGODEBUG fprintf(stderr,
"#selectjoin(l=%s,r=%s)=(%s#"BUNFMT"%s%s%s%s,%s#"BUNFMT"%s%s%s%s) " LLFMT
"us\n",
+ BATgetId(l), BATgetId(r),
+ BATgetId(r1), BATcount(r1),
+ r1->tsorted ? "-sorted" : "",
+ r1->trevsorted ? "-revsorted" : "",
+ BATtdense(r1) ? "-dense" : "",
+ r1->tkey ? "-key" : "",
+ r2 ? BATgetId(r2) : "--", r2 ? BATcount(r2) : 0,
+ r2 && r2->tsorted ? "-sorted" : "",
+ r2 && r2->trevsorted ? "-revsorted" : "",
+ r2 && BATtdense(r2) ? "-dense" : "",
+ r2 && r2->tkey ? "-key" : "",
+ GDKusec() - t0);
+ return GDK_SUCCEED;
+
+ bailout:
+ if (bn)
+ BBPunfix(bn->batCacheid);
+ BBPreclaim(r1);
+ BBPreclaim(r2);
+ return GDK_FAIL;
+}
+
#if SIZEOF_OID == SIZEOF_INT
#define binsearch_oid(indir, offset, vals, lo, hi, v, ordering, last)
binsearch_int(indir, offset, (const int *) vals, lo, hi, (int) (v), ordering,
last)
#endif
@@ -3598,9 +3755,9 @@ fetchjoin(BAT *r1, BAT *r2, BAT *l, BAT
/* Make the implementation choices for various left joins. */
static gdk_return
-subleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
- bool nil_matches, bool nil_on_miss, bool semi, bool only_misses,
- BUN estimate, const char *name, lng t0)
+leftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr,
+ bool nil_matches, bool nil_on_miss, bool semi, bool only_misses,
+ BUN estimate, const char *name, lng t0)
{
BAT *r1, *r2 = NULL;
BUN lcount, rcount, maxsize;
@@ -3633,7 +3790,13 @@ subleftjoin(BAT **r1p, BAT **r2p, BAT *l
*r2p = r2;
if (maxsize == 0)
return GDK_SUCCEED;
- if (BATtdense(r) && (sr == NULL || BATtdense(sr)) && lcount > 0 &&
rcount > 0) {
+ if (!nil_on_miss && !semi && !only_misses &&
+ (lcount == 1 || (BATordered(l) && BATordered_rev(l)))) {
+ /* single value to join, use select */
+ return selectjoin(r1, r2, l, r, sl, sr, nil_matches,
+ t0, false);
+ } else 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,
nil_on_miss, only_misses, t0);
@@ -3656,9 +3819,9 @@ subleftjoin(BAT **r1p, BAT **r2p, BAT *l
gdk_return
BATleftjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int
nil_matches, BUN estimate)
{
- return subleftjoin(r1p, r2p, l, r, sl, sr, nil_matches,
- false, false, false, estimate, "BATleftjoin",
- GDKdebug & ALGOMASK ? GDKusec() : 0);
+ return leftjoin(r1p, r2p, l, r, sl, sr, nil_matches,
+ false, false, false, estimate, "BATleftjoin",
+ GDKdebug & ALGOMASK ? GDKusec() : 0);
}
/* Performs a left outer join over l and r. Returns two new, aligned,
@@ -3669,9 +3832,9 @@ BATleftjoin(BAT **r1p, BAT **r2p, BAT *l
gdk_return
BATouterjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int
nil_matches, BUN estimate)
{
- return subleftjoin(r1p, r2p, l, r, sl, sr, nil_matches,
- true, false, false, estimate, "BATouterjoin",
- GDKdebug & ALGOMASK ? GDKusec() : 0);
+ return leftjoin(r1p, r2p, l, r, sl, sr, nil_matches,
+ true, false, false, estimate, "BATouterjoin",
+ GDKdebug & ALGOMASK ? GDKusec() : 0);
}
/* Perform a semi-join over l and r. Returns two new, aligned, bats
@@ -3680,9 +3843,9 @@ BATouterjoin(BAT **r1p, BAT **r2p, BAT *
gdk_return
BATsemijoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int
nil_matches, BUN estimate)
{
- return subleftjoin(r1p, r2p, l, r, sl, sr, nil_matches,
- false, true, false, estimate, "BATsemijoin",
- GDKdebug & ALGOMASK ? GDKusec() : 0);
+ return leftjoin(r1p, r2p, l, r, sl, sr, nil_matches,
+ false, true, false, estimate, "BATsemijoin",
+ GDKdebug & ALGOMASK ? GDKusec() : 0);
}
/* Return the difference of l and r. The result is a BAT with the
@@ -3694,9 +3857,9 @@ BATdiff(BAT *l, BAT *r, BAT *sl, BAT *sr
{
BAT *bn;
- if (subleftjoin(&bn, NULL, l, r, sl, sr, nil_matches,
- false, false, true, estimate, "BATdiff",
- GDKdebug & ALGOMASK ? GDKusec() : 0) == GDK_SUCCEED)
+ if (leftjoin(&bn, NULL, l, r, sl, sr, nil_matches,
+ false, false, true, estimate, "BATdiff",
+ GDKdebug & ALGOMASK ? GDKusec() : 0) == GDK_SUCCEED)
return bn;
return NULL;
}
@@ -3823,7 +3986,13 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
rpcount = BATcount(r);
rhash = BATcheckhash(r);
}
- if (BATtdense(r) && (sr == NULL || BATtdense(sr))) {
+ if (lcount == 1 || (BATordered(l) && BATordered_rev(l))) {
+ /* single value to join, use select */
+ return selectjoin(r1, r2, l, r, sl, sr, nil_matches, t0, false);
+ } else if (rcount == 1 || (BATordered(r) && BATordered_rev(r))) {
+ /* single value to join, use select */
+ return selectjoin(r2, r1, r, l, sr, sl, nil_matches, t0, true);
+ } else if (BATtdense(r) && (sr == NULL || BATtdense(sr))) {
/* use special implementation for dense right-hand side */
return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0);
} else if (BATtdense(l) && (sl == NULL || BATtdense(sl))) {
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1031,7 +1031,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
* v != nil, v1 != nil, v2 != nil, v1 < v2.
* tl th li hi anti result list of OIDs for values
* -----------------------------------------------------------------
- * nil NULL true ignored false x = nil (only way to get nil)
+ * nil NULL true ignored false x == nil (only way to get nil)
* nil NULL false ignored false NOTHING
* nil NULL ignored ignored true x != nil
* nil nil ignored ignored false x != nil
diff --git a/sql/test/BugTracker-2018/Tests/All
b/sql/test/BugTracker-2018/Tests/All
--- a/sql/test/BugTracker-2018/Tests/All
+++ b/sql/test/BugTracker-2018/Tests/All
@@ -37,3 +37,4 @@ sqlitelogictest-nested-case.Bug-6554
sqlitelogictest-complex-case-extra-columns.Bug-6555
sqlitelogictest-coalesce-division-by-zero.Bug-6556
sqlitelogictest-having-not-null-not-in.Bug-6557
+sqlitelogictest-groupby-having-in.Bug-6560
diff --git
a/sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.sql
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.sql
new file mode 100644
--- /dev/null
+++
b/sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.sql
@@ -0,0 +1,4 @@
+CREATE TABLE tab1(col0 INTEGER, col1 INTEGER, col2 INTEGER);
+INSERT INTO tab1 VALUES(22,6,8), (28,57,45), (82,44,71);
+SELECT + - col2 FROM tab1 AS cor0 GROUP BY col0, col2 HAVING ( col2 / + 15 + +
88 ) IN ( AVG ( col2 ) );
+DROP TABLE tab1;
diff --git a/sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
b/sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
--- a/sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
+++ b/sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
@@ -5727,7 +5727,7 @@ commit;
# 13:50:54 >
#select count(*) from testschema.smallstring;
-% testschema.L4 # table_name
+% testschema.L3 # table_name
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list