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