Changeset: e4dfc761cfb1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e4dfc761cfb1
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_unnest.c
Branch: default
Log Message:

Don't use visitors to evaluate a predicate, because they cannot exit earlier if 
the predicate is validated


diffs (78 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2319,7 +2319,7 @@ exp_has_sideeffect( sql_exp *e )
        return 0;
 }
 
-static int
+int
 exps_have_unsafe(list *exps, int allow_identity)
 {
        int unsafe = 0;
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -162,6 +162,7 @@ extern sql_exp *exp_rel_update_exp(mvc *
 extern sql_exp *exp_rel_label(mvc *sql, sql_exp *e);
 extern int exps_are_atoms(list *exps);
 extern int exp_has_func(sql_exp *e);
+extern int exps_have_unsafe(list *exps, int allow_identity);
 extern int exp_unsafe(sql_exp *e, int allow_identity);
 extern int exp_has_sideeffect(sql_exp *e);
 
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -2324,27 +2324,6 @@ exps_exp_visitor_bottomup(visitor *v, sq
 }
 
 static sql_exp *
-exp_check_has_analytics(visitor *v, sql_rel *rel, sql_exp *e, int depth)
-{
-       (void)rel; (void)depth;
-       if (e && e->type == e_func) {
-               sql_subfunc *f = e->f;
-
-               if (f && f->func && f->func->type == F_ANALYTIC)
-                       v->changes++;
-       }
-       return e;
-}
-
-int
-exps_have_analytics(mvc *sql, list *exps)
-{
-       visitor v = { .sql = sql };
-       (void)exps_exp_visitor_topdown(&v, NULL, exps, 0, 
&exp_check_has_analytics, true);
-       return v.changes;
-}
-
-static sql_exp *
 _rel_rebind_exp(visitor *v, sql_rel *rel, sql_exp *e, int depth)
 {
        (void)depth;
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -139,8 +139,6 @@ extern sql_rel *rel_exp_visitor_bottomup
 extern list *exps_exp_visitor_topdown(visitor *v, sql_rel *rel, list *exps, 
int depth, exp_rewrite_fptr exp_rewriter, bool relations_topdown);
 extern list *exps_exp_visitor_bottomup(visitor *v, sql_rel *rel, list *exps, 
int depth, exp_rewrite_fptr exp_rewriter, bool relations_topdown);
 
-extern int exps_have_analytics(mvc *sql, list *exps);
-
 typedef sql_rel *(*rel_rewrite_fptr)(visitor *v, sql_rel *rel);
 extern sql_rel *rel_visitor_topdown(visitor *v, sql_rel *rel, rel_rewrite_fptr 
rel_rewriter);
 extern sql_rel *rel_visitor_bottomup(visitor *v, sql_rel *rel, 
rel_rewrite_fptr rel_rewriter);
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1479,7 +1479,7 @@ rel_unnest_dependent(mvc *sql, sql_rel *
                                }
                        }
 
-                       if (r && is_simple_project(r->op) && 
((!exps_have_freevar(sql, r->exps) && !exps_have_analytics(sql, r->exps)) || 
is_distinct_set(sql, l, ad))) {
+                       if (r && is_simple_project(r->op) && 
((!exps_have_freevar(sql, r->exps) && !exps_have_unsafe(r->exps, 1)) || 
is_distinct_set(sql, l, ad))) {
                                rel = push_up_project(sql, rel, ad);
                                return rel_unnest_dependent(sql, rel);
                        }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to