Changeset: 9c8d4f0cc893 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c8d4f0cc893
Modified Files:
sql/server/rel_unnest.c
Branch: subquery
Log Message:
handle topn in unnest
diffs (81 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
@@ -69,7 +69,7 @@ rel_has_freevar( sql_rel *rel )
else if (is_base(rel->op))
return exps_have_freevar(rel->exps) ||
(rel->l && rel_has_freevar(rel->l));
- else if (is_simple_project(rel->op) || is_groupby(rel->op) ||
is_select(rel->op))
+ else if (is_simple_project(rel->op) || is_groupby(rel->op) ||
is_select(rel->op) || is_topn(rel->op) || is_sample(rel->op))
return exps_have_freevar(rel->exps) ||
(rel->l && rel_has_freevar(rel->l));
else if (is_join(rel->op) || is_set(rel->op) || is_semi(rel->op) ||
is_modify(rel->op))
@@ -337,7 +337,7 @@ static sql_rel *
push_up_project(mvc *sql, sql_rel *rel)
{
/* input rel is dependent outerjoin with on the right a project, we
first try to push inner side expressions down (because these cannot be pushed
up) */
- if (rel && is_outerjoin(rel->op) && is_dependent(rel)) {
+ if (rel && is_outerjoin(rel->op) && is_dependent(rel) && 0) {
sql_rel *r = rel->r;
/* find constant expressions and move these down */
@@ -389,10 +389,10 @@ push_up_project(mvc *sql, sql_rel *rel)
sql_exp *e = m->data;
if (!e->freevar || exp_name(e)) { /* only skip
full freevars */
- append(n->exps, e);
if (exp_has_freevar(e))
rel_bind_var(sql, rel->l, e);
}
+ append(n->exps, e);
}
assert(!r->r);
/* remove old project */
@@ -402,8 +402,7 @@ push_up_project(mvc *sql, sql_rel *rel)
return n;
}
}
- /* a dependent semi/anti join with a project on the right side, could
be removed, later we could add renaming */
- /* renames could be needed for the join expressions */
+ /* a dependent semi/anti join with a project on the right side, could
be removed */
if (rel && is_semi(rel->op) && is_dependent(rel)) {
sql_rel *r = rel->r;
@@ -422,6 +421,25 @@ push_up_project(mvc *sql, sql_rel *rel)
}
static sql_rel *
+push_up_topn(mvc *sql, sql_rel *rel)
+{
+ /* a dependent semi/anti join with a project on the right side, could
be removed */
+ if (rel && (is_semi(rel->op) || is_join(rel->op)) && is_dependent(rel))
{
+ sql_rel *r = rel->r;
+
+ if (r && r->op == op_topn) {
+ /* remove old topn */
+ rel->r = r->l;
+ rel = rel_topn(sql->sa, rel, r->exps);
+ r->l = NULL;
+ rel_destroy(r);
+ return rel;
+ }
+ }
+ return rel;
+}
+
+static sql_rel *
push_up_select(mvc *sql, sql_rel *rel)
{
/* input rel is dependent join with on the right a project */
@@ -790,6 +808,11 @@ rel_unnest_dependent(mvc *sql, sql_rel *
return rel_unnest_dependent(sql, rel);
}
+ if (r && is_topn(r->op)) {
+ rel = push_up_topn(sql, rel);
+ return rel_unnest_dependent(sql, rel);
+ }
+
if (r && is_select(r->op)) {
rel = push_up_select(sql, rel);
return rel_unnest_dependent(sql, rel);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list