Changeset: ba23cef882fc for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ba23cef882fc
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/sql_parser.y
Branch: Oct2012
Log Message:

fixed bug 3173


diffs (94 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
@@ -1600,27 +1600,21 @@ rel_push_count_down(int *changes, mvc *s
  */
 
 static list *
-sum_limit_offset(sql_allocator *sa, list *exps )
+sum_limit_offset(mvc *sql, list *exps )
 {
-       list *nexps = new_exp_list(sa);
-       wrd l = 0;
+       list *nexps = new_exp_list(sql->sa);
        node *n;
+       sql_subtype *wrd = sql_bind_localtype("wrd");
+       sql_subfunc *add;
 
        /* if the expression list only consists of a limit expression, 
         * we copy it */
        if (list_length(exps) == 1 && exps->h->data)
                return append(nexps, exps->h->data);
-       for (n = exps->h; n; n = n->next ) {
-               sql_exp *e = n->data;
-
-               if (e) {
-                       atom *a = e->l;
-
-                       assert(e->type == e_atom);
-                       l += a->data.val.wval;
-               }
-       }
-       return append(nexps, exp_atom_wrd(sa, l));
+       for (n = exps->h; n; n = n->next ) 
+               nexps = append(nexps, n->data);
+       add = sql_bind_func_result(sql->sa, sql->session->schema, "sql_add", 
wrd, wrd, wrd);
+       return append(nexps, exp_op(sql->sa, exps, add));
 }
 
 static int 
@@ -1715,11 +1709,11 @@ rel_push_topn_down(int *changes, mvc *sq
                        ul = rel_project(sql->sa, ul, NULL);
                        ul->exps = exps_copy(sql->sa, r->exps);
                        ul->r = exps_copy(sql->sa, r->r);
-                       ul = rel_topn(sql->sa, ul, sum_limit_offset(sql->sa, 
rel->exps));
+                       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);
                        ur->r = exps_copy(sql->sa, r->r);
-                       ur = rel_topn(sql->sa, ur, sum_limit_offset(sql->sa, 
rel->exps));
+                       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); 
                        /* zap names */
@@ -1743,14 +1737,14 @@ rel_push_topn_down(int *changes, mvc *sq
                        }
                }
                if (r && r != rel && r->op == op_project && !(rel_is_ref(r)) && 
!r->r && r->l) {
-                       r = rel_topn(sql->sa, r, sum_limit_offset(sql->sa, 
rel->exps));
+                       r = rel_topn(sql->sa, r, sum_limit_offset(sql, 
rel->exps));
                }
 
                /* push topn under crossproduct */
                if (r && !r->exps && r->op == op_join && !(rel_is_ref(r)) &&
                    ((sql_rel *)r->l)->op != op_topn && ((sql_rel *)r->r)->op 
!= op_topn) {
-                       r->l = rel_topn(sql->sa, r->l, 
sum_limit_offset(sql->sa, rel->exps));
-                       r->r = rel_topn(sql->sa, r->r, 
sum_limit_offset(sql->sa, rel->exps));
+                       r->l = rel_topn(sql->sa, r->l, sum_limit_offset(sql, 
rel->exps));
+                       r->r = rel_topn(sql->sa, r->r, sum_limit_offset(sql, 
rel->exps));
                        (*changes)++;
                        return rel;
                }
@@ -1763,8 +1757,8 @@ rel_push_topn_down(int *changes, mvc *sq
                    rp->op == op_join && rp->exps && rp->exps->h && 
((prop*)((sql_exp*)rp->exps->h->data)->p)->kind == PROP_FETCH &&
                    ((sql_rel *)rp->l)->op != op_topn && ((sql_rel *)rp->r)->op 
!= op_topn) {
                        /* TODO check if order by columns are independend of 
join conditions */
-                       r->l = rel_topn(sql->sa, r->l, 
sum_limit_offset(sql->sa, rel->exps));
-                       r->r = rel_topn(sql->sa, r->r, 
sum_limit_offset(sql->sa, rel->exps));
+                       r->l = rel_topn(sql->sa, r->l, sum_limit_offset(sql, 
rel->exps));
+                       r->r = rel_topn(sql->sa, r->r, sum_limit_offset(sql, 
rel->exps));
                        (*changes)++;
                        return rel;
                }
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -2813,6 +2813,8 @@ with_list_element:
  ;
 
 sql:
+    select_statement_single_row
+|
     select_no_parens_orderby
  ;
 
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to