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