Changeset: 1bea1a89a7df for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/1bea1a89a7df Modified Files: sql/server/rel_optimize_sel.c Branch: Aug2024 Log Message:
Fix wrong check for complex expressions. diffs (58 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 @@ -2117,7 +2117,7 @@ order_joins(visitor *v, list *rels, list h[ci] = r1[ci] = r2[ci] = 0; r3[ci] = 0; /* h[ci] = exp_find_rels(cje, rels) */ - if (cje->type != e_cmp || is_complex_exp(cje->flag) || !find_prop(cje->p, PROP_HASHCOL) || + if (cje->type != e_cmp || !is_complex_exp(cje->flag) || !find_prop(cje->p, PROP_HASHCOL) || (cje->type == e_cmp && cje->f == NULL)) { cje->tmp = ci; r1[ci] = rels_find_one_rel(rels_a, nr_rels, cje->l); @@ -2138,27 +2138,30 @@ order_joins(visitor *v, list *rels, list /* open problem, some expressions use more than 2 relations */ /* For example a.x = b.y * c.z; */ if (list_length(rels) >= 2 && sdje->h) { - /* get the first expression */ - cje = sdje->h->data; - - /* find the involved relations */ - - /* complex expressions may touch multiple base tables - * Should be pushed up to extra selection. - * */ - if (0 && popcount64(h[cje->tmp]) > 2) - assert(0); - if (cje->type != e_cmp || is_complex_exp(cje->flag) || !find_prop(cje->p, PROP_HASHCOL) || - (cje->type == e_cmp && cje->f == NULL)) { - l = rels_a[r1[cje->tmp]]; - r = rels_a[r2[cje->tmp]]; - rel_mask |= h[cje->tmp]; + for (node *n = sdje->h; n && !l && !r; n = n->next, ci++) { + cje = n->data; + + /* find the involved relations */ + + /* complex expressions may touch multiple base tables + * Should be pushed up to extra selection. + * */ + if (0 && popcount64(h[cje->tmp]) > 2) + assert(0); + if (cje->type != e_cmp || !is_complex_exp(cje->flag) || !find_prop(cje->p, PROP_HASHCOL) || + (cje->type == e_cmp && cje->f == NULL)) { + l = rels_a[r1[cje->tmp]]; + r = rels_a[r2[cje->tmp]]; + if (l && r) + rel_mask |= h[cje->tmp]; + } } cje->tmp = 0; if (l && r && l != r) list_remove_data(sdje, NULL, cje); } + if (l && r && l != r) { list_remove_data(rels, NULL, l); list_remove_data(rels, NULL, r); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org