Changeset: 2489c3a13a27 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2489c3a13a27
Modified Files:
        sql/server/rel_optimizer.c
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-3join-query.stable.out
Branch: default
Log Message:

Run rel_optimize_semi_and_anti whenever there are joins because they can be 
rewritten into semijoins beforehand


diffs (84 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
@@ -9517,8 +9517,10 @@ rel_optimize_select_and_joins_topdown(vi
 {
        /* push_join_down introduces semijoins */
        int level = *(int*) v->data;
-       if (level <= 0)
+       if (level <= 0) {
+               rel = rel_semijoin_use_fk(v, rel);
                rel = rel_push_join_down(v, rel);
+       }
 
        rel = rel_simplify_fk_joins(v, rel);
        rel = rel_push_select_down(v, rel);
@@ -9609,13 +9611,8 @@ optimize_rel(visitor *v, sql_rel *rel, g
                rel = rel_visitor_topdown(v, rel, &rel_optimize_joins);
                if (!gp->cnt[op_update])
                        rel = rel_join_order(v, rel);
-       }
-
-       /* Important -> Re-write semijoins after rel_join_order */
-       if (gp->cnt[op_anti] || gp->cnt[op_semi]) {
+               /* Important -> Re-write semijoins after rel_join_order */
                rel = rel_visitor_bottomup(v, rel, &rel_optimize_semi_and_anti);
-               if (level <= 0)
-                       rel = rel_visitor_topdown(v, rel, &rel_semijoin_use_fk);
        }
 
        /* Important -> Make sure rel_push_select_down gets called after 
rel_join_order,
diff --git 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-3join-query.stable.out
 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-3join-query.stable.out
--- 
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-3join-query.stable.out
+++ 
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-3join-query.stable.out
@@ -1,24 +1,22 @@
 % .plan # table_name
 % rel # name
 % clob # type
-% 65 # length
+% 80 # length
 project (
 | group by (
-| | semijoin (
-| | | table("sys"."fk") [ "fk"."fk1" ],
-| | | table("sys"."pk1") [ "pk1"."pk1" NOT NULL UNIQUE HASHCOL  ]
-| | ) [ ("fk"."fk1") = ("pk1"."pk1" NOT NULL HASHCOL ) ]
+| | select (
+| | | table("sys"."fk") [ "fk"."%fk_fk1_fkey" JOINIDX "sys"."fk"."fk_fk1_fkey" 
]
+| | ) [ ("fk"."%fk_fk1_fkey") ! * = (oid(63) NULL) ]
 | ) [  ] [ "sys"."count"() NOT NULL as "%1"."%1" ]
 ) [ "%1"."%1" NOT NULL ]
 % .plan # table_name
 % rel # name
 % clob # type
-% 73 # length
+% 114 # length
 project (
-| semijoin (
-| | table("sys"."fk") [ "fk"."id" NOT NULL UNIQUE HASHCOL , "fk"."fk1" ],
-| | table("sys"."pk1") [ "pk1"."pk1" NOT NULL UNIQUE HASHCOL  ]
-| ) [ ("fk"."fk1") = ("pk1"."pk1" NOT NULL HASHCOL ) ]
+| select (
+| | table("sys"."fk") [ "fk"."id" NOT NULL UNIQUE HASHCOL , 
"fk"."%fk_fk1_fkey" JOINIDX "sys"."fk"."fk_fk1_fkey" ]
+| ) [ ("fk"."%fk_fk1_fkey") ! * = (oid(63) NULL) ]
 ) [ "fk"."id" NOT NULL HASHCOL  ] [ "fk"."id" ASC NOT NULL HASHCOL  ]
 % .plan # table_name
 % rel # name
@@ -56,12 +54,13 @@ project (
 % .plan # table_name
 % rel # name
 % clob # type
-% 170 # length
+% 171 # length
 project (
 | join (
-| | select (
-| | | table("sys"."fk") [ "fk"."id" NOT NULL UNIQUE HASHCOL , 
"fk"."%fk_fk1_fkey" JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" 
JOINIDX "sys"."fk"."fk_fk2_fkey" ]
-| | ) [ ("fk"."%fk_fk1_fkey") ! * = (oid(63) NULL) ],
+| | semijoin (
+| | | table("sys"."fk") [ "fk"."id" NOT NULL UNIQUE HASHCOL , 
"fk"."%fk_fk1_fkey" JOINIDX "sys"."fk"."fk_fk1_fkey", "fk"."%fk_fk2_fkey" 
JOINIDX "sys"."fk"."fk_fk2_fkey" ],
+| | | table("sys"."pk1") [ "pk1"."%TID%" NOT NULL UNIQUE ]
+| | ) [ ("fk"."%fk_fk1_fkey") = ("pk1"."%TID%" NOT NULL UNIQUE) JOINIDX 
"sys"."fk"."fk_fk1_fkey" ],
 | | table("sys"."pk2") [ "pk2"."v2", "pk2"."%TID%" NOT NULL UNIQUE ]
 | ) [ ("fk"."%fk_fk2_fkey") = ("pk2"."%TID%" NOT NULL UNIQUE) 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

Reply via email to