Changeset: d906a18d5a0f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d906a18d5a0f
Modified Files:
        sql/server/rel_optimizer.c
Branch: default
Log Message:

Reset nil flag only if optimizer pushes up projection successfully


diffs (89 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
@@ -6312,6 +6312,7 @@ rel_push_project_up(visitor *v, sql_rel 
                sql_rel *l = rel->l;
                sql_rel *r = rel->r;
                sql_rel *t;
+               int nlexps = 0, i = 0;
 
                /* Don't rewrite refs, non projections or constant or
                   order by projections  */
@@ -6334,14 +6335,12 @@ rel_push_project_up(visitor *v, sql_rel 
                        for (n = l->exps->h; n; n = n->next) {
                                sql_exp *e = n->data;
 
-                               /* we cannot rewrite projection with atomic 
values from outer joins */
+                               /* we cannot rewrite projection with atomic 
values from outer joins */
                                if (is_column(e->type) && exp_is_atom(e) && 
!(is_right(rel->op) || is_full(rel->op))) {
                                        list_append(exps, e);
                                } 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;
@@ -6349,10 +6348,8 @@ 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);
-               }
+               }
+               nlexps = list_length(exps);
                /* also handle right hand of join */
                if (is_join(rel->op) && r->op == op_project && r->l) {
                        /* Here we also check all expressions of r like above
@@ -6361,14 +6358,12 @@ rel_push_project_up(visitor *v, sql_rel 
                        for (n = r->exps->h; n; n = n->next) {
                                sql_exp *e = n->data;
 
-                               /* we cannot rewrite projection with atomic 
values from outer joins */
+                               /* we cannot rewrite projection with atomic 
values from outer joins */
                                if (is_column(e->type) && exp_is_atom(e) && 
!(is_left(rel->op) || is_full(rel->op))) {
                                        list_append(exps, e);
                                } 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;
@@ -6376,10 +6371,6 @@ 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);
                }
                /* Here we should check for ambigious names ? */
@@ -6460,6 +6451,21 @@ rel_push_project_up(visitor *v, sql_rel 
                }
                /* Done, ie introduce new project */
                exps_fix_card(exps, rel->card);
+               /* Fix nil flag */
+               if (!list_empty(exps)) {
+                       for (n = exps->h ; n && i < nlexps ; n = n->next, i++) {
+                               sql_exp *e = n->data;
+
+                               if (is_right(rel->op) || is_full(rel->op))
+                                       set_has_nil(e);
+                       }
+                       for (; n ; n = n->next) {
+                               sql_exp *e = n->data;
+
+                               if (is_left(rel->op) || is_full(rel->op))
+                                       set_has_nil(e);
+                       }
+               }
                v->changes++;
                return rel_inplace_project(v->sql->sa, rel, NULL, exps);
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to