Changeset: 7d28d093c817 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d28d093c817
Modified Files:
        sql/server/rel_optimizer.c
Branch: Jul2017
Log Message:

fixed bug 6449


diffs (64 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
@@ -8324,11 +8324,11 @@ rel_find_conflicts(mvc *sql, sql_rel *re
                        exps_find_conflicts(sql, rel->exps, exps, conflicts);
                exps_mark_conflicts(sql, rel->exps, conflicts, 1); 
                return rel;
+       case op_select: 
+               exps_find_conflicts(sql, rel->exps, exps, conflicts);
+               /* fall through */
        case op_topn: 
        case op_sample: 
-               return rel;
-       case op_select: 
-               exps_find_conflicts(sql, rel->exps, exps, conflicts);
                rel->l = rel_find_conflicts(sql, rel->l, exps, conflicts);
                return rel;
        case op_project:
@@ -8472,7 +8472,7 @@ rel_apply(mvc *sql, sql_rel *l, sql_rel 
 static sql_rel *
 rel_apply_rewrite(int *changes, mvc *sql, sql_rel *rel) 
 {
-       sql_rel *l, *r;
+       sql_rel *l, *r, *topn = NULL;
 
        if (rel->op == op_project && rel->exps) { /* check card */
                node *n;
@@ -8592,14 +8592,17 @@ rel_apply_rewrite(int *changes, mvc *sql
                (*changes)++;
                return l;
        }
+       if (r->op == op_topn || r->op == op_sample) {
+               /* first handle project, then topn/sample */
+               topn = rel_dup(r);
+               r = r->l;
+       }
        if (r->op == op_project) { /* merge projections */
                if (!r->l) { 
                        sql_rel *nrel = rel_dup(l);
 
                        rel_destroy(rel);
                        rel = nrel;
-                       (*changes)++;
-                       return rel;
                } else {
                        list *p = rel_projections(sql, l, NULL, 1, 1);
 
@@ -8607,9 +8610,13 @@ rel_apply_rewrite(int *changes, mvc *sql
                        r = rel_apply(sql, rel_dup(l), rel_dup(r->l), 
rel->exps, rel->flag);
                        rel_destroy(rel);
                        rel = rel_project(sql->sa, r, p);
-                       (*changes)++;
-                       return rel;
-               }
+               }
+               if (topn) {
+                       topn->l = rel;
+                       rel = topn;
+               }
+               (*changes)++;
+               return rel;
        }
        if (r->op == op_select) { 
                sql_rel *n = rel_apply(sql, rel_dup(rel->l), rel_dup(r->l), 
rel->exps, rel->flag);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to