Changeset: 4fc3d574bdcd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4fc3d574bdcd
Modified Files:
        sql/server/rel_optimize_sel.c
        sql/server/rel_rewriter.c
Branch: pp_hashjoin
Log Message:

improve uniqueness check and redundant join removal


diffs (36 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
@@ -150,8 +150,9 @@ rel_remove_redundant_join_(visitor *v, s
                if (l->l && is_project(l->op) && is_groupby(gb->op)) {
                        sql_rel *inner = l->l;
                        sql_rel *gbj = gb->l;
-                       if (rel_is_ref(inner) && is_project(inner->op) && 
(need_distinct(inner) || is_groupby(inner->op)) &&
-                           gbj->op == op_join && list_length(inner->r) == 
list_length(rel->exps)) {
+                       bool ue = false;
+                       if (rel_is_ref(inner) && is_project(inner->op) && 
(need_distinct(inner) || (ue = exps_unique(v->sql, inner->l, inner->exps, 
true)) || is_groupby(inner->op)) &&
+                           gbj->op == op_join && ((!ue && 
list_length(inner->r) == list_length(rel->exps)) || (ue && list_length(l->exps) 
== list_length(rel->exps)))) {
                                sql_rel *gbjl = gbj->l, *gbjr = gbj->r;
                                if ((gbjl->l && is_project(gbjl->op) && inner 
== gbjl->l) ||
                                        (gbjr->l && is_project(gbjr->op) && 
inner == gbjr->l)) {
@@ -3679,8 +3680,6 @@ reorder_join(visitor *v, sql_rel *rel)
                        int cnt = list_length(exps);
                        rel->exps = exps;
                        if (list_length(rel->exps) != cnt) {
-                               ATOMIC_TYPE oahash_mask = (1U<<19);
-                               bool oahash_enabled = (GDKdebug & oahash_mask);
                                if (oahash_enabled)
                                        rel->exps = 
order_join_expressions_pp(v->sql, exps, rels);
                                else
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -489,6 +489,8 @@ rel_is_unique(sql_rel *rel)
        case op_except:
        case op_topn:
        case op_sample:
+       case op_select:
+       case op_project:
                return rel_is_unique(rel->l);
        case op_table:
        case op_basetable:
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to