Changeset: ea9adedddb9f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea9adedddb9f Modified Files: sql/server/rel_optimizer.c sql/server/rel_rewriter.c sql/server/rel_rewriter.h sql/server/rel_unnest.c Branch: default Log Message:
Call rel_remove_empty_select if expressions at rel_unnest diffs (113 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -25,9 +25,7 @@ typedef struct global_props { int cnt[ddl_maxops]; } global_props; -static sql_rel * rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes); - -static sql_subfunc *find_func( mvc *sql, char *name, list *exps ); +static sql_subfunc *find_func(mvc *sql, char *name, list *exps); /* The important task of the relational optimizer is to optimize the join order. @@ -4683,34 +4681,6 @@ rel_push_select_down_join(mvc *sql, sql_ return rel; } -static sql_rel * -rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes) -{ - (void)sql; - - if ((is_join(rel->op) || is_semi(rel->op) || is_select(rel->op) || is_project(rel->op) || is_topn(rel->op) || is_sample(rel->op)) && rel->l) { - sql_rel *l = rel->l; - if (is_select(l->op) && !(rel_is_ref(l)) && list_empty(l->exps)) { - rel->l = l->l; - l->l = NULL; - rel_destroy(l); - (*changes)++; - } - } - if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && rel->r) { - sql_rel *r = rel->r; - if (is_select(r->op) && !(rel_is_ref(r)) && list_empty(r->exps)) { - rel->r = r->l; - r->l = NULL; - rel_destroy(r); - (*changes)++; - } - } - if (is_join(rel->op) && list_empty(rel->exps)) - rel->exps = NULL; /* crossproduct */ - return rel; -} - /* * Push {semi}joins down, pushes the joins through group by expressions. * When the join is on the group by columns, we can push the joins left 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 @@ -163,3 +163,31 @@ rewrite_simplify(mvc *sql, sql_rel *rel, rel->exps = exps_simplify_exp(sql, rel->exps, changes); return rel; } + +sql_rel * +rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes) +{ + (void)sql; + + if ((is_join(rel->op) || is_semi(rel->op) || is_select(rel->op) || is_project(rel->op) || is_topn(rel->op) || is_sample(rel->op)) && rel->l) { + sql_rel *l = rel->l; + if (is_select(l->op) && !(rel_is_ref(l)) && list_empty(l->exps)) { + rel->l = l->l; + l->l = NULL; + rel_destroy(l); + (*changes)++; + } + } + if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && rel->r) { + sql_rel *r = rel->r; + if (is_select(r->op) && !(rel_is_ref(r)) && list_empty(r->exps)) { + rel->r = r->l; + r->l = NULL; + rel_destroy(r); + (*changes)++; + } + } + if (is_join(rel->op) && list_empty(rel->exps)) + rel->exps = NULL; /* crossproduct */ + return rel; +} diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h --- a/sql/server/rel_rewriter.h +++ b/sql/server/rel_rewriter.h @@ -14,5 +14,6 @@ extern sql_exp *rewrite_simplify_exp(mvc *sql, sql_rel *rel, sql_exp *e, int depth); extern sql_rel *rewrite_simplify(mvc *sql, sql_rel *rel, int *changes); +extern sql_rel *rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes); #endif /*_REL_REWRITER_H_*/ 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 @@ -2646,12 +2646,13 @@ rel_unnest(mvc *sql, sql_rel *rel) { int changes = 0; - (void) changes; rel_reset_subquery(rel); rel = rel_exp_visitor(sql, rel, &rewrite_simplify_exp); rel = rel_visitor_bottomup(sql, rel, &rewrite_simplify, &changes); + rel = rel_visitor_bottomup(sql, rel, &rewrite_or_exp, &changes); + if (changes > 0) + rel = rel_visitor_bottomup(sql, rel, &rel_remove_empty_select, &changes); rel = rel_visitor_bottomup(sql, rel, &rewrite_aggregates, &changes); - rel = rel_visitor_bottomup(sql, rel, &rewrite_or_exp, &changes); rel = rel_exp_visitor(sql, rel, &rewrite_rank); rel = rel_exp_visitor(sql, rel, &rewrite_anyequal); rel = rel_exp_visitor(sql, rel, &rewrite_exists); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list