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

Reply via email to