Changeset: b402ba54ed33 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b402ba54ed33 Modified Files: sql/server/rel_unnest.c Branch: Dec2023 Log Message:
small code cleanup and small delayed memory allocation (only once realy needed) diffs (165 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 @@ -2948,11 +2948,9 @@ exp_in_compare(mvc *sql, sql_exp **l, li static inline sql_exp * rewrite_anyequal(visitor *v, sql_rel *rel, sql_exp *e, int depth) { - sql_subfunc *sf; - if (e->type != e_func) - return e; - - sf = e->f; + assert(e->type == e_func); + + sql_subfunc *sf = e->f; if (is_ddl(rel->op)) return e; if (is_anyequal_func(sf) && !list_empty(e->l)) { @@ -3134,11 +3132,12 @@ rewrite_anyequal(visitor *v, sql_rel *re static inline sql_exp * rewrite_compare(visitor *v, sql_rel *rel, sql_exp *e, int depth) { - sql_subfunc *sf; - if (e->type != e_func || is_ddl(rel->op)) + assert(e->type == e_func); + + if (is_ddl(rel->op)) return e; - sf = e->f; + sql_subfunc *sf = e->f; if (is_compare_func(sf) && !list_empty(e->l)) { list *l = e->l; @@ -3190,11 +3189,14 @@ rewrite_compare(visitor *v, sql_rel *rel v->changes++; return exp_compare(v->sql->sa, le, re, compare_str2type(op)); } else { + return e; + /* le = exp_compare_func(v->sql, le, re, op, 0); if (exp_name(e)) exp_prop_alias(v->sql->sa, le, e); v->changes++; return le; + */ } } if (!is_tuple && is_values(re) && !exps_have_rel_exp(re->f)) { /* exp_values */ @@ -3439,11 +3441,9 @@ rewrite_join2semi(visitor *v, sql_rel *r static sql_exp * rewrite_exists(visitor *v, sql_rel *rel, sql_exp *e, int depth) { - sql_subfunc *sf; - if (e->type != e_func) - return e; - - sf = e->f; + assert(e->type == e_func); + + sql_subfunc *sf = e->f; if (is_exists_func(sf) && !list_empty(e->l)) { list *l = e->l; @@ -3702,9 +3702,22 @@ rewrite_fix_count(visitor *v, sql_rel *r sql_rel *r = rel->r; if (!is_rewrite_fix_count_used(r->used)) { - /* TODO create an exp iterator */ - list *rexps = rel_projections(v->sql, r, NULL, 1, 1), *exps; - + list *rexps = r->exps, *exps = NULL; + + if (!is_project(r->op)) + rexps = rel_projections(v->sql, r, NULL, 1, 1); + + for(node *n = rexps->h; n && !rel_changes; n=n->next) { + sql_exp *e = n->data; + + if (exp_is_count(e, r)) + rel_changes = 1; + } + if (!rel_changes) + return rel; + + if (r->exps == rexps) + rexps = rel_projections(v->sql, r, NULL, 1, 1); for(node *n = rexps->h; n; n=n->next) { sql_exp *e = n->data, *ne; @@ -3713,7 +3726,6 @@ rewrite_fix_count(visitor *v, sql_rel *r list *args, *targs; sql_subfunc *isnil = sql_bind_func(v->sql, "sys", "isnull", exp_subtype(e), NULL, F_FUNC, true), *ifthen; - rel_changes = 1; ne = exp_unop(v->sql->sa, e, isnil); set_has_no_nil(ne); targs = sa_list(v->sql->sa); @@ -3731,13 +3743,11 @@ rewrite_fix_count(visitor *v, sql_rel *r n->data = ne; } } - if (rel_changes) { /* add project */ - exps = list_merge(rel_projections(v->sql, rel->l, NULL, 1, 1), rexps, (fdup)NULL); - rel = rel_project(v->sql->sa, rel, exps); - set_processed(rel); - r->used |= rewrite_fix_count_used; - v->changes++; - } + exps = list_merge(rel_projections(v->sql, rel->l, NULL, 1, 1), rexps, (fdup)NULL); + rel = rel_project(v->sql->sa, rel, exps); + set_processed(rel); + r->used |= rewrite_fix_count_used; + v->changes++; } } return rel; @@ -4073,21 +4083,15 @@ rewrite_swap_fullouter(visitor *v, sql_r static sql_exp * rewrite_complex(visitor *v, sql_rel *rel, sql_exp *e, int depth) { - sql_exp *res = NULL; - if (e->type != e_func) return e; - res = rewrite_anyequal(v, rel, e, depth); - if (!res || res != e) - return res; - res = rewrite_exists(v, rel, e, depth); - if (!res || res != e) - return res; - res = rewrite_compare(v, rel, e, depth); - if (!res || res != e) - return res; - return e; + sql_exp *res = rewrite_anyequal(v, rel, e, depth); + if (res == e) + res = rewrite_exists(v, rel, e, depth); + if (res == e) + res = rewrite_compare(v, rel, e, depth); + return res; } static sql_rel * @@ -4137,6 +4141,9 @@ rewrite_values(visitor *v, sql_rel *rel) if (!is_simple_project(rel->op) || list_empty(rel->exps) || is_rewrite_values_used(rel->used)) return rel; + sql_exp *e = rel->exps->h->data; + if (!is_values(e) || (!exps_have_rel_exp(rel->exps) && !exps_have_freevar(v->sql, rel->exps))) + return rel; if (rel_is_ref(rel)) { /* need extra project */ rel->l = rel_project(v->sql->sa, rel->l, rel->exps); rel->exps = rel_projections(v->sql, rel->l, NULL, 1, 1); @@ -4146,9 +4153,6 @@ rewrite_values(visitor *v, sql_rel *rel) v->changes++; return rel; } - sql_exp *e = rel->exps->h->data; - if (!is_values(e) || (!exps_have_rel_exp(rel->exps) && !exps_have_freevar(v->sql, rel->exps))) - return rel; return flatten_values(v, rel); } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org