Changeset: 988026412964 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/988026412964
Modified Files:
gdk/gdk_join.c
sql/test/2024/Tests/distinct_from.test
sql/test/2024/Tests/groupby_primary_key_project_unique_key.test
Branch: distinct_from
Log Message:
Implemented "nil_matches" for thetajoin when condition is not "=".
diffs (224 lines):
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3697,7 +3697,8 @@ joincost(BAT *r, BUN lcount, struct cand
#define MASK_NE (MASK_LT | MASK_GT)
static gdk_return
-thetajoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int opcode,
BUN estimate, const char *reason, lng t0)
+thetajoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT *sl, BAT *sr, int opcode,
+ BUN estimate, bool nil_matches, const char *reason, lng t0)
{
struct canditer lci, rci;
const char *lvals, *rvals;
@@ -3737,23 +3738,29 @@ thetajoin(BAT **r1p, BAT **r2p, BAT *l,
if (BATtvoid(l)) {
if (!BATtdensebi(&li)) {
- /* trivial: nils don't match anything */
- bat_iterator_end(&li);
- bat_iterator_end(&ri);
- return nomatch(r1p, r2p, NULL, l, r, &lci,
- 0, false, false, __func__, t0);
+ if (!nil_matches) {
+ /* trivial: nils don't match anything */
+ bat_iterator_end(&li);
+ bat_iterator_end(&ri);
+ return nomatch(r1p, r2p, NULL, l, r, &lci,
+ 0, false, false, __func__, t0);
+ }
+ } else {
+ loff = (lng) l->tseqbase - (lng) l->hseqbase;
}
- loff = (lng) l->tseqbase - (lng) l->hseqbase;
}
if (BATtvoid(r)) {
if (!BATtdensebi(&ri)) {
- /* trivial: nils don't match anything */
- bat_iterator_end(&li);
- bat_iterator_end(&ri);
- return nomatch(r1p, r2p, NULL, l, r, &lci,
- 0, false, false, __func__, t0);
+ if (!nil_matches) {
+ /* trivial: nils don't match anything */
+ bat_iterator_end(&li);
+ bat_iterator_end(&ri);
+ return nomatch(r1p, r2p, NULL, l, r, &lci,
+ 0, false, false, __func__, t0);
+ }
+ } else {
+ roff = (lng) r->tseqbase - (lng) r->hseqbase;
}
- roff = (lng) r->tseqbase - (lng) r->hseqbase;
}
BUN maxsize = joininitresults(r1p, r2p, NULL, lci.ncand, rci.ncand,
false, false,
@@ -3782,18 +3789,18 @@ thetajoin(BAT **r1p, BAT **r2p, BAT *l,
lo = canditer_next(&lci);
if (lvals)
vl = VALUE(l, lo - l->hseqbase);
- else
+ else if (!BATtdensebi(&li))
lval = (oid) ((lng) lo + loff);
nr = 0;
- if (cmp(vl, nil) != 0) {
+ if (nil_matches || cmp(vl, nil) != 0) {
canditer_reset(&rci);
TIMEOUT_LOOP(rci.ncand, qry_ctx) {
ro = canditer_next(&rci);
if (rvals)
vr = VALUE(r, ro - r->hseqbase);
- else
+ else if (!BATtdensebi(&ri))
rval = (oid) ((lng) ro + roff);
- if (cmp(vr, nil) == 0)
+ if (!nil_matches && cmp(vr, nil) == 0)
continue;
c = cmp(vl, vr);
if (!((opcode & MASK_LT && c < 0) ||
@@ -4437,7 +4444,7 @@ BATthetajoin(BAT **r1p, BAT **r2p, BAT *
if (joinparamcheck(l, r, NULL, sl, sr, __func__) != GDK_SUCCEED)
return GDK_FAIL;
- return thetajoin(r1p, r2p, l, r, sl, sr, opcode, estimate,
+ return thetajoin(r1p, r2p, l, r, sl, sr, opcode, estimate, nil_matches,
__func__, t0);
}
@@ -5063,14 +5070,14 @@ BATrangejoin(BAT **r1p, BAT **r2p, BAT *
if (!anti)
return nomatch(r1p, r2p, NULL, l, rl, &lci, 0, false,
false,
__func__, t0);
- return thetajoin(r1p, r2p, l, rh, sl, sr, MASK_GT, estimate,
+ return thetajoin(r1p, r2p, l, rh, sl, sr, MASK_GT, estimate,
false,
__func__, t0);
}
if (rh->ttype == TYPE_void && is_oid_nil(rh->tseqbase)) {
if (!anti)
return nomatch(r1p, r2p, NULL, l, rl, &lci, 0, false,
false,
__func__, t0);
- return thetajoin(r1p, r2p, l, rl, sl, sr, MASK_LT, estimate,
+ return thetajoin(r1p, r2p, l, rl, sl, sr, MASK_LT, estimate,
false,
__func__, t0);
}
diff --git a/sql/test/2024/Tests/distinct_from.test
b/sql/test/2024/Tests/distinct_from.test
--- a/sql/test/2024/Tests/distinct_from.test
+++ b/sql/test/2024/Tests/distinct_from.test
@@ -1,4 +1,3 @@
-
query I nosort
SELECT 10 IS NOT DISTINCT FROM 20
----
@@ -9,7 +8,6 @@ SELECT 10 IS DISTINCT FROM 20
----
1
-
query I nosort
SELECT 10 IS DISTINCT FROM NULL
----
@@ -44,56 +42,56 @@ statement ok
create table foo(s) as values (10), (20), (NULL)
query I nosort
-select s IS NOT DISTINCT FROM 20 FROM foo;
+select s IS NOT DISTINCT FROM 20 FROM foo
----
0
1
0
query I nosort
-select s IS DISTINCT FROM 20 FROM foo;
+select s IS DISTINCT FROM 20 FROM foo
----
1
0
1
query I nosort
-select s IS NOT DISTINCT FROM NULL FROM foo;
+select s IS NOT DISTINCT FROM NULL FROM foo
----
0
0
1
query I nosort
-select s IS DISTINCT FROM NULL FROM foo;
+select s IS DISTINCT FROM NULL FROM foo
----
1
1
0
query I nosort
-select 20 IS NOT DISTINCT FROM s FROM foo;
+select 20 IS NOT DISTINCT FROM s FROM foo
----
0
1
0
query I nosort
-select 20 IS DISTINCT FROM s FROM foo;
+select 20 IS DISTINCT FROM s FROM foo
----
1
0
1
query I nosort
-select NULL IS NOT DISTINCT FROM s FROM foo;
+select NULL IS NOT DISTINCT FROM s FROM foo
----
0
0
1
query I nosort
-select NULL IS DISTINCT FROM s FROM foo;
+select NULL IS DISTINCT FROM s FROM foo
----
1
1
@@ -141,3 +139,22 @@ NULL
NULL
0
1
+
+query II rowsort
+select foo.s, bar.s from foo, bar where foo.s is distinct from bar.s
+----
+10
+20
+10
+30
+10
+NULL
+20
+30
+20
+NULL
+NULL
+20
+NULL
+30
+
diff --git a/sql/test/2024/Tests/groupby_primary_key_project_unique_key.test
b/sql/test/2024/Tests/groupby_primary_key_project_unique_key.test
--- a/sql/test/2024/Tests/groupby_primary_key_project_unique_key.test
+++ b/sql/test/2024/Tests/groupby_primary_key_project_unique_key.test
@@ -54,10 +54,11 @@ 600
statement error
SELECT product.product_id, sum(product_part.num) as sum_num
FROM
- (SELECT * FROM product UNION ALL VALUES (1, 'telephone5',
'telephone5')) AS product
+ (SELECT * FROM product UNION ALL VALUES (1, 'telephone5',
'telephone5')) AS product
JOIN
product_part
ON product.product_id = product_part.product_id
GROUP BY product.product_id
ORDER BY product.product_code, product.product_id
----
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]