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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to