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

Reply via email to