Changeset: 333e14ad51c7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=333e14ad51c7
Modified Files:
        sql/src/include/sql_relation.h
        sql/src/server/rel_bin.mx
        sql/src/server/rel_optimizer.mx
        sql/src/server/rel_select.mx
        
sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        sql/src/test/BugTracker-2010/Tests/between-crash.Bug-2672.sql
        
sql/src/test/BugTracker-2010/Tests/select-distinct-limit.Bug-2676.stable.out
        sql/src/test/BugTracker-2010/Tests/times-crash.Bug-2586.stable.err
        sql/src/test/BugTracker-2010/Tests/times-crash.Bug-2586.stable.out
Branch: Oct2010
Log Message:

fixes bugs in limit (don't push topn under project, is handled in rel_bin
allready) Bug 2622 and Bug 2676

fix crash in Bug 2672 , ie complex between is now handled correctly

fix bug 2586, test for return types when using functions.
(and check for empty results on procedure calls)


diffs (truncated from 396 to 300 lines):

diff -r 67dd2abd5927 -r 333e14ad51c7 sql/src/include/sql_relation.h
--- a/sql/src/include/sql_relation.h    Mon Oct 18 17:49:20 2010 +0200
+++ b/sql/src/include/sql_relation.h    Tue Oct 19 09:13:30 2010 +0200
@@ -179,7 +179,7 @@
 
 /* NO NIL semantics of aggr operations */
 #define need_no_nil(e) \
-       ((e->flag&NO_NIL))
+       ((e->flag&NO_NIL)==NO_NIL)
 #define set_no_nil(e) \
        e->flag |= NO_NIL
 
@@ -192,18 +192,18 @@
        e->flag &= (~HAS_NO_NIL)
 
 #define is_ascending(e) \
-       ((e->flag&ASCENDING))
+       ((e->flag&ASCENDING)==ASCENDING)
 #define set_direction(e, dir) \
        e->flag |= (dir?ASCENDING:0)
 
 #define is_anti(e) \
-       ((e->flag&ANTISEL))
+       ((e->flag&ANTISEL)==ANTISEL)
 #define set_anti(e) \
        e->flag |= ANTISEL
 
 /* used for expressions and relations */
 #define need_distinct(e) \
-       ((e->flag&EXP_DISTINCT))
+       ((e->flag&EXP_DISTINCT)==EXP_DISTINCT)
 #define set_distinct(e) \
        e->flag |= EXP_DISTINCT
 #define set_nodistinct(e) \
@@ -211,7 +211,7 @@
 
 /* limit including or excluding bounds (relations only) */
 #define need_including(r) \
-       ((r->flag&TOPN_INCLUDING))
+       ((r->flag&TOPN_INCLUDING)==TOPN_INCLUDING)
 #define set_including(r) \
        r->flag |= TOPN_INCLUDING
 #define set_excluding(r) \
@@ -219,7 +219,7 @@
 
 /* used for expressions and relations */
 #define is_intern(e) \
-       (e->type != e_atom && (e->flag&EXP_INTERN))
+       (e->type != e_atom && (e->flag&EXP_INTERN)==EXP_INTERN)
 #define set_intern(e) \
        e->flag |= EXP_INTERN
 
diff -r 67dd2abd5927 -r 333e14ad51c7 sql/src/server/rel_bin.mx
--- a/sql/src/server/rel_bin.mx Mon Oct 18 17:49:20 2010 +0200
+++ b/sql/src/server/rel_bin.mx Tue Oct 19 09:13:30 2010 +0200
@@ -1694,12 +1694,10 @@
        /* TODO should be in key order! */
        for( en = rel->exps->h; en; en = en->next ) {
                sql_exp *e = en->data;
-               stmt *s;
-
-               assert(e->type == e_cmp && e->flag == cmp_equal);
-               s = exp_bin(sql, e->r, NULL, NULL, NULL, NULL);
-               if (s == NULL)
-                       return NULL;
+               stmt *s = NULL;
+
+               if (e->type == e_cmp && e->flag == cmp_equal)
+                       s = exp_bin(sql, e->r, NULL, NULL, NULL, NULL);
 
                if (!s) {
                        stmt_destroy(h);
@@ -1760,30 +1758,32 @@
                        
                        sel = rel2bin_hash_lookup(sql, rel, sub, i, en);
                }
-       }
-       sel = stmt_relselect_init();
-       for( en = rel->exps->h; en; en = en->next ) {
-               /*stmt *s = exp_bin(sql, en->data, sub, NULL, NULL, sel);*/
-               stmt *s = exp_bin(sql, en->data, sub, NULL, NULL, NULL);
-
-               if (!s) {
-                       assert(0);
-                       if (sub) stmt_destroy(sub);
-                       if (predicate) stmt_destroy(predicate);
-                       if (sel) stmt_destroy(sel);
-                       return NULL;
-               }
-               if (s->nrcols == 0){ 
-                       if (!predicate) 
-                               predicate = rel2bin_predicate();
-                       predicate = stmt_select(predicate, s, cmp_equal);
-               } else {
-                       /*
-                       if (sel) 
-                               stmt_destroy(sel);
-                       sel = s;
-                       */
-                       stmt_relselect_fill(sel, s);
+       } 
+       if (!sel) {
+               sel = stmt_relselect_init();
+               for( en = rel->exps->h; en; en = en->next ) {
+                       /*stmt *s = exp_bin(sql, en->data, sub, NULL, NULL, 
sel);*/
+                       stmt *s = exp_bin(sql, en->data, sub, NULL, NULL, NULL);
+       
+                       if (!s) {
+                               assert(0);
+                               if (sub) stmt_destroy(sub);
+                               if (predicate) stmt_destroy(predicate);
+                               if (sel) stmt_destroy(sel);
+                               return NULL;
+                       }
+                       if (s->nrcols == 0){ 
+                               if (!predicate) 
+                                       predicate = rel2bin_predicate();
+                               predicate = stmt_select(predicate, s, 
cmp_equal);
+                       } else {
+                               /*
+                               if (sel) 
+                                       stmt_destroy(sel);
+                               sel = s;
+                               */
+                               stmt_relselect_fill(sel, s);
+                       }
                }
        }
 
@@ -1948,8 +1948,9 @@
 
        if (n) {
                stmt *limit = NULL;
-               sql_rel *rl = rel->l;
-               int including = (rl && need_distinct(rl)) || 
need_including(rel);
+               //sql_rel *rl = rel->l;
+               //int including = (rl && need_distinct(rl)) || 
need_including(rel);
+               int including = need_including(rel);
 
                if (le)
                        l = exp_bin(sql, le, NULL, NULL, NULL, NULL);
diff -r 67dd2abd5927 -r 333e14ad51c7 sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx   Mon Oct 18 17:49:20 2010 +0200
+++ b/sql/src/server/rel_optimizer.mx   Tue Oct 19 09:13:30 2010 +0200
@@ -1299,8 +1299,9 @@
        (void)sql;
        if (rel->op == op_topn && topn_save_exps(rel->exps)) {
                /* pass through projections */
-               while (r && is_project(r->op) && !(rel_is_ref(r)) &&
-                      !r->r && (rl = r->l) != NULL && is_project(rl->op)) {
+               while (r && is_project(r->op) && !need_distinct(r) &&
+                       !(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;
@@ -1308,14 +1309,8 @@
                                r = NULL;
                        }
                }
-               if (r && is_project(r->op) && !(rel_is_ref(r)) && !r->r && 
r->l) {
-                       int distinct = need_distinct(r);
-                       sql_rel *t = rel_topn( r->l, 
sum_limit_offset(rel->exps));
-
-                       if (distinct) 
-                               set_including(t);
-                       r->l = t; /* topn */
-                       r = t->l; /* under project */
+               if (r && r != rel && is_project(r->op) && !(rel_is_ref(r)) && 
!r->r && r->l) {
+                       r = rel_topn( r, sum_limit_offset(rel->exps));
                }
 
                /* push topn under crossproduct */
diff -r 67dd2abd5927 -r 333e14ad51c7 sql/src/server/rel_select.mx
--- a/sql/src/server/rel_select.mx      Mon Oct 18 17:49:20 2010 +0200
+++ b/sql/src/server/rel_select.mx      Tue Oct 19 09:13:30 2010 +0200
@@ -1329,7 +1329,7 @@
        sql_subfunc *f = NULL;
 
        f = sql_bind_func(s, fname, NULL, NULL);
-       if (f && (ek.card == card_relation || !f->res.comp_type)) {
+       if (f && ((ek.card == card_relation && f->res.comp_type) || (ek.card == 
card_none && !f->res.type) || (ek.card != card_none && ek.card != card_relation 
&& f->res.type && !f->res.comp_type))) {
                return exp_op(NULL, f);
        } else {
                return sql_error(sql, 02,
@@ -1992,7 +1992,7 @@
                else
                        return sql_error(sql, 02, "SELECT: cannot use non GROUP 
BY column in query results without an aggregate function");
        }
-       if (rs->card > rel->card) {
+       if (rs->card > rel->card || (rs2 && rs2->card > rel->card)) {
                if (rs->name)
                        return sql_error(sql, 02, "SELECT: cannot use non GROUP 
BY column '%s' in query results without an aggregate function", rs->name);
                else
@@ -2002,8 +2002,9 @@
                rel_join_add_exp(rel, e);
                return rel;
        }
-       if (rs->card <= CARD_ATOM && exp_is_atom(rs)) {
-               if (ls->card == rs->card)  /* bin compare op */
+       if (rs->card <= CARD_ATOM && exp_is_atom(rs) && 
+          (!rs2 || (rs2->card <= CARD_ATOM && exp_is_atom(rs2)))) {
+               if (ls->card == rs->card && !rs2)  /* bin compare op */
                        return rel_select(rel, e);
 
                /* push select into the given relation */
diff -r 67dd2abd5927 -r 333e14ad51c7 
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
    Mon Oct 18 17:49:20 2010 +0200
+++ 
b/sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
    Tue Oct 19 09:13:30 2010 +0200
@@ -51,36 +51,30 @@
 % .plan # table_name
 % rel # name
 % clob # type
-% 52 # length
+% 50 # length
 top N (
 | project (
-| | top N (
-| | | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
-| | ) [ 2 ]
+| | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
 | ) [ oblo.a ]
 ) [ 2 ]
 #PLAN select * from oblo LIMIT 1 OFFSET 2;
 % .plan # table_name
 % rel # name
 % clob # type
-% 52 # length
+% 50 # length
 top N (
 | project (
-| | top N (
-| | | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
-| | ) [ 3 ]
+| | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
 | ) [ oblo.a ]
 ) [ 1, 2 ]
 #PLAN select * from oblo LIMIT 2 OFFSET 1;
 % .plan # table_name
 % rel # name
 % clob # type
-% 52 # length
+% 50 # length
 top N (
 | project (
-| | top N (
-| | | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
-| | ) [ 3 ]
+| | table(sys.oblo) [ oblo.a, oblo.%TID% NOT NULL ]
 | ) [ oblo.a ]
 ) [ 2, 1 ]
 #PLAN select * from oblo ORDER BY a;
@@ -204,17 +198,10 @@
     _24 := algebra.slice(_17,_18,_23);
     _25 := bat.mirror(_24);
     _26 := algebra.leftjoin(_25,_17);
-    _27 := calc.wrd(0:wrd);
-    _28 := calc.wrd(2:wrd);
-    _29 := calc.+(_27,_28);
-    _30 := calc.-(_29,1);
-    _31 := algebra.slice(_26,_27,_30);
-    _32 := bat.mirror(_31);
-    _33 := algebra.leftjoin(_32,_26);
-    _34 := sql.resultSet(1,1,_33);
-    sql.rsColumn(_34,"sys.oblo","a","int",32,0,_33);
-    _39 := io.stdout();
-    sql.exportResult(_39,_34);
+    _27 := sql.resultSet(1,1,_26);
+    sql.rsColumn(_27,"sys.oblo","a","int",32,0,_26);
+    _32 := io.stdout();
+    sql.exportResult(_32,_27);
 end s3_1;
 #EXPLAIN select * from oblo LIMIT 1 OFFSET 2;
 % .explain # table_name
@@ -232,24 +219,17 @@
     _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(3:wrd);
+    _18 := calc.wrd(2:wrd);
+    _20 := calc.wrd(1:wrd);
     _22 := calc.+(_18,_20);
     _23 := calc.-(_22,1);
     _24 := algebra.slice(_17,_18,_23);
     _25 := bat.mirror(_24);
     _26 := algebra.leftjoin(_25,_17);
-    _27 := calc.wrd(2:wrd);
-    _29 := calc.wrd(1:wrd);
-    _31 := calc.+(_27,_29);
-    _32 := calc.-(_31,1);
-    _33 := algebra.slice(_26,_27,_32);
-    _34 := bat.mirror(_33);
-    _35 := algebra.leftjoin(_34,_26);
-    _36 := sql.resultSet(1,1,_35);
-    sql.rsColumn(_36,"sys.oblo","a","int",32,0,_35);
-    _43 := io.stdout();
-    sql.exportResult(_43,_36);
+    _27 := sql.resultSet(1,1,_26);
+    sql.rsColumn(_27,"sys.oblo","a","int",32,0,_26);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to