Changeset: af680d55374e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/af680d55374e Modified Files: sql/server/rel_optimize_sel.c Branch: Aug2024 Log Message:
fix join order for filter functions diffs (69 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 @@ -2029,7 +2029,7 @@ find_fk( mvc *sql, list *rels, list *exp } static int -rels_find_one_rel( sql_rel **rels, int nr, sql_exp *e) +exp_find_one_rel( sql_rel **rels, int nr, sql_exp *e) { int fnd = 0; @@ -2043,6 +2043,22 @@ rels_find_one_rel( sql_rel **rels, int n return fnd; } +static int +exps_find_one_rel( sql_rel **rels, int nr, list *exps) +{ + int fnd = 0; + + for(node *n = exps->h; n; n = n->next) { + int nfnd = exp_find_one_rel(rels, nr, n->data); + if (nfnd != fnd && fnd) + return 0; + fnd = nfnd; + if (!fnd) + return 0; + } + return fnd; +} + /* TODO move popcount and popcount64 into gdk_*.h, used in gdk_cand, strimps and here */ static inline int popcount64(uint64_t x) @@ -2116,18 +2132,16 @@ 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) || - (cje->type == e_cmp && cje->f == NULL)) { + if (cje->type == e_cmp) { cje->tmp = ci; - r1[ci] = rels_find_one_rel(rels_a, nr_rels, cje->l); - r2[ci] = rels_find_one_rel(rels_a, nr_rels, cje->r); + r1[ci] = cje->flag == cmp_filter ? exps_find_one_rel(rels_a, nr_rels, cje->l) : exp_find_one_rel(rels_a, nr_rels, cje->l); + r2[ci] = cje->flag == cmp_filter ? exps_find_one_rel(rels_a, nr_rels, cje->r) : exp_find_one_rel(rels_a, nr_rels, cje->r); if (r1[ci]) h[ci] |= ((ulng)1)<<((r1[ci]-1)%64); if (r2[ci]) h[ci] |= ((ulng)1)<<((r2[ci]-1)%64); - if (cje->f) { - r3[ci] = rels_find_one_rel(rels_a, nr_rels, cje->f); + if (cje->f && cje->flag != cmp_filter) { + r3[ci] = exp_find_one_rel(rels_a, nr_rels, cje->f); if (r3[ci] == r2[ci]) r3[ci] = 0; if (r3[ci]) @@ -2148,8 +2162,7 @@ order_joins(visitor *v, list *rels, list * */ 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)) { + if (cje->type == e_cmp) { l = rels_a[r1[cje->tmp]]; r = rels_a[r2[cje->tmp]]; if (l && r) _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org