Changeset: a6ade5322a75 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a6ade5322a75
Modified Files:
        sql/server/rel_optimizer.c
Branch: Jun2020
Log Message:

merged


diffs (102 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
@@ -2977,37 +2977,57 @@ rel_case_fixup_top(mvc *sql, sql_rel *re
 static list *
 rewrite_case_exps(mvc *sql, list *l, int *has_changes)
 {
-       node *n;
-
        if (!l)
                return l;
-       for(n = l->h; n; n = n->next) 
+       for (node *n = l->h; n; n = n->next) 
                n->data = rewrite_case_exp(sql, n->data, has_changes);
        return l;
 }
 
-
 static sql_exp *
 rewrite_case_exp(mvc *sql, sql_exp *e, int *has_changes)
 {
-       if (e->type != e_psm)
-               return e;
-       if (e->flag & PSM_VAR) 
-               return e;
-       if (e->flag & PSM_SET || e->flag & PSM_RETURN) {
-               e->l = rewrite_case_exp(sql, e->l, has_changes);
-       }
-       if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+       switch(e->type) {
+       case e_atom:
+       case e_column:
+               break;
+       case e_convert:
                e->l = rewrite_case_exp(sql, e->l, has_changes);
+               break;
+       case e_aggr:
+       case e_func: 
+               e->l = rewrite_case_exps(sql, e->l, has_changes);
                e->r = rewrite_case_exps(sql, e->r, has_changes);
-               if (e->f)
-                       e->f = rewrite_case_exps(sql, e->f, has_changes);
-               return e;
-       }
-       if ((e->flag & PSM_REL) && e->l)
-               e->l = rel_case_fixup_top(sql, e->l, has_changes);
-       if (e->flag & PSM_EXCEPTION)
-               e->l = rewrite_case_exp(sql, e->l, has_changes);
+               break;
+       case e_cmp:     
+               if (e->flag == cmp_or || e->flag == cmp_filter) {
+                       e->l = rewrite_case_exps(sql, e->l, has_changes);
+                       e->r = rewrite_case_exps(sql, e->r, has_changes);
+               } else if (e->flag == cmp_in || e->flag == cmp_notin) {
+                       e->l = rewrite_case_exp(sql, e->l, has_changes);
+                       e->r = rewrite_case_exps(sql, e->r, has_changes);
+               } else {
+                       e->l = rewrite_case_exp(sql, e->l, has_changes);
+                       e->r = rewrite_case_exp(sql, e->r, has_changes);
+                       if (e->f)
+                               e->f = rewrite_case_exp(sql, e->f, has_changes);
+               }
+               break;
+       case e_psm:
+               if (e->flag & PSM_SET || e->flag & PSM_RETURN || e->flag & 
PSM_EXCEPTION) {
+                       e->l = rewrite_case_exp(sql, e->l, has_changes);
+               } else if (e->flag & PSM_VAR) {
+                       return e;
+               } else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+                       e->l = rewrite_case_exp(sql, e->l, has_changes);
+                       e->r = rewrite_case_exps(sql, e->r, has_changes);
+                       if (e->flag == PSM_IF && e->f)
+                               e->f = rewrite_case_exps(sql, e->f, 
has_changes);
+               } else if (e->flag & PSM_REL && e->l) {
+                       e->l = rel_case_fixup_top(sql, e->l, has_changes);
+               }
+               break;
+       }
        return e;
 }
 
@@ -3018,7 +3038,7 @@ rel_case_fixup(mvc *sql, sql_rel *rel, i
 
        if (!top && rel_is_ref(rel))
                return rel;
-       if ((is_project(rel->op) || (rel->op == op_ddl && rel->flag == 
ddl_psm)) && rel->exps) {
+       if ((is_project(rel->op) || (is_ddl(rel->op) && rel->flag == ddl_psm)) 
&& rel->exps) {
                list *exps = rel->exps;
                node *n;
                int needed = 0;
@@ -3059,9 +3079,9 @@ rel_case_fixup(mvc *sql, sql_rel *rel, i
                }
                if (is_ddl(rel->op) && rel->flag == ddl_psm)
                        rel->exps = rewrite_case_exps(sql, rel->exps, changes);
-               if (rel->l)
+               if ((!is_ddl(rel->op) || (is_ddl(rel->op) && (rel->flag == 
ddl_output || rel->flag == ddl_create_seq || rel->flag == ddl_alter_seq))) && 
rel->l)
                        rel->l = rel_case_fixup(sql, rel->l, 
is_topn(rel->op)?top:0, changes);
-               if (is_ddl(rel->op) && rel->r)
+               if (is_ddl(rel->op) && (rel->flag == ddl_list || rel->flag == 
ddl_exception) && rel->r)
                        rel->r = rel_case_fixup(sql, rel->r, 
is_ddl(rel->op)?top:0, changes);
                return res;
        } 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to