Changeset: ea9adedddb9f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea9adedddb9f
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rewriter.c
        sql/server/rel_rewriter.h
        sql/server/rel_unnest.c
Branch: default
Log Message:

Call rel_remove_empty_select if expressions at rel_unnest


diffs (113 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
@@ -25,9 +25,7 @@ typedef struct global_props {
        int cnt[ddl_maxops];
 } global_props;
 
-static sql_rel * rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes);
-
-static sql_subfunc *find_func( mvc *sql, char *name, list *exps );
+static sql_subfunc *find_func(mvc *sql, char *name, list *exps);
 
 /* The important task of the relational optimizer is to optimize the
    join order. 
@@ -4683,34 +4681,6 @@ rel_push_select_down_join(mvc *sql, sql_
        return rel;
 }
 
-static sql_rel *
-rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes)
-{
-       (void)sql;
-
-       if ((is_join(rel->op) || is_semi(rel->op) || is_select(rel->op) || 
is_project(rel->op) || is_topn(rel->op) || is_sample(rel->op)) && rel->l) {
-               sql_rel *l = rel->l;
-               if (is_select(l->op) && !(rel_is_ref(l)) && 
list_empty(l->exps)) {
-                       rel->l = l->l;
-                       l->l = NULL;
-                       rel_destroy(l);
-                       (*changes)++;
-               } 
-       }
-       if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && 
rel->r) {
-               sql_rel *r = rel->r;
-               if (is_select(r->op) && !(rel_is_ref(r)) && 
list_empty(r->exps)) {
-                       rel->r = r->l;
-                       r->l = NULL;
-                       rel_destroy(r);
-                       (*changes)++;
-               }
-       } 
-       if (is_join(rel->op) && list_empty(rel->exps)) 
-               rel->exps = NULL; /* crossproduct */
-       return rel;
-}
-
 /*
  * Push {semi}joins down, pushes the joins through group by expressions. 
  * When the join is on the group by columns, we can push the joins left
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -163,3 +163,31 @@ rewrite_simplify(mvc *sql, sql_rel *rel,
                rel->exps = exps_simplify_exp(sql, rel->exps, changes);
        return rel;
 }
+
+sql_rel *
+rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes)
+{
+       (void)sql;
+
+       if ((is_join(rel->op) || is_semi(rel->op) || is_select(rel->op) || 
is_project(rel->op) || is_topn(rel->op) || is_sample(rel->op)) && rel->l) {
+               sql_rel *l = rel->l;
+               if (is_select(l->op) && !(rel_is_ref(l)) && 
list_empty(l->exps)) {
+                       rel->l = l->l;
+                       l->l = NULL;
+                       rel_destroy(l);
+                       (*changes)++;
+               } 
+       }
+       if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && 
rel->r) {
+               sql_rel *r = rel->r;
+               if (is_select(r->op) && !(rel_is_ref(r)) && 
list_empty(r->exps)) {
+                       rel->r = r->l;
+                       r->l = NULL;
+                       rel_destroy(r);
+                       (*changes)++;
+               }
+       } 
+       if (is_join(rel->op) && list_empty(rel->exps)) 
+               rel->exps = NULL; /* crossproduct */
+       return rel;
+}
diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h
--- a/sql/server/rel_rewriter.h
+++ b/sql/server/rel_rewriter.h
@@ -14,5 +14,6 @@
 
 extern sql_exp *rewrite_simplify_exp(mvc *sql, sql_rel *rel, sql_exp *e, int 
depth);
 extern sql_rel *rewrite_simplify(mvc *sql, sql_rel *rel, int *changes);
+extern sql_rel *rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes);
 
 #endif /*_REL_REWRITER_H_*/
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2646,12 +2646,13 @@ rel_unnest(mvc *sql, sql_rel *rel)
 {
        int changes = 0;
 
-       (void) changes;
        rel_reset_subquery(rel);
        rel = rel_exp_visitor(sql, rel, &rewrite_simplify_exp);
        rel = rel_visitor_bottomup(sql, rel, &rewrite_simplify, &changes);
+       rel = rel_visitor_bottomup(sql, rel, &rewrite_or_exp, &changes);
+       if (changes > 0)
+               rel = rel_visitor_bottomup(sql, rel, &rel_remove_empty_select, 
&changes);
        rel = rel_visitor_bottomup(sql, rel, &rewrite_aggregates, &changes);
-       rel = rel_visitor_bottomup(sql, rel, &rewrite_or_exp, &changes);
        rel = rel_exp_visitor(sql, rel, &rewrite_rank);
        rel = rel_exp_visitor(sql, rel, &rewrite_anyequal);
        rel = rel_exp_visitor(sql, rel, &rewrite_exists);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to