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

Added more cases to rel_remove_empty_join


diffs (70 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
@@ -5197,11 +5197,10 @@ rel_push_join_down_union(int *changes, m
 static int 
 rel_is_empty( sql_rel *rel )
 {
-       (void)rel;
        if ((is_join(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) {
                sql_rel *l = rel->l, *r = rel->r;
 
-               if (rel_is_empty(l) || (is_join(rel->op) && rel_is_empty(r)))
+               if (rel_is_empty(l) || ((is_join(rel->op) || is_semi(rel->op)) 
&& rel_is_empty(r)))
                        return 1;
                /* check */
                if (rel_is_join_on_pkey(rel)) {
@@ -5212,9 +5211,19 @@ rel_is_empty( sql_rel *rel )
                                return 1;
                }
        }
-       if (!is_union(rel->op) && 
-                       (is_project(rel->op) || is_topn(rel->op)) && rel->l)
-               return rel_is_empty(rel->l);
+       if (!is_union(rel->op)) {
+               if (is_simple_project(rel->op) || is_topn(rel->op) || 
is_select(rel->op) || is_sample(rel->op))
+                       if (rel->l)
+                               return rel_is_empty(rel->l);
+               else if (is_join(rel->op) || is_semi(rel->op) || 
is_set(rel->op)) {
+                       int empty = 1;
+                       if (rel->l)
+                               empty &= rel_is_empty(rel->l);
+                       if (empty && rel->r)
+                               empty &= rel_is_empty(rel->r);
+                       return empty;
+               }
+       }
        return 0;
 }
 
@@ -5237,12 +5246,15 @@ rel_remove_empty_join(mvc *sql, sql_rel 
                        (*changes)++;
                        return rel_inplace_project(sql->sa, rel, rel_dup(l), 
rel->exps);
                }
-       } else if ((is_project(rel->op) || is_topn(rel->op) || 
is_select(rel->op)
-                               || is_sample(rel->op)) && rel->l) {
-               rel->l = rel_remove_empty_join(sql, rel->l, changes);
-       } else if (is_join(rel->op)) {
-               rel->l = rel_remove_empty_join(sql, rel->l, changes);
-               rel->r = rel_remove_empty_join(sql, rel->r, changes);
+       } else if ((is_simple_project(rel->op) || is_groupby(rel->op) || 
is_topn(rel->op) || 
+                               is_select(rel->op) || is_sample(rel->op))) {
+               if (rel->l)
+                       rel->l = rel_remove_empty_join(sql, rel->l, changes);
+       } else if (is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) {
+               if (rel->l)
+                       rel->l = rel_remove_empty_join(sql, rel->l, changes);
+               if (rel->r)
+                       rel->r = rel_remove_empty_join(sql, rel->r, changes);
        }
        return rel;
 }
@@ -5830,7 +5842,7 @@ rel_groupby_distinct(int *changes, mvc *
                for (n = rel->exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
 
-                       if (exp_aggr_is_count(e) && need_distinct(e)) {
+                       if (exp_aggr_is_count(e) && need_distinct(e)) {
                                /* if count over unique values (ukey/pkey) */
                                if (e->l && exps_unique(sql, rel, e->l))
                                        set_nodistinct(e);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to