Changeset: e4a0efd1b334 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e4a0efd1b334
Modified Files:
sql/server/rel_optimizer.c
Branch: default
Log Message:
push a topn under a union
diffs (36 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1847,6 +1847,32 @@ rel_push_topn_down(int *changes, mvc *sq
if (r && r->op == op_project && need_distinct(r))
return rel;
+ /* duplicate topn direct under union */
+
+ if (r && r->exps && r->op == op_union && !(rel_is_ref(r)) &&
r->l) {
+ sql_rel *u = r, *x;
+ sql_rel *ul = u->l;
+ sql_rel *ur = u->r;
+
+ /* only push topn once */
+ x = ul;
+ while(x->op == op_project && x->l)
+ x = x->l;
+ if (x && x->op == op_topn)
+ return rel;
+ x = ur;
+ while(x->op == op_project && x->l)
+ x = x->l;
+ if (x && x->op == op_topn)
+ return rel;
+
+ ul = rel_topn(sql->sa, ul, sum_limit_offset(sql,
rel->exps));
+ ur = rel_topn(sql->sa, ur, sum_limit_offset(sql,
rel->exps));
+ u->l = ul;
+ u->r = ur;
+ (*changes)++;
+ return rel;
+ }
/* duplicate topn + [ project-order ] under union */
if (r)
rp = r->l;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list