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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list