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