Changeset: ac8b887149da for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ac8b887149da
Modified Files:
        sql/server/rel_optimizer.c
Branch: Jul2021
Log Message:

Push down selections under exceptions and intersections as well.

Merged rel_push_select_down_union optimizer into rel_push_select_down, so a 
selection can be pushed down further earlier.

I am committing this on Jul2021 branch because I consider this to be a bug.


diffs (128 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
@@ -4710,6 +4710,55 @@ rel_push_select_down(visitor *v, sql_rel
                        }
                }
        }
+
+       /* try push select under set relation */
+       if (is_select(rel->op) && r && !(rel_is_ref(r)) && !list_empty(exps)) {
+               sql_rel *u = r, *ou = u;
+               sql_rel *ul = u->l;
+               sql_rel *ur = u->r;
+
+               if (!rel_is_ref(u) && u->op == op_project)
+                       u = u->l;
+
+               if (u && is_set(u->op) && !is_single(u) && !list_empty(u->exps) 
&& !rel_is_ref(u)) {
+                       ul = u->l;
+                       ur = u->r;
+
+                       ul = rel_dup(ul);
+                       ur = rel_dup(ur);
+                       if (!is_project(ul->op))
+                               ul = rel_project(v->sql->sa, ul,
+                                       rel_projections(v->sql, ul, NULL, 1, 
1));
+                       if (!is_project(ur->op))
+                               ur = rel_project(v->sql->sa, ur,
+                                       rel_projections(v->sql, ur, NULL, 1, 
1));
+                       rel_rename_exps(v->sql, u->exps, ul->exps);
+                       rel_rename_exps(v->sql, u->exps, ur->exps);
+
+                       if (u != ou) {
+                               ul = rel_project(v->sql->sa, ul, NULL);
+                               ul->exps = exps_copy(v->sql, ou->exps);
+                               rel_rename_exps(v->sql, ou->exps, ul->exps);
+                               set_processed(ul);
+                               ur = rel_project(v->sql->sa, ur, NULL);
+                               ur->exps = exps_copy(v->sql, ou->exps);
+                               rel_rename_exps(v->sql, ou->exps, ur->exps);
+                               set_processed(ur);
+                       }
+
+                       /* introduce selects under the set */
+                       ul = rel_select(v->sql->sa, ul, NULL);
+                       ul->exps = exps_copy(v->sql, exps);
+                       ur = rel_select(v->sql->sa, ur, NULL);
+                       ur->exps = exps_copy(v->sql, exps);
+
+                       rel = rel_inplace_setop(v->sql, rel, ul, ur, u->op, 
rel_projections(v->sql, rel, NULL, 1, 1));
+                       if (need_distinct(u))
+                               set_distinct(rel);
+                       v->changes++;
+               }
+       }
+
        return try_remove_empty_select(v, rel);
 }
 
@@ -5475,60 +5524,6 @@ rel_join2semijoin(visitor *v, sql_rel *r
        return rel;
 }
 
-static sql_rel *
-rel_push_select_down_union(visitor *v, sql_rel *rel)
-{
-       if (is_select(rel->op) && rel->l && rel->exps) {
-               sql_rel *u = rel->l, *ou = u;
-               sql_rel *ul = u->l;
-               sql_rel *ur = u->r;
-
-               if (u->op == op_project)
-                       u = u->l;
-
-               if (!u || !is_union(u->op) || need_distinct(u) || is_single(u) 
|| !u->exps || rel_is_ref(u))
-                       return rel;
-
-               ul = u->l;
-               ur = u->r;
-
-               ul = rel_dup(ul);
-               ur = rel_dup(ur);
-               if (!is_project(ul->op))
-                       ul = rel_project(v->sql->sa, ul,
-                               rel_projections(v->sql, ul, NULL, 1, 1));
-               if (!is_project(ur->op))
-                       ur = rel_project(v->sql->sa, ur,
-                               rel_projections(v->sql, ur, NULL, 1, 1));
-               rel_rename_exps(v->sql, u->exps, ul->exps);
-               rel_rename_exps(v->sql, u->exps, ur->exps);
-
-               if (u != ou) {
-                       ul = rel_project(v->sql->sa, ul, NULL);
-                       ul->exps = exps_copy(v->sql, ou->exps);
-                       rel_rename_exps(v->sql, ou->exps, ul->exps);
-                       ur = rel_project(v->sql->sa, ur, NULL);
-                       ur->exps = exps_copy(v->sql, ou->exps);
-                       rel_rename_exps(v->sql, ou->exps, ur->exps);
-               }
-
-               /* introduce selects under the set (if needed) */
-               set_processed(ul);
-               set_processed(ur);
-               if (rel_is_ref(rel) || !list_empty(rel->exps)) { /* don't 
generate empty selects */
-                       ul = rel_select(v->sql->sa, ul, NULL);
-                       ul->exps = exps_copy(v->sql, rel->exps);
-                       ur = rel_select(v->sql->sa, ur, NULL);
-                       ur->exps = exps_copy(v->sql, rel->exps);
-               }
-
-               rel = rel_inplace_setop(v->sql, rel, ul, ur, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
-               v->changes++;
-               return rel;
-       }
-       return rel;
-}
-
 static int
 exp_is_rename(sql_exp *e)
 {
@@ -9579,7 +9574,6 @@ rel_optimize_unions_bottomup(visitor *v,
 static sql_rel *
 rel_optimize_unions_topdown(visitor *v, sql_rel *rel)
 {
-       rel = rel_push_select_down_union(v, rel);
        rel = rel_push_project_down_union(v, rel);
        rel = rel_push_join_down_union(v, rel);
        return rel;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to