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 -- [email protected]
To unsubscribe send an email to [email protected]