Changeset: 36a9402c22b5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=36a9402c22b5
Modified Files:
        sql/server/rel_optimizer.c
Branch: Oct2014
Log Message:

fixed push topn down, also include the order by columns, solves bug 3547.


diffs (54 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
@@ -204,7 +204,8 @@ list_find_exp( list *exps, sql_exp *e)
 {
        sql_exp *ne = NULL;
 
-       assert(e->type == e_column);
+       if (e->type != e_column)
+               return NULL;
        if ((e->l && (ne=exps_bind_column2(exps, e->l, e->r)) != NULL) ||
            ((ne=exps_bind_column(exps, e->r, NULL)) != NULL))
                return ne;
@@ -1733,6 +1734,7 @@ rel_push_topn_down(int *changes, mvc *sq
                        sql_rel *u = rp, *ou = u, *x;
                        sql_rel *ul = u->l;
                        sql_rel *ur = u->r;
+                       int add_r = 0;
 
                        /* only push topn once */
                        x = ul;
@@ -1746,6 +1748,8 @@ rel_push_topn_down(int *changes, mvc *sq
                        if (x && x->op == op_topn)
                                return rel;
 
+                       if (list_length(ul->exps) > list_length(r->exps))
+                               add_r = 1;
                        ul = rel_dup(ul);
                        ur = rel_dup(ur);
                        if (!is_project(ul->op)) 
@@ -1760,14 +1764,23 @@ rel_push_topn_down(int *changes, mvc *sq
                        /* introduce projects under the set */
                        ul = rel_project(sql->sa, ul, NULL);
                        ul->exps = exps_copy(sql->sa, r->exps);
+                       /* possibly add order by column */
+                       if (add_r)
+                               ul->exps = list_merge(ul->exps, 
exps_copy(sql->sa, r->r), NULL);
                        ul->r = exps_copy(sql->sa, r->r);
                        ul = rel_topn(sql->sa, ul, sum_limit_offset(sql, 
rel->exps));
                        ur = rel_project(sql->sa, ur, NULL);
                        ur->exps = exps_copy(sql->sa, r->exps);
+                       /* possibly add order by column */
+                       if (add_r)
+                               ur->exps = list_merge(ur->exps, 
exps_copy(sql->sa, r->r), NULL);
                        ur->r = exps_copy(sql->sa, r->r);
                        ur = rel_topn(sql->sa, ur, sum_limit_offset(sql, 
rel->exps));
                        u = rel_setop(sql->sa, ul, ur, op_union);
                        u->exps = exps_copy(sql->sa, r->exps); 
+                       /* possibly add order by column */
+                       if (add_r)
+                               u->exps = list_merge(u->exps, 
exps_copy(sql->sa, r->r), NULL);
                        /* zap names */
                        rel_no_rename_exps(u->exps);
                        rel_destroy(ou);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to