Changeset: cc9beaac01ee for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cc9beaac01ee Modified Files: sql/server/rel_unnest.c Branch: Jun2020 Log Message:
only go through the relational plan once to convert nested relations. diffs (113 lines): 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 @@ -1995,13 +1995,12 @@ exp_in_compare(mvc *sql, sql_exp **l, li /* exp visitor */ static sql_exp * -rewrite_anyequal(mvc *sql, sql_rel *rel, sql_exp *e, int depth, int *changes) +rewrite_anyequal(mvc *sql, sql_rel *rel, sql_exp *e, int depth) { sql_subfunc *sf; if (e->type != e_func) return e; - (void) changes; sf = e->f; if (is_anyequal_func(sf) && !list_empty(e->l)) { list *l = e->l; @@ -2028,7 +2027,7 @@ rewrite_anyequal(mvc *sql, sql_rel *rel, if (!is_tuple && is_values(re) && !exps_have_rel_exp(re->f)) { /* exp_values */ list *vals = re->f; - if (depth == 0 && is_select(rel->op)) + if (is_select(rel->op)) return exp_in_compare(sql, &le, vals, is_anyequal(sf)); else return exp_in_project(sql, &le, vals, is_anyequal(sf)); @@ -2176,13 +2175,12 @@ compare_aggr_op( char *compare, int quan /* exp visitor */ /* rewrite compare expressions including quantifiers any and all */ static sql_exp * -rewrite_compare(mvc *sql, sql_rel *rel, sql_exp *e, int depth, int *changes) +rewrite_compare(mvc *sql, sql_rel *rel, sql_exp *e, int depth) { sql_subfunc *sf; if (e->type != e_func || is_ddl(rel->op)) return e; - (void) changes; sf = e->f; if (is_compare_func(sf) && !list_empty(e->l)) { list *l = e->l; @@ -2456,13 +2454,12 @@ exp_exist(mvc *sql, sql_exp *le, sql_exp /* exp visitor */ static sql_exp * -rewrite_exists(mvc *sql, sql_rel *rel, sql_exp *e, int depth, int *changes) +rewrite_exists(mvc *sql, sql_rel *rel, sql_exp *e, int depth) { sql_subfunc *sf; if (e->type != e_func) return e; - (void) changes; sf = e->f; if (is_exists_func(sf) && !list_empty(e->l)) { list *l = e->l; @@ -2501,9 +2498,12 @@ rewrite_exists(mvc *sql, sql_rel *rel, s if (rel_has_freevar(sql, sq)) ne = le; - if (exp_has_rel(ie)) - if (!rewrite_exp_rel(sql, rel, ie, depth, changes)) + if (exp_has_rel(ie)) { + int changes = 0; + if (!rewrite_exp_rel(sql, rel, ie, depth, &changes)) return NULL; + (void)changes; + } if (is_project(rel->op) && rel_has_freevar(sql, sq)) if (!(le = exp_exist(sql, le, ne, is_exists(sf)))) @@ -2866,6 +2866,27 @@ rewrite_outer2inner_union(mvc *sql, sql_ return rel; } +static sql_exp * +rewrite_complex(mvc *sql, sql_rel *rel, sql_exp *e, int depth, int *changes) +{ + sql_exp *res = NULL; + + (void)changes; + if (e->type != e_func) + return e; + + res = rewrite_anyequal(sql, rel, e, depth); + if (res && res != e) + return res; + res = rewrite_exists(sql, rel, e, depth); + if (res && res != e) + return res; + res = rewrite_compare(sql, rel, e, depth); + if (res && res != e) + return res; + return e; +} + sql_rel * rel_unnest(mvc *sql, sql_rel *rel) { @@ -2881,9 +2902,9 @@ rel_unnest(mvc *sql, sql_rel *rel) rel = rel_visitor_bottomup(sql, rel, &rewrite_aggregates, &changes); rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_rank, &changes); rel = rel_visitor_bottomup(sql, rel, &rewrite_outer2inner_union, &changes); - rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_anyequal, &changes); - rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_exists, &changes); - rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_compare, &changes); + + rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_complex, &changes); + rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_ifthenelse, &changes); /* add isnull handling */ rel = rel_exp_visitor_bottomup(sql, rel, &rewrite_exp_rel, &changes); rel = rel_visitor_bottomup(sql, rel, &rewrite_join2semi, &changes); /* where possible convert anyequal functions into marks */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list