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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list