Changeset: 585533cbb202 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/585533cbb202
Modified Files:
        sql/backends/monet5/rel_physical.c
        sql/backends/monet5/rel_pphash.c
Branch: pp_hashjoin
Log Message:

improvements in finding payload


diffs (94 lines):

diff --git a/sql/backends/monet5/rel_physical.c 
b/sql/backends/monet5/rel_physical.c
--- a/sql/backends/monet5/rel_physical.c
+++ b/sql/backends/monet5/rel_physical.c
@@ -458,29 +458,41 @@ do_oahash_join(sql_rel *rel)
 }
 
 static void
-find_payload_exps(mvc *sql, list **exps_hsh, list **exps_prb, const list 
*exps, sql_rel *rel_hsh, sql_rel *rel_prb, const list *attr)
+find_payload_exps(mvc *sql, list **exps_hsh, list **exps_prb, sql_rel *p, 
sql_rel *rel_hsh, sql_rel *rel_prb, const list *attr)
 {
-       assert(exps);
-
        /* Find out if an expression of the exps belong to rel_hsh or
         * rel_prb or is a constant. */
-       for (node *n = exps->h; n; n = n->next) { /* TODO handle consts 
seperate */
-               sql_exp *e = n->data, *ne = NULL;
+       list *exps = p->exps;
+       if ((p->op == op_buildhash || p->op == op_probehash) && p->attr) {
+               if (!exps)
+                       exps = p->attr;
+               else
+                       exps = list_merge(list_dup(exps, NULL), p->attr, NULL);
+       }
+       if (is_select(p->op) || is_join(p->op))
+               exps = NULL;
+       if (exps_hsh) {
+               sql_rel *rel = rel_hsh->op == op_buildhash ? rel_hsh->l : 
rel_hsh;
+               list *iexps = rel->exps;
+               if (!is_project(rel->op))
+                       iexps = rel_projections(sql, rel, NULL, 0, 1);
 
-               if (list_find_exp(attr, e))
-                       continue;
-               if (exp_is_atom(e))
-                       continue;
-               if ((ne = rel_find_exp(rel_prb->l, e)) != NULL) {
-                       if (exp_is_atom(ne))
-                               ne = e;
-                       append(*exps_prb, exp_ref(sql, ne));
-               } else if (exps_hsh) {
-                       ne = rel_find_exp(rel_hsh, e);
-                       if (exp_is_atom(ne))
-                               ne = e;
-                       assert(ne);
-                       append(*exps_hsh, exp_ref(sql, ne));
+               for (node *n = iexps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+                       if (!exps || exps_uses_exp(exps, e))
+                               append(*exps_hsh, exp_ref(sql, e));
+               }
+       }
+       if (exps_prb) {
+               sql_rel *rel = rel_prb->l;
+               list *iexps = rel->exps;
+               if (!is_project(rel->op))
+                       iexps = rel_projections(sql, rel, NULL, 0, 1);
+
+               for (node *n = iexps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+                       if (!exps || exps_uses_exp(exps, e))
+                               append(*exps_prb, exp_ref(sql, e));
                }
        }
 }
@@ -775,7 +787,7 @@ rel_pipeline(visitor *v, sql_rel *rel, b
                list *exps_hsh = NULL, *exps_prb = rel_prb->exps = 
sa_list(v->sql->sa);
                if (needs_payload)
                        exps_hsh = sa_list(v->sql->sa);
-               find_payload_exps(v->sql, &exps_hsh, &exps_prb, p->exps, 
rel_hsh, rel_prb, rel->attr);
+               find_payload_exps(v->sql, &exps_hsh, &exps_prb, p, rel_hsh, 
rel_prb, rel->attr);
 
                if (need_all && !is_base(rel_hsh->op))
                        rel_hsh->exps = 
!rel_hsh->exps?rel_hsh->attr:list_distinct(list_merge(rel_hsh->exps, 
rel_hsh->attr, NULL), (fcmp) exp_equal, NULL);
@@ -938,7 +950,7 @@ rel_pipeline(visitor *v, sql_rel *rel, b
                        }
 
                        list *exps_hsh = sa_list(v->sql->sa), *exps_prb = 
sa_list(v->sql->sa);
-                       find_payload_exps(v->sql, &exps_hsh, &exps_prb, 
p->exps, rel_hsh, rel_prb, rel->attr);
+                       find_payload_exps(v->sql, &exps_hsh, &exps_prb, p, 
rel_hsh, rel_prb, rel->attr);
 
                        if (found_exps_prj_hsh) {
                                printf("# todo need to check prj\n");
diff --git a/sql/backends/monet5/rel_pphash.c b/sql/backends/monet5/rel_pphash.c
--- a/sql/backends/monet5/rel_pphash.c
+++ b/sql/backends/monet5/rel_pphash.c
@@ -144,7 +144,7 @@ oahash_probe(backend *be, sql_rel *rel, 
                stmt *key = exp_bin(be, e, sub, NULL, NULL, NULL, NULL, NULL, 
0, 0, 0);
                assert(key); /* must find */
                key = column(be, key);
-               bool single = ((rel->single == 1) && (n->next == NULL) && 
!has_outerselect);
+               bool single = ((rel->single == 1 && rel->op != op_semi) && 
(n->next == NULL) && !has_outerselect);
                bool eq = (e2->flag == cmp_equal) && !anti;
                bool grpjoin = groupjoin && is_any(e2);
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to