Changeset: 582d284829ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/582d284829ef
Modified Files:
sql/server/rel_optimizer.c
Branch: default
Log Message:
When reordering joins, be carefull to not propagate single joins (fixes
sqlancer14)
diffs (69 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
@@ -848,6 +848,7 @@ order_joins(visitor *v, list *rels, list
node *djn;
list *sdje, *n_rels = sa_list(v->sql->sa);
int fnd = 0;
+ unsigned int rsingle;
/* find foreign keys and reorder the expressions on reducing quality */
sdje = find_fk(v->sql, rels, exps);
@@ -894,7 +895,11 @@ order_joins(visitor *v, list *rels, list
and a list of (simple) relations, there are no outer joins
involved, we can simply do a crossproduct here.
*/
+ rsingle = r->single;
+ reset_single(r);
top = rel_crossproduct(v->sql->sa, l, r, op_join);
+ if (rsingle)
+ set_single(r);
rel_join_add_exp(v->sql->sa, top, cje);
/* all other join expressions on these 2 relations */
@@ -959,7 +964,11 @@ order_joins(visitor *v, list *rels, list
append(n_rels, r);
/* create a join using the current expression */
+ rsingle = r->single;
+ reset_single(r);
top = rel_crossproduct(v->sql->sa, top, r,
op_join);
+ if (rsingle)
+ set_single(r);
rel_join_add_exp(v->sql->sa, top, cje);
/* all join expressions on these tables */
@@ -988,10 +997,16 @@ order_joins(visitor *v, list *rels, list
if (list_length(rels)) { /* more relations */
node *n;
for(n=rels->h; n; n = n->next) {
- if (top)
- top = rel_crossproduct(v->sql->sa, top,
n->data, op_join);
- else
- top = n->data;
+ sql_rel *nr = n->data;
+
+ if (top) {
+ rsingle = nr->single;
+ reset_single(nr);
+ top = rel_crossproduct(v->sql->sa, top, nr,
op_join);
+ if (rsingle)
+ set_single(nr);
+ } else
+ top = nr;
}
}
if (list_length(exps)) { /* more expressions (add selects) */
@@ -1084,8 +1099,11 @@ push_in_join_down(mvc *sql, list *rels,
}
/* with this expression find other relation */
if (je && (l = find_rel(rels, je->l)) != NULL) {
+ unsigned int rsingle = r->single;
+ reset_single(r);
sql_rel *nr = rel_crossproduct(sql->sa,
l, r, op_join);
-
+ if (rsingle)
+ set_single(r);
rel_join_add_exp(sql->sa, nr, je);
list_append(rels, nr);
list_remove_data(rels, NULL, l);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list