Changeset: b004d2fd1e90 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b004d2fd1e90
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rewriter.c
        sql/server/rel_rewriter.h
        sql/server/rel_unnest.c
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test
Branch: clean-projects
Log Message:

Remove redundant projections on more occasions. Also rel_dce has to run for 
every level if there are changes


diffs (222 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
@@ -5544,9 +5544,7 @@ rel_push_project_down(visitor *v, sql_re
                        }
                        return rel;
                } else if (list_check_prop_all(rel->exps, 
(prop_check_func)&exp_is_useless_rename)) {
-                       if ((is_project(l->op) && list_length(l->exps) == 
list_length(rel->exps)) ||
-                               ((v->parent && is_project(v->parent->op)) &&
-                                (is_set(l->op) || is_select(l->op) || 
is_join(l->op) || is_semi(l->op) || is_topn(l->op) || is_sample(l->op)))) {
+                       if ((is_project(l->op) && list_length(l->exps) == 
list_length(rel->exps)) || (v->parent && is_project(v->parent->op))) {
                                rel->l = NULL;
                                rel_destroy(rel);
                                v->changes++;
@@ -8726,14 +8724,6 @@ rel_split_outerjoin(visitor *v, sql_rel 
        return rel;
 }
 
-/* rewrite sqltype into backend types */
-static sql_rel *
-rel_rewrite_types(visitor *v, sql_rel *rel)
-{
-       (void)v;
-       return rel;
-}
-
 static sql_exp *
 exp_indexcol(mvc *sql, sql_exp *e, const char *tname, const char *cname, int 
de, bit unique)
 {
@@ -9678,8 +9668,6 @@ optimize_rel(mvc *sql, sql_rel *rel, int
        if (gp.cnt[op_project])
                rel = rel_visitor_bottomup(&v, rel, &rel_project_cse);
 
-       rel = rel_visitor_bottomup(&v, rel, &rel_rewrite_types);
-
        if ((gp.cnt[op_left] || gp.cnt[op_right] || gp.cnt[op_full]) && /* 
DISABLES CODE */ (0))
                rel = rel_visitor_topdown(&v, rel, &rel_split_outerjoin);
 
@@ -9722,7 +9710,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
                        rel = rel_join_order(&v, rel);
                rel = rel_visitor_bottomup(&v, rel, &rel_push_join_down_union);
                /* rel_join_order may introduce empty selects */
-               rel = rel_visitor_bottomup(&ev, rel, &rel_remove_empty_select);
+               if (gp.cnt[op_select])
+                       rel = rel_visitor_bottomup(&ev, rel, 
&rel_remove_empty_select);
 
                if (level <= 0)
                        rel = rel_visitor_bottomup(&v, rel, 
&rel_join_push_exps_down);
@@ -9733,7 +9722,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
                rel = rel_visitor_topdown(&v, rel, &rel_push_count_down);
                if (level <= 0) {
                        rel = rel_visitor_topdown(&v, rel, 
&rel_push_select_down);
-                       rel = rel_visitor_bottomup(&ev, rel, 
&rel_remove_empty_select);
+                       if (gp.cnt[op_select])
+                               rel = rel_visitor_bottomup(&ev, rel, 
&rel_remove_empty_select);
                        rel = rel_visitor_topdown(&v, rel, &rel_push_join_down);
                }
 
@@ -9760,7 +9750,8 @@ optimize_rel(mvc *sql, sql_rel *rel, int
           because pushing down select expressions makes rel_join_order more 
difficult */
        if (gp.cnt[op_select] || gp.cnt[op_join] || gp.cnt[op_semi] || 
gp.cnt[op_anti]) {
                rel = rel_visitor_topdown(&v, rel, &rel_push_select_down);
-               rel = rel_visitor_bottomup(&ev, rel, &rel_remove_empty_select);
+               if (gp.cnt[op_select])
+                       rel = rel_visitor_bottomup(&ev, rel, 
&rel_remove_empty_select);
        }
 
        if (gp.cnt[op_join] || gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full] || gp.cnt[op_semi] || gp.cnt[op_anti]) {
@@ -9780,14 +9771,18 @@ optimize_rel(mvc *sql, sql_rel *rel, int
                rel = rel_visitor_topdown(&v, rel, 
&rel_push_project_down_union);
 
        /* Remove unused expressions */
-       if (level <= 0)
+       if (level <= 0 || v.changes) {
+               if (level > 0)
+                       rel = rel_exp_visitor_bottomup(&v, rel, 
&reset_exp_used, false);
                rel = rel_dce(sql, rel);
+       }
 
        if (gp.cnt[op_join] || gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full] ||
            gp.cnt[op_semi] || gp.cnt[op_anti] || gp.cnt[op_select]) {
                rel = rel_visitor_bottomup(&v, rel, &rel_push_func_down);
                rel = rel_visitor_topdown(&v, rel, &rel_push_select_down);
-               rel = rel_visitor_bottomup(&ev, rel, &rel_remove_empty_select);
+               if (gp.cnt[op_select])
+                       rel = rel_visitor_bottomup(&ev, rel, 
&rel_remove_empty_select);
        }
 
        if (gp.cnt[op_topn] || gp.cnt[op_sample])
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
@@ -368,3 +368,14 @@ rewrite_reset_used(visitor *v, sql_rel *
        rel->used = 0;
        return rel;
 }
+
+sql_exp *
+reset_exp_used(visitor *v, sql_rel *rel, sql_exp *e, int depth)
+{
+       (void) v;
+       (void) rel;
+       (void) depth;
+
+       e->used = 0;
+       return e;
+}
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
@@ -24,5 +24,6 @@ extern sql_rel *rel_remove_empty_select(
 extern sql_exp *exp_push_down(mvc *sql, sql_exp *e, sql_rel *f, sql_rel *t);
 
 extern sql_rel *rewrite_reset_used(visitor *v, sql_rel *rel);
+extern sql_exp *reset_exp_used(visitor *v, sql_rel *rel, sql_exp *e, int 
depth);
 
 #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
@@ -3443,17 +3443,6 @@ rewrite_values(visitor *v, sql_rel *rel)
        return rel;
 }
 
-static sql_exp *
-reset_exp_used(visitor *v, sql_rel *rel, sql_exp *e, int depth)
-{
-       (void) v;
-       (void) rel;
-       (void) depth;
-
-       e->used = 0;
-       return e;
-}
-
 sql_rel *
 rel_unnest(mvc *sql, sql_rel *rel)
 {
diff --git 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test
 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test
--- 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test
+++ 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test
@@ -14,7 +14,7 @@ query T nosort
    plan select id       from fk left outer join pk1 on fk.fk1 = pk1.pk1 left 
outer join pk2 on fk.fk2 = pk2.pk2 order by id
 ----
 project (
-| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT 
+| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL  ] COUNT 
 ) [ "fk"."id" NOT NULL HASHCOL  ] [ "fk"."id" ASC NOT NULL HASHCOL  ]
 
 query T nosort
@@ -22,7 +22,7 @@ query T nosort
 ----
 project (
 | left outer join (
-| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT ,
+| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey" ] COUNT ,
 | | table("sys"."pk1") [ "pk1"."v1", "pk1"."%TID%" NOT NULL ] COUNT 
 | ) [ "fk"."%fk_fk1_fkey" NOT NULL = "pk1"."%TID%" NOT NULL JOINIDX 
"sys"."fk"."fk_fk1_fkey" ]
 ) [ "fk"."id" NOT NULL HASHCOL , "pk1"."v1" ] [ "fk"."id" ASC NOT NULL HASHCOL 
 ]
@@ -53,7 +53,7 @@ query T nosort
    plan select id       from pk2 right outer join (pk1 right outer join fk on 
fk.fk1 = pk1.pk1) on fk.fk2 = pk2.pk2 order by id
 ----
 project (
-| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT 
+| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL  ] COUNT 
 ) [ "fk"."id" NOT NULL HASHCOL  ] [ "fk"."id" ASC NOT NULL HASHCOL  ]
 
 query T nosort
@@ -62,7 +62,7 @@ query T nosort
 project (
 | right outer join (
 | | table("sys"."pk1") [ "pk1"."v1", "pk1"."%TID%" NOT NULL ] COUNT ,
-| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT 
+| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey" ] COUNT 
 | ) [ "fk"."%fk_fk1_fkey" NOT NULL = "pk1"."%TID%" NOT NULL JOINIDX 
"sys"."fk"."fk_fk1_fkey" ]
 ) [ "fk"."id" NOT NULL HASHCOL , "pk1"."v1" ] [ "fk"."id" ASC NOT NULL HASHCOL 
 ]
 
@@ -92,7 +92,7 @@ query T nosort
    plan select id       from pk2 full outer join (pk1 full outer join fk on 
fk.fk1 = pk1.pk1) on fk.fk2 = pk2.pk2 order by id
 ----
 project (
-| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT 
+| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL  ] COUNT 
 ) [ "fk"."id" HASHCOL  ] [ "fk"."id" ASC HASHCOL  ]
 
 query T nosort
@@ -101,7 +101,7 @@ query T nosort
 project (
 | full outer join (
 | | table("sys"."pk1") [ "pk1"."v1", "pk1"."%TID%" NOT NULL ] COUNT ,
-| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT 
+| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey" ] COUNT 
 | ) [ "fk"."%fk_fk1_fkey" NOT NULL = "pk1"."%TID%" NOT NULL JOINIDX 
"sys"."fk"."fk_fk1_fkey" ]
 ) [ "fk"."id" HASHCOL , "pk1"."v1" ] [ "fk"."id" ASC HASHCOL  ]
 
@@ -131,7 +131,7 @@ query T nosort
    plan select id       from pk2 join (pk1 join fk on fk.fk1 = pk1.pk1) on 
fk.fk2 = pk2.pk2 order by id
 ----
 project (
-| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT 
+| table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL  ] COUNT 
 ) [ "fk"."id" NOT NULL HASHCOL  ] [ "fk"."id" ASC NOT NULL HASHCOL  ]
 
 query T nosort
@@ -139,7 +139,7 @@ query T nosort
 ----
 project (
 | join (
-| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT ,
+| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey" ] COUNT ,
 | | table("sys"."pk1") [ "pk1"."v1", "pk1"."%TID%" NOT NULL ] COUNT 
 | ) [ "fk"."%fk_fk1_fkey" NOT NULL = "pk1"."%TID%" NOT NULL JOINIDX 
"sys"."fk"."fk_fk1_fkey" ]
 ) [ "fk"."id" NOT NULL HASHCOL , "pk1"."v1" ] [ "fk"."id" ASC NOT NULL HASHCOL 
 ]
@@ -149,7 +149,7 @@ query T nosort
 ----
 project (
 | join (
-| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk1_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ] COUNT ,
+| | table("sys"."fk") [ "fk"."id" NOT NULL HASHCOL , "fk"."%fk_fk2_fkey" NOT 
NULL JOINIDX "sys"."fk"."fk_fk2_fkey" ] COUNT ,
 | | table("sys"."pk2") [ "pk2"."v2", "pk2"."%TID%" NOT NULL ] COUNT 
 | ) [ "fk"."%fk_fk2_fkey" NOT NULL = "pk2"."%TID%" NOT NULL JOINIDX 
"sys"."fk"."fk_fk2_fkey" ]
 ) [ "fk"."id" NOT NULL HASHCOL , "pk2"."v2" ] [ "fk"."id" ASC NOT NULL HASHCOL 
 ]
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to