Changeset: c7bfa236c711 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c7bfa236c711
Modified Files:
sql/server/rel_optimizer.c
sql/test/SQLancer/Tests/sqlancer11.test
Branch: default
Log Message:
Be carefull when pushing expressions above outer joins. The NOT NULL property
may be lost depending on the side of the outer join
diffs (69 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -6407,6 +6407,8 @@ rel_push_project_up(visitor *v, sql_rel
} else if (e->type == e_column) {
if (has_label(e))
return rel;
+ if (is_right(rel->op) ||
is_full(rel->op))
+ set_has_nil(e);
list_append(exps, e);
} else {
return rel;
@@ -6414,6 +6416,9 @@ rel_push_project_up(visitor *v, sql_rel
}
} else {
exps = rel_projections(v->sql, l, NULL, 1, 1);
+ if (!list_empty(exps) && (is_right(rel->op) ||
is_full(rel->op)))
+ for (n = exps->h ; n ; n = n->next)
+ set_has_nil((sql_exp*)n->data);
}
/* also handle right hand of join */
if (is_join(rel->op) && r->op == op_project && r->l) {
@@ -6429,6 +6434,8 @@ rel_push_project_up(visitor *v, sql_rel
} else if (e->type == e_column) {
if (has_label(e))
return rel;
+ if (is_left(rel->op) ||
is_full(rel->op))
+ set_has_nil(e);
list_append(exps, e);
} else {
return rel;
@@ -6436,6 +6443,9 @@ rel_push_project_up(visitor *v, sql_rel
}
} else if (is_join(rel->op)) {
list *r_exps = rel_projections(v->sql, r, NULL, 1, 1);
+ if (!list_empty(r_exps) && (is_left(rel->op) ||
is_full(rel->op)))
+ for (n = r_exps->h ; n ; n = n->next)
+ set_has_nil((sql_exp*)n->data);
list_merge(exps, r_exps, (fdup)NULL);
}
diff --git a/sql/test/SQLancer/Tests/sqlancer11.test
b/sql/test/SQLancer/Tests/sqlancer11.test
--- a/sql/test/SQLancer/Tests/sqlancer11.test
+++ b/sql/test/SQLancer/Tests/sqlancer11.test
@@ -819,6 +819,7 @@ 7982
7982
7982
7982
+7982
query T rowsort
SELECT ((SELECT DISTINCT 3 FROM t0 AS l2t0) EXCEPT ALL (SELECT 2 FROM t0 AS
l2t0)) IS NULL FROM t1, t2 RIGHT OUTER JOIN (VALUES (UUID
'131b9167-efFa-92FE-523A-5EF2Ca7963a8', 1)) AS sub0 ON false;
@@ -839,6 +840,8 @@ True
True
True
True
+True
+True
query T rowsort
SELECT t1.c2 FROM t1, t2 RIGHT OUTER JOIN (VALUES (UUID
'131b9167-efFa-92FE-523A-5EF2Ca7963a8', ((scale_down(4,
3))&(sql_max(1220354535, -236857972))))) AS sub0 ON ((((NOT
(FALSE))AND("isauuid"(r'*O'))))AND(((r'h')NOT LIKE(r'N'))))
@@ -861,6 +864,7 @@ 7982
7982
7982
7982
+7982
query I rowsort
SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST((((SELECT DISTINCT BLOB ''
FROM t0 AS l2t0, t2 AS l2t2 WHERE TRUE) EXCEPT ALL (SELECT BLOB 'afd907d0A0'
FROM t0 AS l2t0 WHERE TRUE))) IS NULL AS INT) as count FROM t1, t2
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list