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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list