Changeset: 5583c58b2884 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5583c58b2884
Modified Files:
gdk/gdk_atoms.c
sql/server/rel_exp.c
sql/server/rel_unnest.c
sql/test/SQLancer/Tests/sqlancer18.test
Branch: Jul2021
Log Message:
small fixes for 'in' queries between empty sub queries
for now map -0 into 0 for floats (awaiting better solution)
in case of joins with project left, push some expressions down (instead of up)
solving
references to these expressions in the join expression.
diffs (125 lines):
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -1150,6 +1150,8 @@ fltFromStr(const char *src, size_t *len,
} else {
while (src[n] && GDKisspace(src[n]))
n++;
+ if (f == -0)
+ f = 0;
**dst = (flt) f;
}
}
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2050,7 +2050,7 @@ exps_rel_get_rel(sql_allocator *sa, list
if (exp_has_rel(e)) {
if (!(r = exp_rel_get_rel(sa, e)))
return NULL;
- xp = xp ? rel_crossproduct(sa, xp, r, op_join) : r;
+ xp = xp ? rel_crossproduct(sa, xp, r, op_full) : r;
}
}
return xp;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -824,7 +824,7 @@ push_up_project(mvc *sql, sql_rel *rel,
}
/* input rel is dependent outerjoin with on the right a project, we
first try to push inner side expressions down (because these cannot be pushed
up) */
- if (rel && is_outerjoin(rel->op) && is_dependent(rel)) {
+ if (rel && is_join(rel->op) && is_dependent(rel)) {
sql_rel *r = rel->r;
/* find constant expressions and move these down */
@@ -834,11 +834,11 @@ push_up_project(mvc *sql, sql_rel *rel,
list *cexps = NULL;
sql_rel *l = r->l;
- if (l && is_select(l->op) && !rel_is_ref(l)) {
+ if (l && (is_select(l->op) || l->op == op_join) &&
!rel_is_ref(l)) {
for(n=r->exps->h; n; n=n->next) {
sql_exp *e = n->data;
- if (exp_is_atom(e) ||
rel_find_exp(l,e)) { /* move down */
+ if (exp_is_atom(e) ||
rel_find_exp(l->l,e)) { /* move down */
if (!cexps)
cexps =
sa_list(sql->sa);
append(cexps, e);
@@ -2498,6 +2498,7 @@ rel_union_exps(mvc *sql, sql_exp **l, li
} else {
u = rel_setop(sql->sa, u, sq, op_union);
rel_setop_set_exps(sql, u, exps, false);
+ set_distinct(u);
set_processed(u);
}
exps = rel_projections(sql, sq, NULL, 1/*keep names */, 1);
@@ -2648,11 +2649,16 @@ rewrite_anyequal(visitor *v, sql_rel *re
if (sq) {
sql_rel *l = NULL, *rewrite = NULL;
- (void)rewrite_inner(sql, rel, lsq,
op_join, &rewrite);
+ if (rsq && lsq->card == CARD_ATOM &&
rsq->card == CARD_ATOM) { /* add project true */
+ lsq = rel_crossproduct(sql->sa,
lsq, rsq, op_full);
+ lsq = rel_crossproduct(sql->sa,
rel_project_exp(sql->sa, exp_atom_bool(sql->sa, 1)), lsq, op_left);
+ rsq = 0;
+ }
+ (void)rewrite_inner(sql, rel, lsq,
rel->card <= CARD_ATOM?op_left:op_join, &rewrite);
if (is_left(rewrite->op))
reset_has_nil(rewrite, le);
l = rel->l;
- if (l && on_right && !is_join(l->op))
+ if (l && on_right && (!is_join(l->op)
|| (is_project(rel->op) && lsq->card <= CARD_ATOM && rsq->card <= CARD_ATOM)))
on_right = 0;
}
if (rsq) {
@@ -2717,7 +2723,7 @@ rewrite_anyequal(visitor *v, sql_rel *re
} else {
if (lsq) {
sql_rel *rewrite = NULL;
- (void)rewrite_inner(sql, rel, lsq,
op_join, &rewrite);
+ (void)rewrite_inner(sql, rel, lsq,
rel->card<=CARD_ATOM?op_left:op_join, &rewrite);
if (is_left(rewrite->op))
reset_has_nil(rewrite, le);
}
diff --git a/sql/test/SQLancer/Tests/sqlancer18.test
b/sql/test/SQLancer/Tests/sqlancer18.test
--- a/sql/test/SQLancer/Tests/sqlancer18.test
+++ b/sql/test/SQLancer/Tests/sqlancer18.test
@@ -24,7 +24,7 @@ CREATE TABLE "t1" ("c2" BIGINT NOT NULL,
statement ok rowcount 4
INSERT INTO "t1" VALUES (69), (-12), (9), (0)
-query I rowsort
+query T rowsort
SELECT -3 < least((SELECT 1 WHERE FALSE), (SELECT DISTINCT 2 FROM t1)) FROM t1
----
True
@@ -40,7 +40,7 @@ 0
69
9
-query I rowsort
+query T rowsort
SELECT least((SELECT 1 WHERE FALSE), (SELECT DISTINCT 2 FROM t1)) > -3 FROM t1
----
True
@@ -69,7 +69,7 @@ statement ok rowcount 9
INSERT INTO "t0" VALUES (INTERVAL '6' SECOND),(INTERVAL '9' SECOND),(INTERVAL
'1' SECOND),
(INTERVAL '0' SECOND),(INTERVAL '9' SECOND),(INTERVAL '4' SECOND),(INTERVAL
'6' SECOND),(INTERVAL '1' SECOND),(NULL)
-query I rowsort
+query T rowsort
SELECT (SELECT 2 WHERE FALSE) = ANY(SELECT 3 WHERE FALSE)
----
False
@@ -257,7 +257,7 @@ 135
query R rowsort
SELECT sub0.c2 FROM t2 JOIN (SELECT DISTINCT t2.c2, 3 FROM t2) AS sub0(c2,c3)
on t2.c2 = sub0.c2
----
-135 values hashing to e55d26263a0004ee5457d82440cc2577
+135 values hashing to 39898748a4604c294a5bcb3435b482a0
statement ok
ROLLBACK
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list