Changeset: 98e6a33ccd36 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/98e6a33ccd36
Modified Files:
        sql/server/rel_optimize_sel.c
Branch: pp_hashjoin
Log Message:

split f-primary key usage from join order


diffs (84 lines):

diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -2464,11 +2464,12 @@ distinct_join_exps(list *aje, list *lrel
        return res;
 }
 
-static list *
+static void
 find_fk( mvc *sql, list *rels, list *exps)
 {
        node *djn;
-       list *sdje, *aje, *dje;
+       //list *sdje, *aje, *dje;
+       list *aje, *dje;
        list *lrels, *rrels;
 
        /* first find the distinct join expressions */
@@ -2573,8 +2574,8 @@ find_fk( mvc *sql, list *rels, list *exp
        }
 
        /* sort expressions on weighted number of reducing operators */
-       sdje = order_join_expressions(sql, dje, rels);
-       return sdje;
+       //sdje = order_join_expressions(sql, dje, rels);
+       //return sdje;
 }
 
 static int
@@ -2807,7 +2808,18 @@ order_joins(visitor *v, list *rels, list
        int direct = 1;
 
        /* find foreign keys and reorder the expressions on reducing quality */
-       sdje = find_fk(v->sql, rels, exps);
+       //sdje = find_fk(v->sql, rels, exps);
+
+       /* first find the distinct join expressions */
+       list *aje = list_select(exps, rels, (fcmp) &exp_is_join, (fdup)NULL);
+       /* add left/right relation */
+       list *lrels, *rrels, *dje;
+       if (find_join_rels(&lrels, &rrels, aje, rels) < 0)
+               dje = aje;
+       else
+               dje = distinct_join_exps(aje, lrels, rrels);
+       /* sort expressions on weighted number of reducing operators */
+       sdje = order_join_expressions(v->sql, dje, rels);
 
        for(djn = sdje->h; djn; djn = djn->next ) {
                sql_exp *e = djn->data;
@@ -3254,7 +3266,7 @@ reorder_join(visitor *v, sql_rel *rel)
                        /* try to use an join index also for outer joins */
                        get_inner_relations(v->sql, rel, rels);
                        int cnt = list_length(exps);
-                       rel->exps = find_fk(v->sql, rels, exps);
+                       rel->exps = exps;//find_fk(v->sql, rels, exps);
                        if (list_length(rel->exps) != cnt)
                                rel->exps = order_join_expressions(v->sql, 
exps, rels);
                }
@@ -3723,14 +3735,14 @@ bind_optimize_semi_and_anti(visitor *v, 
 static sql_rel *
 rel_semijoin_use_fk(visitor *v, sql_rel *rel)
 {
-       if (is_semi(rel->op) && rel->exps) {
+       if ((is_semi(rel->op) || is_join(rel->op)) && rel->exps) {
                list *exps = rel->exps;
                list *rels = sa_list(v->sql->sa);
 
                rel->exps = NULL;
                append(rels, rel->l);
                append(rels, rel->r);
-               (void) find_fk( v->sql, rels, exps);
+               find_fk( v->sql, rels, exps);
 
                rel->exps = exps;
        }
@@ -4634,7 +4646,7 @@ rel_optimize_select_and_joins_topdown_(v
        /* push_join_down introduces semijoins */
        uint8_t cycle = *(uint8_t*) v->data;
        if (cycle <= 0) {
-               rel = rel_semijoin_use_fk(v, rel);
+               rel = rel_semijoin_use_fk(v, rel); // also for inners
                rel = rel_push_join_down(v, rel);
        }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to