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

Reply via email to