Changeset: e522bc380a5d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e522bc380a5d
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
Branch: default
Log Message:

If a join has more than 1 reference, try to use join idxs


diffs (106 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
@@ -917,34 +917,27 @@ push_up_join_exps( mvc *sql, sql_rel *re
 static sql_rel *
 reorder_join(visitor *v, sql_rel *rel)
 {
-       list *exps;
-       list *rels;
-
-       if (rel->op == op_join && !rel_is_ref(rel))
+       list *exps, *rels;
+
+       if (is_innerjoin(rel->op) && !is_single(rel) && !rel_is_ref(rel))
                rel->exps = push_up_join_exps(v->sql, rel);
 
        exps = rel->exps;
        if (!exps) /* crosstable, ie order not important */
                return rel;
        rel->exps = NULL; /* should be all crosstables by now */
-       rels = sa_list(v->sql->sa);
-       if (is_outerjoin(rel->op) || is_single(rel)) {
-               sql_rel *l, *r;
-               int cnt = 0;
+       rels = sa_list(v->sql->sa);
+       if (!is_innerjoin(rel->op) || is_single(rel) || rel_is_ref(rel)) {
                /* try to use an join index also for outer joins */
-               get_inner_relations(v->sql, rel, rels);
-               cnt = list_length(exps);
+               get_inner_relations(v->sql, rel, rels);
+               int cnt = list_length(exps);
                rel->exps = find_fk(v->sql, rels, exps);
                if (list_length(rel->exps) != cnt)
                        rel->exps = order_join_expressions(v->sql, exps, rels);
-               l = rel->l;
-               r = rel->r;
-               if (is_join(l->op))
-                       rel->l = reorder_join(v, rel->l);
-               if (is_join(r->op))
-                       rel->r = reorder_join(v, rel->r);
+               rel->l = rel_join_order(v, rel->l);
+               rel->r = rel_join_order(v, rel->r);
        } else {
-               get_relations(v, rel, rels);
+               get_relations(v, rel, rels);
                if (list_length(rels) > 1) {
                        rels = push_in_join_down(v->sql, rels, exps);
                        rel = order_joins(v, rels, exps);
@@ -964,7 +957,10 @@ rel_join_order(visitor *v, sql_rel *rel)
 
        switch (rel->op) {
        case op_basetable:
+               break;
        case op_table:
+               if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION)
+                       rel->l = rel_join_order(v, rel->l);
                break;
        case op_join:
        case op_left:
@@ -1005,12 +1001,8 @@ rel_join_order(visitor *v, sql_rel *rel)
        case op_truncate:
                break;
        }
-       if (is_join(rel->op) && rel->exps && !rel_is_ref(rel)) {
+       if (is_join(rel->op))
                rel = reorder_join(v, rel);
-       } else if (is_join(rel->op)) {
-               rel->l = rel_join_order(v, rel->l);
-               rel->r = rel_join_order(v, rel->r);
-       }
        return rel;
 }
 
diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test 
b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
--- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
+++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
@@ -126,12 +126,12 @@ single left outer join (
 | | | ) [ "b3"."id" NOT NULL UNIQUE HASHCOL , "b3"."increase" NOT NULL, 
"b3"."%TID%" NOT NULL UNIQUE, "b3"."increase" NOT NULL as "%2"."%2" ],
 | | | group by (
 | | | | join (
+| | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL UNIQUE HASHCOL  as 
"b3a"."id", "bidder"."open_auction_id" NOT NULL as "b3a"."open_auction_id", 
"bidder"."%TID%" NOT NULL UNIQUE as "b3a"."%TID%" ],
 | | | | | group by (
 | | | | | | project (
 | | | | | | | & REF 1 
 | | | | | | ) [ "o"."open_auction_id" NOT NULL ]
-| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT 
NULL ],
-| | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL UNIQUE HASHCOL  as 
"b3a"."id", "bidder"."open_auction_id" NOT NULL as "b3a"."open_auction_id", 
"bidder"."%TID%" NOT NULL UNIQUE as "b3a"."%TID%" ]
+| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT 
NULL ]
 | | | | ) [ ("b3a"."open_auction_id" NOT NULL) = ("o"."open_auction_id" NOT 
NULL) ]
 | | | ) [ "o"."open_auction_id" NOT NULL ] [ "sys"."min" no nil ("b3a"."id" 
NOT NULL UNIQUE HASHCOL ) as "%1"."%1", "o"."open_auction_id" NOT NULL ]
 | | ) [ ("b3"."id" NOT NULL UNIQUE HASHCOL ) = ("%1"."%1") ]
@@ -149,12 +149,12 @@ project (
 | | | | | | ) [ "b2"."id" NOT NULL UNIQUE HASHCOL , "b2"."increase" NOT NULL 
as "%4"."%4" ],
 | | | | | | group by (
 | | | | | | | join (
+| | | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL UNIQUE HASHCOL  
as "b2a"."id", "bidder"."open_auction_id" NOT NULL as "b2a"."open_auction_id" ],
 | | | | | | | | single group by (
 | | | | | | | | | single project (
 | | | | | | | | | | & REF 2 
 | | | | | | | | | ) [ "o"."open_auction_id" NOT NULL ]
-| | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" 
NOT NULL ],
-| | | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL UNIQUE HASHCOL  
as "b2a"."id", "bidder"."open_auction_id" NOT NULL as "b2a"."open_auction_id" ]
+| | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" 
NOT NULL ]
 | | | | | | | ) [ ("b2a"."open_auction_id" NOT NULL) = ("o"."open_auction_id" 
NOT NULL) ]
 | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "sys"."max" no nil 
("b2a"."id" NOT NULL UNIQUE HASHCOL ) as "%3"."%3", "o"."open_auction_id" NOT 
NULL ]
 | | | | | ) [ ("b2"."id" NOT NULL UNIQUE HASHCOL ) = ("%3"."%3") ]
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to