Changeset: 05cd69c91094 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=05cd69c91094
Modified Files:
        MonetDB5/src/modules/kernel/algebra.mx
        MonetDB5/src/optimizer/opt_mergetable.mx
        sql/src/server/rel_bin.mx
        sql/src/server/sql_statement.mx
        
sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
Branch: Jun2010
Log Message:

fixed problem(s) with mat.slice.

1) we now slice(offset,NIL), incase there is no limit
   (we used to do slice(o,offset)/kdiff.
        That solved also the mergetable optimizer problems
2) in mergetable optimizer we now keep the mat.pack as other statements
   may use it (shouldn't but may always happen, incase of bad hand writen mal 
code)
3) fixed slice(bat, l, h) to handle h== nil


diffs (203 lines):

diff -r 5a9d3031917a -r 05cd69c91094 MonetDB5/src/modules/kernel/algebra.mx
--- a/MonetDB5/src/modules/kernel/algebra.mx    Thu Aug 05 07:55:55 2010 +0200
+++ b/MonetDB5/src/modules/kernel/algebra.mx    Thu Aug 05 19:48:59 2010 +0200
@@ -1871,6 +1871,8 @@
                GDKerror("CMDslice: start position of slice should >= 0\n");
                return GDK_FAIL;
        }
+       if (end == wrd_nil) 
+               end = BATcount(b);
        if (start > (lng) BUN_MAX || end >= (lng) BUN_MAX) {
                GDKerror("CMDslice: argument out of range\n");
                return GDK_FAIL;
diff -r 5a9d3031917a -r 05cd69c91094 MonetDB5/src/optimizer/opt_mergetable.mx
--- a/MonetDB5/src/optimizer/opt_mergetable.mx  Thu Aug 05 07:55:55 2010 +0200
+++ b/MonetDB5/src/optimizer/opt_mergetable.mx  Thu Aug 05 19:48:59 2010 +0200
@@ -1743,12 +1743,12 @@
 Disabled as a slice is used also for offset where we need the oposite
 of the slice part. y= x.slice(). x.diff(y);
 @c
-               if (0 && match > 0 && getModuleId(p) == algebraRef &&
+               if (match > 0 && getModuleId(p) == algebraRef &&
                                getFunctionId(p) == sliceRef &&
                                (m = isMATalias(getArg(p, 1), mat, mtop)) >= 0)
                {
                        /* inject new mat.pack() operation */
-                       MATpackAll2(mb, NULL, mat, m, &mtop);
+                       MATpackAll(mb, NULL, mat, m, &mtop);
                        q = getInstrPtr(mb, mb->stop - 1);
                        /* rename mat.pack() to mat.slice() */
                        setFunctionId(q, sliceRef);
diff -r 5a9d3031917a -r 05cd69c91094 sql/src/server/rel_bin.mx
--- a/sql/src/server/rel_bin.mx Thu Aug 05 07:55:55 2010 +0200
+++ b/sql/src/server/rel_bin.mx Thu Aug 05 19:48:59 2010 +0200
@@ -1948,17 +1948,22 @@
 
        if (n) {
                stmt *limit = NULL, *p, *j;
-               sql_exp *lmt = le;
+               //sql_exp *lmt = le;
 
                if (le)
                        l = exp_bin(sql, le, NULL, NULL, NULL, NULL);
                if (oe)
                        o = exp_bin(sql, oe, NULL, NULL, NULL, NULL);
 
+/*
                if (!le) {
                        l = o;
                        o = stmt_atom_wrd(0);
                }
+*/
+
+               if (!le) 
+                       l = stmt_atom_wrd_nil();
                if (!o)
                        o = stmt_atom_wrd(0);
 
@@ -1971,19 +1976,21 @@
 
                        sc = column(sc);
                        limit = stmt_limit(stmt_alias(sc, tname, cname), o, l, 
0);
-                       if (lmt) {
+                       //if (lmt) {
                                n = n->next;
                                list_append(newl, limit);
-                       }
+                       //}
                }
 
                /* reduce pivot */
                j = find_projection_join(limit);
                if (j && 0) {
                        p = find_pivot(j);
+/*
                        if (!lmt)
                                p = stmt_diff(stmt_dup(p), stmt_dup(limit));
                        else
+*/
                                p = stmt_semijoin(stmt_dup(p), stmt_dup(limit));
                        for ( ; n; n = n->next) {
                                stmt *s = column(stmt_dup(n->data));
@@ -1999,20 +2006,24 @@
                        for ( ; n; n = n->next) {
                                stmt *s;
                
+/*
                                if (!lmt)
                                        s = 
stmt_diff(column(stmt_dup(n->data)), stmt_dup(limit));
                                else
+*/
                                        s = 
stmt_semijoin(column(stmt_dup(n->data)), stmt_dup(limit));
                                list_append(newl, s);
                        }
                }
                if (order) {
+/*
                        if (!lmt) {
                                order = stmt_diff(order, limit);
                        } else {
+*/
                                stmt_destroy(order);
                                order = limit;
-                       }
+//                     }
                }
        }
        stmt_destroy(sub);
diff -r 5a9d3031917a -r 05cd69c91094 sql/src/server/sql_statement.mx
--- a/sql/src/server/sql_statement.mx   Thu Aug 05 07:55:55 2010 +0200
+++ b/sql/src/server/sql_statement.mx   Thu Aug 05 19:48:59 2010 +0200
@@ -229,6 +229,7 @@
 extern stmt *stmt_atom_clob(char *S);
 extern stmt *stmt_atom_int(int i);
 extern stmt *stmt_atom_wrd(wrd i);
+extern stmt *stmt_atom_wrd_nil(void);
 extern stmt *stmt_atom_lng(lng l);
 extern stmt *stmt_bool(int b);
 extern stmt *stmt_select(stmt *op1, stmt *op2, comp_type cmptype);
@@ -478,6 +479,18 @@
 }
 
 stmt *
+stmt_atom_wrd_nil()
+{
+       sql_subtype t;
+
+       if (sizeof(wrd) == sizeof(int))
+               sql_find_subtype(&t, "wrd", 32, 0);
+       else
+               sql_find_subtype(&t, "wrd", 64, 0);
+       return stmt_atom(atom_general(&t, NULL, 0));
+}
+
+stmt *
 stmt_atom_lng(lng l)
 {
        sql_subtype t;
@@ -1462,6 +1475,7 @@
        return ns;
 }
 
+/* limit maybe atom nil */
 stmt *
 stmt_limit(stmt *s, stmt *offset, stmt *limit, int direction)
 {
diff -r 5a9d3031917a -r 05cd69c91094 
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
    Thu Aug 05 07:55:55 2010 +0200
+++ 
b/sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
    Thu Aug 05 19:48:59 2010 +0200
@@ -169,16 +169,15 @@
     _15:bat[:oid,:oid]  := sql.bind_dbat(_2,"sys","oblo",1);
     _16 := bat.reverse(_15);
     _17 := algebra.kdifference(_14,_16);
-    _18 := calc.wrd(0:wrd);
-    _20 := calc.wrd(2:wrd);
+    _18 := calc.wrd(2:wrd);
+    _20 := calc.wrd(nil:wrd);
     _22 := calc.+(_18,_20);
     _23 := calc.-(_22,1);
     _24 := algebra.slice(_17,_18,_23);
-    _25 := algebra.kdifference(_17,_24);
-    _26 := sql.resultSet(1,1,_25);
-    sql.rsColumn(_26,"sys.oblo","a","int",32,0,_25);
-    _31 := io.stdout();
-    sql.exportResult(_31,_26);
+    _25 := sql.resultSet(1,1,_24);
+    sql.rsColumn(_25,"sys.oblo","a","int",32,0,_24);
+    _30 := io.stdout();
+    sql.exportResult(_30,_25);
 end s2_1;
 #EXPLAIN select * from oblo LIMIT 2;
 % .explain # table_name
@@ -311,18 +310,19 @@
     _15:bat[:oid,:oid]  := sql.bind_dbat(_2,"sys","oblo",1);
     _16 := bat.reverse(_15);
     _17 := algebra.kdifference(_14,_16);
-    _18 := algebra.sortTail(_17);
-    _19 := calc.wrd(0:wrd);
-    _21 := calc.wrd(2:wrd);
-    _23 := calc.+(_19,_21);
-    _24 := pqueue.topn_max(_17,_23);
-    _25 := algebra.sortTail(_24);
-    _26 := algebra.kdifference(_18,_25);
-    _27 := algebra.kdifference(_17,_25);
-    _28 := sql.resultSet(1,1,_26);
-    sql.rsColumn(_28,"sys.oblo","a","int",32,0,_27);
-    _33 := io.stdout();
-    sql.exportResult(_33,_28);
+    _18 := calc.wrd(2:wrd);
+    _20 := calc.wrd(nil:wrd);
+    _22 := calc.+(_18,_20);
+    _23 := pqueue.topn_max(_17,_22);
+    _24 := calc.-(_22,1);
+    _25 := algebra.sortTail(_23);
+    _26 := algebra.slice(_25,_18,_24);
+    _27 := algebra.sortTail(_26);
+    _28 := algebra.semijoin(_17,_27);
+    _29 := sql.resultSet(1,1,_27);
+    sql.rsColumn(_29,"sys.oblo","a","int",32,0,_28);
+    _34 := io.stdout();
+    sql.exportResult(_34,_29);
 end s7_1;
 #EXPLAIN select * from oblo ORDER BY a LIMIT 2;
 % .explain # table_name
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to