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

Reply via email to