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 -- [email protected]
To unsubscribe send an email to [email protected]