Changeset: baa73297a16b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=baa73297a16b
Modified Files:
        sql/src/common/sql_list.mx
        sql/src/server/rel_optimizer.mx
Branch: default
Log Message:

merged with Jun2010


diffs (232 lines):

diff -r ba2c312a006c -r baa73297a16b sql/src/common/sql_list.mx
--- a/sql/src/common/sql_list.mx        Wed Aug 04 12:32:08 2010 +0200
+++ b/sql/src/common/sql_list.mx        Thu Aug 05 08:02:53 2010 +0200
@@ -459,7 +459,7 @@
                node *n = data->h;
 
                while (n) {
-                       if (dup)
+                       if (dup && n->data)
                                list_append(l, dup(n->data));
                        else
                                list_append(l, n->data);
diff -r ba2c312a006c -r baa73297a16b sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx   Wed Aug 04 12:32:08 2010 +0200
+++ b/sql/src/server/rel_optimizer.mx   Thu Aug 05 08:02:53 2010 +0200
@@ -1246,16 +1246,61 @@
  *     )[ n ]                         )[ n ]
  *
  *  (TODO: in case of n==1 we can omit the original top-level TopN)
+ *
+ * also push topn under (non reordering) projections.
  */
+
+static list *
+sum_limit_offset( list *exps )
+{
+       list *nexps = new_exp_list();
+       wrd l = 0;
+       node *n;
+
+       /* if the expression list only consists of a limit expression, 
+        * we copy it */
+       if (list_length(exps) == 1 && exps->h->data)
+               return append(nexps, exp_dup(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(l));
+}
+
+static int 
+topn_save_exps( list *exps )
+{
+       node *n;
+
+       /* Limit only expression lists are always save */
+       if (list_length(exps) == 1)
+               return 1;
+       for (n = exps->h; n; n = n->next ) {
+               sql_exp *e = n->data;
+
+               if (!e || e->type != e_atom) 
+                       return 0;
+       }
+       return 1;
+}
+
 static sql_rel *
 rel_push_topn_down(int *changes, mvc *sql, sql_rel *rel) 
 {
-       sql_rel *r = rel->l;
+       sql_rel *rl, *r = rel->l;
 
        (void)sql;
-       if (rel->op == op_topn) {
+       if (rel->op == op_topn && topn_save_exps(rel->exps)) {
                /* pass through projections */
-               while (r && is_project(r->op) && !(rel_is_ref(r))) {
+               while (r && is_project(r->op) && !(rel_is_ref(r)) &&
+                      !r->r && (rl = r->l) != NULL && is_project(rl->op)) {
                        /* ensure there is no order by */
                        if (!r->r) {
                                r = r->l;
@@ -1263,11 +1308,17 @@
                                r = NULL;
                        }
                }
+               if (r && is_project(r->op) && !(rel_is_ref(r)) && !r->r && 
r->l) {
+                       r->l = rel_topn( r->l, sum_limit_offset(rel->exps));
+                       r = r->l; /* project */
+                       r = r->l; /* topn */
+               }
+
                /* 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( r->l, list_dup(rel->exps, 
(fdup)&exp_dup) );
-                       r->r = rel_topn( r->r, list_dup(rel->exps, 
(fdup)&exp_dup) );
+                       r->l = rel_topn( r->l, sum_limit_offset(rel->exps));
+                       r->r = rel_topn( r->r, sum_limit_offset(rel->exps));
                        (*changes)++;
                        return rel;
                }
diff -r ba2c312a006c -r baa73297a16b 
sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
--- 
a/sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
    Wed Aug 04 12:32:08 2010 +0200
+++ 
b/sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
    Thu Aug 05 08:02:53 2010 +0200
@@ -51,30 +51,36 @@
 % .plan # table_name
 % rel # name
 % clob # type
-% 50 # length
+% 52 # length
 top N (
 | project (
-| | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
+| | top N (
+| | | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
+| | ) [ 2 ]
 | ) [ oblo.a ]
 ) [ 2 ]
 #PLAN select * from oblo LIMIT 1 OFFSET 2;
 % .plan # table_name
 % rel # name
 % clob # type
-% 50 # length
+% 52 # length
 top N (
 | project (
-| | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
+| | top N (
+| | | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
+| | ) [ 3 ]
 | ) [ oblo.a ]
 ) [ 1, 2 ]
 #PLAN select * from oblo LIMIT 2 OFFSET 1;
 % .plan # table_name
 % rel # name
 % clob # type
-% 50 # length
+% 52 # length
 top N (
 | project (
-| | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
+| | top N (
+| | | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
+| | ) [ 3 ]
 | ) [ oblo.a ]
 ) [ 2, 1 ]
 #PLAN select * from oblo ORDER BY a;
@@ -195,10 +201,15 @@
     _22 := calc.+(_18,_20);
     _23 := calc.-(_22,1);
     _24 := algebra.slice(_17,_18,_23);
-    _25 := sql.resultSet(1,1,_24);
-    sql.rsColumn(_25,"sys.oblo","a","int",32,0,_24);
-    _30 := io.stdout();
-    sql.exportResult(_30,_25);
+    _25 := calc.wrd(0:wrd);
+    _26 := calc.wrd(2:wrd);
+    _27 := calc.+(_25,_26);
+    _28 := calc.-(_27,1);
+    _29 := algebra.slice(_24,_25,_28);
+    _30 := sql.resultSet(1,1,_29);
+    sql.rsColumn(_30,"sys.oblo","a","int",32,0,_29);
+    _35 := io.stdout();
+    sql.exportResult(_35,_30);
 end s3_1;
 #EXPLAIN select * from oblo LIMIT 1 OFFSET 2;
 % .explain # table_name
@@ -216,15 +227,20 @@
     _15:bat[:oid,:oid]  := sql.bind_dbat(_2,"sys","oblo",1);
     _16 := bat.reverse(_15);
     _17 := algebra.kdifference(_14,_16);
-    _18 := calc.wrd(2:wrd);
-    _20 := calc.wrd(1:wrd);
+    _18 := calc.wrd(0:wrd);
+    _20 := calc.wrd(3:wrd);
     _22 := calc.+(_18,_20);
     _23 := calc.-(_22,1);
     _24 := algebra.slice(_17,_18,_23);
-    _25 := sql.resultSet(1,1,_24);
-    sql.rsColumn(_25,"sys.oblo","a","int",32,0,_24);
-    _30 := io.stdout();
-    sql.exportResult(_30,_25);
+    _25 := calc.wrd(2:wrd);
+    _27 := calc.wrd(1:wrd);
+    _29 := calc.+(_25,_27);
+    _30 := calc.-(_29,1);
+    _31 := algebra.slice(_24,_25,_30);
+    _32 := sql.resultSet(1,1,_31);
+    sql.rsColumn(_32,"sys.oblo","a","int",32,0,_31);
+    _37 := io.stdout();
+    sql.exportResult(_37,_32);
 end s4_1;
 #EXPLAIN select * from oblo LIMIT 2 OFFSET 1;
 % .explain # table_name
@@ -242,15 +258,20 @@
     _15:bat[:oid,:oid]  := sql.bind_dbat(_2,"sys","oblo",1);
     _16 := bat.reverse(_15);
     _17 := algebra.kdifference(_14,_16);
-    _18 := calc.wrd(1:wrd);
-    _20 := calc.wrd(2:wrd);
+    _18 := calc.wrd(0:wrd);
+    _20 := calc.wrd(3:wrd);
     _22 := calc.+(_18,_20);
     _23 := calc.-(_22,1);
     _24 := algebra.slice(_17,_18,_23);
-    _25 := sql.resultSet(1,1,_24);
-    sql.rsColumn(_25,"sys.oblo","a","int",32,0,_24);
-    _30 := io.stdout();
-    sql.exportResult(_30,_25);
+    _25 := calc.wrd(1:wrd);
+    _27 := calc.wrd(2:wrd);
+    _29 := calc.+(_25,_27);
+    _30 := calc.-(_29,1);
+    _31 := algebra.slice(_24,_25,_30);
+    _32 := sql.resultSet(1,1,_31);
+    sql.rsColumn(_32,"sys.oblo","a","int",32,0,_31);
+    _37 := io.stdout();
+    sql.exportResult(_37,_32);
 end s5_1;
 #EXPLAIN select * from oblo ORDER BY a;
 % .explain # table_name
diff -r ba2c312a006c -r baa73297a16b testing/src/Mfilter.py.in
--- a/testing/src/Mfilter.py.in Wed Aug 04 12:32:08 2010 +0200
+++ b/testing/src/Mfilter.py.in Thu Aug 05 08:02:53 2010 +0200
@@ -145,7 +145,7 @@
     
r'^(!.*Exception:remote\.[^:]*:\(mapi:monetdb://monetdb@)([^/]*)(/mTests_.*\).*)\n',
                                                        # 25: 3
 #   r'^(ERROR = !sql_stmt symbol\()(.*)(\)->token = CREATE_SCHEMA)\n',         
                                                                 # 26: 3
     r'^(ERROR = !IOException:mapi.connect:Could not connect: getaddrinfo 
failed: )(No .* is|.* not)( known[\. ]*)\n',                           # 27: 3
-    
r'^(pf:add-doc\(")(.*.pathfinder.tests.BugTracker.Tests.)(empty_file.SF-2017862-.*\.xml",".*\.xml"\).*)\n',
                                 # 50: 3
+    r'^( 
*pf:add-doc\(")(.*.pathfinder.tests.BugTracker.Tests.)(empty_file.SF-2017862-.*\.xml",".*\.xml"\).*)\n',
                               # 50: 3
 #   r'^(ERROR =|       )( !ERROR: | !SQLException:assert:| !SQLException:sql: 
| !SQLException:| !MALException:)([^:]+)(: *)([^ ].*)\n',         # 90: 5
     r'^(.*: at )(\([0-9]+,[0-9]+\-[0-9]+,[0-9]+\))(: .*)\n',                   
                                                                 # 91: 3
 #   r'^(fatal error|ERROR)(: err:FORG0005, fn:exactly-one called with a 
sequence containing zero or more than one item..*)()\n',                # 99: 3
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to