Changeset: a44978a85641 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a44978a85641
Branch: default
Log Message:
merge with distinct_from
diffs (truncated from 345 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
@@ -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/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1730,7 +1730,7 @@ rel_select_push_compare_exp_down(mvc *sq
}
static sql_rel *
-rel_compare_exp_(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs,
sql_exp *rs2, int type, int anti, int quantifier, int f, int symmetric)
+rel_compare_exp_(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs,
sql_exp *rs2, int type, int anti, int quantifier, int f, int symmetric, int
is_semantics)
{
mvc *sql = query->sql;
sql_exp *e = NULL;
@@ -1758,6 +1758,7 @@ rel_compare_exp_(sql_query *query, sql_r
if (rel_convert_types(sql, rel, rel, &ls, &rs, 1,
type_equal_no_any) < 0)
return NULL;
e = exp_compare(sql->sa, ls, rs, type);
+ if (is_semantics) set_semantics(e);
} else {
assert(rs2);
if (rel_convert_types(sql, rel, rel, &ls, &rs, 1,
type_equal_no_any) < 0)
@@ -1783,7 +1784,7 @@ rel_compare_exp_(sql_query *query, sql_r
}
static sql_rel *
-rel_compare_exp(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, char
*compare_op, int reduce, int quantifier, int need_not, int f)
+rel_compare_exp(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, char
*compare_op, int reduce, int quantifier, int need_not, int f, int is_semantics)
{
mvc *sql = query->sql;
comp_type type = cmp_equal;
@@ -1816,11 +1817,11 @@ rel_compare_exp(sql_query *query, sql_re
}
type = compare_str2type(compare_op);
assert(type != cmp_filter);
- return rel_compare_exp_(query, rel, ls, rs, NULL, type, need_not,
quantifier, f, 0);
+ return rel_compare_exp_(query, rel, ls, rs, NULL, type, need_not,
quantifier, f, 0, is_semantics);
}
static sql_rel *
-rel_compare(sql_query *query, sql_rel *rel, symbol *sc, symbol *lo, symbol
*ro, char *compare_op, int f, exp_kind k, int quantifier)
+rel_compare(sql_query *query, sql_rel *rel, symbol *sc, symbol *lo, symbol
*ro, char *compare_op, int f, exp_kind k, int quantifier, int is_semantics)
{
mvc *sql = query->sql;
sql_exp *rs = NULL, *ls;
@@ -1884,7 +1885,7 @@ rel_compare(sql_query *query, sql_rel *r
return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000)
"SELECT: cannot use non GROUP BY column '%s.%s' in query results without an
aggregate function", exp_relname(rs), exp_name(rs));
return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT:
cannot use non GROUP BY column in query results without an aggregate function");
}
- return rel_compare_exp(query, rel, ls, rs, compare_op, k.reduce,
quantifier, need_not, f);
+ return rel_compare_exp(query, rel, ls, rs, compare_op, k.reduce,
quantifier, need_not, f, is_semantics);
}
static sql_exp*
@@ -2703,11 +2704,19 @@ rel_logical_exp(sql_query *query, sql_re
symbol *ro = n->next->next->data.sym;
char *compare_op = n->next->data.sval;
int quantifier = 0;
+ int is_semantics = 0;
if (n->next->next->next)
quantifier = n->next->next->next->data.i_val + 1;
- assert(quantifier == 0 || quantifier == 1 || quantifier == 2);
- return rel_compare(query, rel, sc, lo, ro, compare_op, f, ek,
quantifier);
+ assert(quantifier == 0 || quantifier == 1 || quantifier == 2 ||
quantifier == 3 || quantifier == 4);
+
+ if (quantifier >= 3) {
+ quantifier = 0;
+ is_semantics = 1;
+ }
+
+ /* [NOT] DISTINCT FROM */
+ return rel_compare(query, rel, sc, lo, ro, compare_op, f, ek,
quantifier, is_semantics);
}
/* Set Member ship */
case SQL_IN:
@@ -2777,7 +2786,7 @@ rel_logical_exp(sql_query *query, sql_re
(re2 = exp_check_type(sql, &super, rel, re2, type_equal))
== NULL)
return NULL;
- return rel_compare_exp_(query, rel, le, re1, re2, 3, sc->token
== SQL_NOT_BETWEEN ? 1 : 0, 0, f, symmetric);
+ return rel_compare_exp_(query, rel, le, re1, re2, 3, sc->token
== SQL_NOT_BETWEEN ? 1 : 0, 0, f, symmetric, 0);
}
case SQL_IS_NULL:
case SQL_IS_NOT_NULL:
@@ -5457,7 +5466,7 @@ join_on_column_name(sql_query *query, sq
return sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000) "NATURAL JOIN: common column name '%s' appears more than once
in left table", rname);
found = 1;
- if (!(rel = rel_compare_exp(query, rel, le, re, "=",
TRUE, 0, 0, 0)))
+ if (!(rel = rel_compare_exp(query, rel, le, re, "=",
TRUE, 0, 0, 0, 0)))
return NULL;
if (full) {
sql_exp *cond = rel_unop_(sql, rel, le, "sys",
"isnull", card_value);
@@ -5872,7 +5881,7 @@ rel_joinquery_(sql_query *query, symbol
return NULL;
if (!ls || !rs)
return sql_error(sql, 02, SQLSTATE(42000)
"JOIN: tables '%s' and '%s' do not have a matching column '%s'",
rel_name(t1)?rel_name(t1):"", rel_name(t2)?rel_name(t2):"", nm);
- if (!(rel = rel_compare_exp(query, rel, ls, rs, "=",
TRUE, 0, 0, 0)))
+ if (!(rel = rel_compare_exp(query, rel, ls, rs, "=",
TRUE, 0, 0, 0, 0)))
return NULL;
if (op != op_join) {
if (!(cond = rel_unop_(sql, rel, ls, "sys",
"isnull", card_value)))
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -3919,7 +3919,7 @@ comparison_predicate:
| pred_exp IS DISTINCT FROM pred_exp
{ dlist *l = L();
append_symbol(l, $1);
- append_string(l, sa_strdup(SA, "="));
+ append_string(l, sa_strdup(SA, "<>"));
append_symbol(l, $5);
append_int(l, 3);
$$ = _symbol_create_list(SQL_COMPARE, l ); }
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,30 @@ NULL
NULL
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]