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