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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list