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