Changeset: 4dad2ddcbad5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4dad2ddcbad5
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_unnest.c
        sql/test/subquery/Tests/subquery3.stable.out
Branch: default
Log Message:

fixed endless nesting
fixed unnesting of not all expressions
fixed cardinality of in_func


diffs (122 lines):

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
@@ -229,7 +229,10 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e
 
        if (!a_func) 
                return sql_error(sql, 02, SQLSTATE(42000) "(NOT) IN operator on 
type %s missing", exp_subtype(le)->type->sqlname);
-       return exp_binop(sql->sa, le, vals, a_func);
+       e = exp_binop(sql->sa, le, vals, a_func);
+       if (e)
+               e->card = le->card;
+       return e;
 }
 
 sql_exp *
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
@@ -1026,14 +1026,14 @@ push_up_select_l(mvc *sql, sql_rel *rel)
 }
 
 static sql_rel *
-push_up_join(mvc *sql, sql_rel *rel) 
+push_up_join(mvc *sql, sql_rel *rel, list *ad) 
 {
        /* input rel is dependent join with on the right a project */ 
        if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel)) 
{
                sql_rel *d = rel->l, *j = rel->r;
 
                /* left of rel should be a set */ 
-               if (d && is_distinct_set(sql, d, NULL) && j && (is_join(j->op) 
|| is_semi(j->op))) {
+               if (d && is_distinct_set(sql, d, ad) && j && (is_join(j->op) || 
is_semi(j->op))) {
                        int crossproduct = 0;
                        sql_rel *jl = j->l, *jr = j->r;
                        /* op_join if F(jl) intersect A(D) = empty -> jl join 
(D djoin jr) 
@@ -1131,13 +1131,13 @@ push_up_join(mvc *sql, sql_rel *rel)
 }
 
 static sql_rel *
-push_up_set(mvc *sql, sql_rel *rel) 
+push_up_set(mvc *sql, sql_rel *rel, list *ad) 
 {
        if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel)) 
{
                sql_rel *d = rel->l, *s = rel->r;
 
                /* left of rel should be a set */ 
-               if (d && is_distinct_set(sql, d, NULL) && s && is_set(s->op)) {
+               if (d && is_distinct_set(sql, d, ad) && s && is_set(s->op)) {
                        list *sexps;
                        node *m;
                        sql_rel *sl = s->l, *sr = s->r, *n;
@@ -1272,18 +1272,18 @@ rel_unnest_dependent(mvc *sql, sql_rel *
                                return rel_unnest_dependent(sql, rel);
                        }
 
-                       if (r && is_groupby(r->op) && is_distinct_set(sql, l, 
ad)) { 
+                       if (r && is_groupby(r->op) && need_distinct(l) /*&& 
is_distinct_set(sql, l, ad)*/) { 
                                rel = push_up_groupby(sql, rel, ad);
                                return rel_unnest_dependent(sql, rel);
                        }
 
                        if (r && (is_join(r->op) || is_semi(r->op)) && 
is_distinct_set(sql, l, ad)) {
-                               rel = push_up_join(sql, rel);
+                               rel = push_up_join(sql, rel, ad);
                                return rel_unnest_dependent(sql, rel);
                        }
 
-                       if (r && is_set(r->op) && is_distinct_set(sql, l, ad)) {
-                               rel = push_up_set(sql, rel);
+                       if (r && is_set(r->op) && (!is_left(rel->op) && 
is_distinct_set(sql, l, ad))) {
+                               rel = push_up_set(sql, rel, ad);
                                return rel_unnest_dependent(sql, rel);
                        }
 
diff --git a/sql/test/subquery/Tests/subquery3.stable.out 
b/sql/test/subquery/Tests/subquery3.stable.out
--- a/sql/test/subquery/Tests/subquery3.stable.out
+++ b/sql/test/subquery/Tests/subquery3.stable.out
@@ -211,6 +211,44 @@ stdout of test 'subquery3` in directory 
 [ 2,   2       ]
 [ 2,   2       ]
 [ 2,   2       ]
+#SELECT
+#    SUM(t1.col6) <> ANY (SELECT t1.col7 INTERSECT SELECT t1.col6)
+#FROM another_T t1
+#GROUP BY t1.col7, t1.col6;
+% .%37 # table_name
+% %37 # name
+% boolean # type
+% 5 # length
+[ false        ]
+[ false        ]
+[ false        ]
+[ false        ]
+#SELECT
+#    CASE WHEN t1.col1 IN (SELECT 1 FROM tbl_ProductSales tp LEFT JOIN 
another_T t2 ON tp.ColID = t1.col1) THEN 1 ELSE 2 END
+#FROM another_T t1
+#GROUP BY t1.col1;
+% .%25 # table_name
+% %25 # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+[ 2    ]
+[ 2    ]
+[ 2    ]
+#SELECT
+#    1
+#FROM another_T t1
+#GROUP BY t1.col1, t1.col2, t1.col4
+#HAVING (t1.col1 = ANY (SELECT MAX(ColID + col2) FROM tbl_ProductSales)) NOT 
IN 
+#    ((SELECT NOT EXISTS (SELECT t1.col2 FROM tbl_ProductSales WHERE 
tbl_ProductSales.ColID = t1.col1)) UNION ALL
+#     (SELECT NOT t1.col1 BETWEEN (SELECT MAX(t1.col7) EXCEPT SELECT tp.ColID 
FROM tbl_ProductSales tp) AND (SELECT MIN(t1.col5) EXCEPT SELECT t1.col2)));
+% . # table_name
+% single_value # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+[ 1    ]
+[ 1    ]
 #DROP TABLE tbl_ProductSales;
 #DROP TABLE another_T;
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to