Changeset: bebe267028b7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bebe267028b7
Modified Files:
        sql/server/rel_optimizer.c
Branch: default
Log Message:

push selections expressions down (from the join expressions list)


diffs (85 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
@@ -4782,6 +4782,71 @@ rel_uses_part_nr( sql_rel *rel, sql_exp 
        return 0;
 }
 
+static int
+rel_has_cmp_exp(sql_rel *rel, sql_exp *e)
+{
+       if (e->type == e_cmp) {
+               if (get_cmp(e) == cmp_or) {
+                       return rel_has_exp(rel, e->l) == 0 &&
+                               rel_has_all_exps(rel, e->r);
+               } else if (e->flag == cmp_in || e->flag == cmp_notin || 
get_cmp(e) == cmp_filter) {
+                       return rel_has_all_exps(rel, e->l) &&
+                               rel_has_all_exps(rel, e->r);
+               } else {
+                       return rel_has_exp(rel, e->l) == 0 &&
+                               rel_has_exp(rel, e->r) == 0 &&
+                               (!e->f || rel_has_exp(rel, e->f) == 0);
+               }
+       }
+       return 0;
+}
+
+static sql_rel *
+rel_join_push_exps_down(int *changes, mvc *sql, sql_rel *rel) 
+{
+       if ((is_join(rel->op) && !is_outerjoin(rel->op)) || is_semi(rel->op)) {
+               sql_rel *l = rel->l, *r = rel->r;
+               list *jexps = NULL, *lexps = NULL, *rexps = NULL;
+               node *n;
+
+               if (list_empty(rel->exps))
+                       return rel;
+
+               for(n=rel->exps->h; n; n=n->next) {
+                       sql_exp *e = n->data;
+                       int le = rel_has_cmp_exp(l, e);
+                       int re = rel_has_cmp_exp(r, e);
+
+                       if (le && !re) {
+                               if (!lexps)
+                                       lexps=sa_list(sql->sa);
+                               append(lexps, e);
+                       } else if (!le && re && rel->op != op_anti) {
+                               if (!rexps)
+                                       rexps=sa_list(sql->sa);
+                               append(rexps, e);
+                       } else {
+                               if (!jexps)
+                                       jexps=sa_list(sql->sa);
+                               append(jexps, e);
+                       }
+               }
+               if (lexps || rexps)
+                       rel->exps = jexps;
+               if (lexps) {
+                       l = rel->l = rel_select(sql->sa, rel->l, NULL);
+                       l->exps = lexps;
+                       (*changes) = 1;
+               }
+               if (rexps) {
+                       r = rel->r = rel_select(sql->sa, rel->r, NULL);
+                       r->exps = rexps;
+                       (*changes) = 1;
+               }
+       }
+       return rel;
+}
+
 /*
  * Push (semi)joins down unions, this is basically for merge tables, where
  * we know that the fk-indices are split over two clustered merge tables.
@@ -8929,6 +8994,9 @@ optimize_rel(mvc *sql, sql_rel *rel, int
                rel = rewrite(sql, rel, &rel_push_join_down_union, &changes); 
                /* rel_join_order may introduce empty selects */
                rel = rewrite(sql, rel, &rel_remove_empty_select, &e_changes); 
+
+               if (level <= 0)
+                       rel = rewrite(sql, rel, &rel_join_push_exps_down, 
&changes); 
        }
 
        if (gp.cnt[op_join] || gp.cnt[op_left] || gp.cnt[op_right] || 
gp.cnt[op_full]) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to