Changeset: 7bf2478b3374 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7bf2478b3374 Modified Files: sql/server/rel_unnest.c Branch: Aug2024 Log Message:
Eliminates op_union creation diffs (219 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 @@ -1497,6 +1497,7 @@ push_up_set(mvc *sql, sql_rel *rel, list /* left of rel should be a set */ if (d && is_distinct_set(sql, d, ad) && s && is_set(s->op)) { + assert(s->op != op_union); sql_rel *sl = s->l, *sr = s->r, *ns; sl = rel_project(sql->sa, rel_dup(sl), rel_projections(sql, sl, NULL, 1, 1)); @@ -1557,10 +1558,12 @@ push_up_set(mvc *sql, sql_rel *rel, list ns->r = rel_project(sql->sa, ns->r, rel_projections(sql, ns->r, NULL, 1, 1)); if (is_semi(rel->op)) /* only push left side of semi/anti join */ ns->exps = rel_projections(sql, ns->l, NULL, 1, 1); - if (rel->op == op_anti && s->op == op_union) - ns->op = op_inter; - if (rel->op == op_anti && s->op == op_inter) - ns->op = op_union; + if (rel->op == op_anti && s->op == op_inter) { + list *urs = sa_list(sql->sa); + urs = append(urs, ns->l); + urs = append(urs, ns->r); + rel_inplace_setop_n_ary(sql, ns, urs, op_munion, ns->exps); + } rel_destroy(rel); return ns; } @@ -3005,8 +3008,11 @@ rel_union_exps(mvc *sql, sql_exp **l, li if (!u) { u = sq; } else { - u = rel_setop(sql->sa, u, sq, op_union); - rel_setop_set_exps(sql, u, exps, false); + list *urs = sa_list(sql->sa); + urs = append(urs, u); + urs = append(urs, sq); + u = rel_setop_n_ary(sql->sa, urs, op_munion); + rel_setop_n_ary_set_exps(sql, u, exps, false); set_distinct(u); set_processed(u); } @@ -3688,6 +3694,7 @@ rewrite_ifthenelse(visitor *v, sql_rel * )[not(cond) or cond is null] ) [ cols ] */ sql_rel *lsq = NULL, *rsq = NULL, *usq = NULL; + list *urs = sa_list(v->sql->sa); if (exp_has_rel(then_exp)) { lsq = exp_rel_get_rel(v->sql->sa, then_exp); @@ -3720,8 +3727,10 @@ rewrite_ifthenelse(visitor *v, sql_rel * set_processed(rsq); rsq = rel_select(v->sql->sa, rsq, not_cond); set_processed(rsq); - usq = rel_setop(v->sql->sa, lsq, rsq, op_union); - rel_setop_set_exps(v->sql, usq, append(sa_list(v->sql->sa), exp_ref(v->sql, e)), false); + urs = append(urs, lsq); + urs = append(urs, rsq); + usq = rel_setop_n_ary(v->sql->sa, urs, op_munion); + rel_setop_n_ary_set_exps(v->sql, usq, append(sa_list(v->sql->sa), exp_ref(v->sql, e)), false); if (single) set_single(usq); set_processed(usq); @@ -3888,7 +3897,7 @@ rewrite_groupings(visitor *v, sql_rel *r /* ROLLUP, CUBE, GROUPING SETS cases */ if ((found = find_prop(rel->p, PROP_GROUPINGS))) { list *sets = (list*) found->value.pval; - sql_rel *unions = NULL; + list *grpr = sa_list(v->sql->sa); rel->p = prop_remove(rel->p, found); /* remove property */ for (node *n = sets->h ; n ; n = n->next) { @@ -3980,27 +3989,20 @@ rewrite_groupings(visitor *v, sql_rel *r } nrel = rel_project(v->sql->sa, nrel, pexps); set_processed(nrel); - - if (!unions) - unions = nrel; - else { - unions = rel_setop(v->sql->sa, unions, nrel, op_union); - rel_setop_set_exps(v->sql, unions, rel_projections(v->sql, rel, NULL, 1, 1), false); - set_processed(unions); - } - if (!unions) - return unions; + grpr = append(grpr, nrel); } + /* always do relation inplace, so it will be fine when the input group has more than 1 reference */ - if (is_union(unions->op)) { - rel = rel_inplace_setop(v->sql, rel, unions->l, unions->r, op_union, unions->exps); + assert(list_length(grpr) > 0); + if (list_length(grpr) == 0) { + return NULL; + } else if (list_length(grpr) == 1) { + sql_rel *grp = grpr->h->data; + rel = rel_inplace_project(v->sql->sa, rel, grp, grp->exps); } else { - assert(is_simple_project(unions->op)); - rel = rel_inplace_project(v->sql->sa, rel, unions->l, unions->exps); - rel->card = exps_card(unions->exps); + rel = rel_inplace_setop_n_ary(v->sql, rel, grpr, op_munion, rel_projections(v->sql, rel, NULL, 1, 1)); } - unions->l = unions->r = NULL; - rel_destroy(unions); + v->changes++; return rel; } else { @@ -4122,8 +4124,11 @@ rewrite_outer2inner_union(visitor *v, sq if (!nilrel) return NULL; - sql_rel *nrel = rel_setop(v->sql->sa, prel, nilrel, op_union); - rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1), false); + list *urs = sa_list(v->sql->sa); + urs = append(urs, prel); + urs = append(urs, nilrel); + sql_rel *nrel = rel_setop_n_ary(v->sql->sa, urs, op_munion); + rel_setop_n_ary_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(nrel); if(is_single(rel)) set_single(nrel); @@ -4145,8 +4150,11 @@ rewrite_outer2inner_union(visitor *v, sq if (!nilrel) return NULL; - sql_rel *nrel = rel_setop(v->sql->sa, prel, nilrel, op_union); - rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1), false); + list *urs = sa_list(v->sql->sa); + urs = append(urs, prel); + urs = append(urs, nilrel); + sql_rel *nrel = rel_setop_n_ary(v->sql->sa, urs, op_munion); + rel_setop_n_ary_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(nrel); if(is_single(rel)) set_single(nrel); @@ -4177,12 +4185,15 @@ rewrite_outer2inner_union(visitor *v, sq if (!rrel) return NULL; - lrel = rel_setop(v->sql->sa, lrel, rrel, op_union); - rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1), false); + list *urs = sa_list(v->sql->sa); + /* order matters (see caller logic) */ + urs = append(urs, prel); + urs = append(urs, lrel); + urs = append(urs, rrel); + lrel = rel_setop_n_ary(v->sql->sa, urs, op_munion); + rel_setop_n_ary_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(lrel); - lrel = rel_setop(v->sql->sa, prel, lrel, op_union); - rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1), false); - set_processed(lrel); + if(is_single(rel)) set_single(lrel); v->changes++; @@ -4223,11 +4234,12 @@ flatten_values(visitor *v, sql_rel *rel) { list *exps = sa_list(v->sql->sa); sql_exp *e = rel->exps->h->data; - sql_rel *cur = NULL; + sql_rel *nrel = NULL; list *vals = exp_get_values(e); if (vals) { + list *urs = sa_list(v->sql->sa); for(int i = 0; i<list_length(vals); i++) { - sql_rel *nrel = rel_project(v->sql->sa, NULL, sa_list(v->sql->sa)); + nrel = rel_project(v->sql->sa, NULL, sa_list(v->sql->sa)); set_processed(nrel); for(node *n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; @@ -4242,17 +4254,23 @@ flatten_values(visitor *v, sql_rel *rel) rel_set_exps(nrel, nrel->exps); } } - if (cur) { - nrel = rel_setop(v->sql->sa, cur, nrel, op_union); - rel_setop_set_exps(v->sql, nrel, exps, false); - set_processed(nrel); - } - cur = nrel; + urs = append(urs, nrel); } - if (is_single(rel)) - set_single(cur); - rel_destroy(rel); - rel = cur; + + if (list_length(urs) == 1) { + if (is_single(rel)) + set_single(nrel); + rel_destroy(rel); + rel = nrel; + } else { + nrel = rel_setop_n_ary(v->sql->sa, urs, op_munion); + rel_setop_n_ary_set_exps(v->sql, nrel, exps, false); + if (is_single(rel)) + set_single(nrel); + rel_destroy(rel); + rel = nrel; + } + v->changes++; } return rel; @@ -4305,7 +4323,9 @@ rewrite_rel(visitor *v, sql_rel *rel) if (!rel || or == rel) return rel; /* change referenced project into join with outer(ir) */ - sql_rel *nr = rel->l; + /*sql_rel *nr = rel->l;*/ + assert(is_munion(rel->op)); + sql_rel *nr = ((list*)rel->l)->h->data; assert(is_project(nr->op)); if (!rel_is_ref(nr)) nr = nr->l; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org