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