Changeset: f1c125e8dec2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f1c125e8dec2 Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_optimize_sel.c Branch: ordered-set-aggregates Log Message:
only run the grouped topn when needed and don't run normal topn after groupedtopn diffs (63 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -4470,7 +4470,7 @@ rel2bin_project(backend *be, sql_rel *re sql_exp *gbe = n->data; bool last = (!n->next || !is_partitioning((sql_exp*)n->next->data)); - if (!is_partitioning(gbe)) + if (!topn->grouped || !is_partitioning(gbe)) break; /* create group by */ stmt *gbcol = exp_bin(be, gbe, sub, NULL, NULL, NULL, NULL, NULL, 0, 0, 0); @@ -4779,6 +4779,17 @@ rel2bin_groupby(backend *be, sql_rel *re return cursub; } +static bool +has_partitioning( list *exps ) +{ + for(node *n = exps->h; n; n = n->next){ + sql_exp *gbe = n->data; + if (is_partitioning(gbe)) + return true; + } + return false; +} + static stmt * rel2bin_topn(backend *be, sql_rel *rel, list *refs) { @@ -4797,6 +4808,8 @@ rel2bin_topn(backend *be, sql_rel *rel, sub = rel2bin_project(be, rl, refs, rel); } else sub = rel2bin_project(be, rl, refs, rel); + if (rl->grouped && rl->r && has_partitioning(rl->r)) + return sub; } else { sub = subrel_bin(be, rl, refs); } diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c --- a/sql/server/rel_optimize_sel.c +++ b/sql/server/rel_optimize_sel.c @@ -3834,15 +3834,18 @@ rel_push_select_down(visitor *v, sql_rel sql_subfunc *rankf = ranke->f; if (rankf->func->type == F_ANALYTIC) { /* rank functions cannot have a frame */ // For now only for rank/row_number without partition by + sql_rel *tn = NULL; if (strcmp(rankf->func->base.name, "rank") == 0 && is_simple_project(pl->op) && pl->r /* && !rank_exp_has_partition_key(ranke)*/) { - r->l = rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r)); + tn = r->l = rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r)); + tn->grouped = 1; v->changes++; break; } if (strcmp(rankf->func->base.name, "row_number") == 0 && list_empty(r->r) && !is_topn(pl->op) /*&& !rank_exp_has_partition_key(ranke)*/) { - r->l = rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r)); + tn = r->l = rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r)); + tn->grouped = 1; v->changes++; break; } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org