Changeset: 6d8a941642bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6d8a941642bd
Modified Files:
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.err
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
monetdb5/mal/Tests/dynamicload.malC
monetdb5/mal/Tests/dynamicload.stable.err
monetdb5/mal/mal_listing.c
monetdb5/optimizer/Tests/JPexample.malC
monetdb5/optimizer/Tests/JPexample.stable.out
monetdb5/optimizer/Tests/projectionchain.malC
monetdb5/optimizer/Tests/projectionchain.stable.out
monetdb5/optimizer/opt_pipes.c
monetdb5/optimizer/opt_projectionpath.c
sql/test/Tests/setoptimizer.stable.err
sql/test/Tests/setoptimizer.stable.out
sql/test/Tests/setoptimizer.stable.out.Windows
Branch: default
Log Message:
Intermittent commit
before the projection prefix optimization is enabled.
diffs (truncated from 603 to 300 lines):
diff --git
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.err
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.err
--- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.err
+++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.err
@@ -30,16 +30,16 @@ stderr of test 'opt_sql_append` in direc
# 22:58:57 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=rome"
"--port=36275"
# 22:58:57 >
-MAPI = (monetdb) /var/tmp/mtest-12681/.s.monetdb.34697
+MAPI = (monetdb) /var/tmp/mtest-5498/.s.monetdb.31321
QUERY = explain copy into ttt from '\tmp/xyz';
ERROR = !COPY INTO: filename must have absolute path: \tmp/xyz
-MAPI = (monetdb) /var/tmp/mtest-12681/.s.monetdb.34697
+MAPI = (monetdb) /var/tmp/mtest-5498/.s.monetdb.31321
QUERY = explain copy into ttt from 'a:\tmp/xyz';
ERROR = !COPY INTO: filename must have absolute path: a:\tmp/xyz
-MAPI = (monetdb) /var/tmp/mtest-12681/.s.monetdb.34697
+MAPI = (monetdb) /var/tmp/mtest-5498/.s.monetdb.31321
QUERY = explain copy into ttt from '\tmp/xyz';
ERROR = !COPY INTO: filename must have absolute path: \tmp/xyz
-MAPI = (monetdb) /var/tmp/mtest-12681/.s.monetdb.34697
+MAPI = (monetdb) /var/tmp/mtest-5498/.s.monetdb.31321
QUERY = explain copy into ttt from 'Z:/tmp/xyz';
ERROR = !COPY INTO: filename must have absolute path: Z:/tmp/xyz
diff --git
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
--- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
+++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
@@ -56,7 +56,7 @@ Ready.
% def # name
% clob # type
% 541 # length
-[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.garbageCollector();"
]
+[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.garbageCollector();"
]
#explain copy into ttt from '/tmp/xyz';
% .explain # table_name
% mal # name
@@ -90,7 +90,7 @@ end user.s4_1;
% def # name
% clob # type
% 564 # length
-[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.sql_append();optimizer.garbageCollector();"
]
+[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.sql_append();optimizer.garbageCollector();"
]
#explain copy into ttt from '/tmp/xyz';
% .explain # table_name
% mal # name
diff --git
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
---
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
+++
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.single
@@ -56,7 +56,7 @@ Ready.
% def # name
% clob # type
% 541 # length
-[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.garbageCollector();"
]
+[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.garbageCollector();"
]
#explain copy into ttt from '/tmp/xyz';
% .explain # table_name
% mal # name
@@ -88,7 +88,7 @@ end user.s4_1;
% def # name
% clob # type
% 564 # length
-[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.reorder();optimizer.deadcode();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.sql_append();optimizer.garbageCollector();"
]
+[
"optimizer.inline();optimizer.candidates();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.aliases();optimizer.pushselect();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.reduce();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.sql_append();optimizer.garbageCollector();"
]
#explain copy into ttt from '/tmp/xyz';
% .explain # table_name
% mal # name
diff --git a/monetdb5/mal/Tests/dynamicload.malC
b/monetdb5/mal/Tests/dynamicload.malC
--- a/monetdb5/mal/Tests/dynamicload.malC
+++ b/monetdb5/mal/Tests/dynamicload.malC
@@ -1,10 +1,10 @@
# examples of non-bindable instructions
+#load unknown library
+library UNKNOWlib;
+
command wrong()
address UNKOWNaddress
comment "Should not be callable";
wrong();
-
-#load unknown library
-library UNKNOWlib;
diff --git a/monetdb5/mal/Tests/dynamicload.stable.err
b/monetdb5/mal/Tests/dynamicload.stable.err
--- a/monetdb5/mal/Tests/dynamicload.stable.err
+++ b/monetdb5/mal/Tests/dynamicload.stable.err
@@ -80,33 +80,21 @@ stderr of test 'dynamicload` in director
# 13:21:38 > "mclient" "-lmal" "-ftest" "-Eutf-8"
"--host=/var/tmp/mtest-18020" "--port=37961"
# 13:21:38 >
-MAPI = (monetdb) /var/tmp/mtest-21455/.s.monetdb.39502
+MAPI = (monetdb) /var/tmp/mtest-7978/.s.monetdb.32278
QUERY = # examples of non-bindable instructions
+ #load unknown library
+ library UNKNOWlib;
+
command wrong()
address UNKOWNaddress
comment "Should not be callable";
wrong();
+ERROR = !TypeException:user.main[3]:object code for command user.wrong missing
+ !TypeException:user.main[3]:'user.wrong' undefined in:
user.wrong();
- #load unknown library
- library UNKNOWlib;
-ERROR = !MALException:MAL.getAddress:address of 'user.UNKOWNaddress' not found
-MAPI = (monetdb) /var/tmp/mtest-21455/.s.monetdb.39502
-QUERY = # examples of non-bindable instructions
-
- command wrong()
- address UNKOWNaddress
- comment "Should not be callable";
-
- wrong();
-
- #load unknown library
- library UNKNOWlib;
-ERROR = !TypeException:user.main[2]:object code for command user.wrong missing
- !TypeException:user.main[2]:'user.wrong' undefined in:
user.wrong();
+# 13:26:24 >
+# 13:26:24 > "Done."
+# 13:26:24 >
-# 13:21:38 >
-# 13:21:38 > "Done."
-# 13:21:38 >
-
diff --git a/monetdb5/mal/mal_listing.c b/monetdb5/mal/mal_listing.c
--- a/monetdb5/mal/mal_listing.c
+++ b/monetdb5/mal/mal_listing.c
@@ -325,7 +325,7 @@ instruction2str(MalBlkPtr mb, MalStkPtr
return fcnDefinition(mb, p, s, flg, base, len);
case REMsymbol:
case NOOPsymbol:
- if(getVar(mb, getArg(p, 0))->value.val.sval)
+ if(getVar(mb, getArg(p, 0))->value.val.sval && getVar(mb,
getArg(p, 0))->value.len > 0)
snprintf(t,(len-(t-base)), "#%s ", getVar(mb, getArg(p,
0))->value.val.sval);
else
snprintf(t, (len-(t-base)), "# ");
diff --git a/monetdb5/optimizer/Tests/JPexample.malC
b/monetdb5/optimizer/Tests/JPexample.malC
--- a/monetdb5/optimizer/Tests/JPexample.malC
+++ b/monetdb5/optimizer/Tests/JPexample.malC
@@ -2,13 +2,14 @@
function foo();
a:= bat.new(:oid,:oid);
b:= bat.new(:oid,:oid);
- c:= bat.new(:oid,:str);
+ c:= bat.new(:oid,:oid);
+ d:= bat.new(:oid,:oid);
j1:= algebra.projection(a,b);
j2:= algebra.projection(j1,c);
- j3:= algebra.projection(b,b);
- j4:= algebra.projection(b,j3);
+ j3:= algebra.projectionpath(a,b,c,d);
+ j4:= algebra.projectionpath(a,b,c);
+ j5:= algebra.projection(j4,b);
end;
-mdb.List("user","foo");
optimizer.projectionpath("user","foo");
mdb.List("user","foo");
diff --git a/monetdb5/optimizer/Tests/JPexample.stable.out
b/monetdb5/optimizer/Tests/JPexample.stable.out
--- a/monetdb5/optimizer/Tests/JPexample.stable.out
+++ b/monetdb5/optimizer/Tests/JPexample.stable.out
@@ -33,22 +33,14 @@ Ready.
function user.foo():void; #[0] 0
a:bat[:oid] := bat.new(:oid,:oid); #[1] CMDBATnew 1 <- 2 2
b:bat[:oid] := bat.new(:oid,:oid); #[2] CMDBATnew 3 <- 2 2
- c:bat[:str] := bat.new(:oid,:str); #[3] CMDBATnew 4 <- 2 5
- j1:bat[:oid] := algebra.projection(a:bat[:oid],b:bat[:oid]); #[4]
ALGprojection 6 <- 1 3
- j2:bat[:str] :=
algebra.projectionpath(a:bat[:oid],b:bat[:oid],c:bat[:str]); #[5]
ALGprojectionpath 7 <- 1 3 4
- j3:bat[:oid] := algebra.projection(b:bat[:oid],b:bat[:oid]); #[6]
ALGprojection 8 <- 3 3
- j4:bat[:oid] :=
algebra.projectionpath(b:bat[:oid],b:bat[:oid],b:bat[:oid]); #[7]
ALGprojectionpath 9 <- 3 3 3
-end user.foo; #[8]
-#mdb.List("user","foo");
-function user.foo():void; #[0] 0
- a:bat[:oid] := bat.new(:oid,:oid); #[1] CMDBATnew 1 <- 2 2
- b:bat[:oid] := bat.new(:oid,:oid); #[2] CMDBATnew 3 <- 2 2
- c:bat[:str] := bat.new(:oid,:str); #[3] CMDBATnew 4 <- 2 5
- j1:bat[:oid] := algebra.projection(a:bat[:oid],b:bat[:oid]); #[4]
ALGprojection 6 <- 1 3
- j2:bat[:str] :=
algebra.projectionpath(a:bat[:oid],b:bat[:oid],c:bat[:str]); #[5]
ALGprojectionpath 7 <- 1 3 4
- j3:bat[:oid] := algebra.projection(b:bat[:oid],b:bat[:oid]); #[6]
ALGprojection 8 <- 3 3
- j4:bat[:oid] :=
algebra.projectionpath(b:bat[:oid],b:bat[:oid],b:bat[:oid]); #[7]
ALGprojectionpath 9 <- 3 3 3
-end user.foo; #[8]
+ c:bat[:oid] := bat.new(:oid,:oid); #[3] CMDBATnew 4 <- 2 2
+ d:bat[:oid] := bat.new(:oid,:oid); #[4] CMDBATnew 5 <- 2 2
+ j1:bat[:oid] := algebra.projection(a:bat[:oid],b:bat[:oid]); #[5]
ALGprojection 6 <- 1 3
+ j2:bat[:oid] :=
algebra.projectionpath(a:bat[:oid],b:bat[:oid],c:bat[:oid]); #[6]
ALGprojectionpath 7 <- 1 3 4
+ j3:bat[:any] :=
algebra.projectionpath(a:bat[:oid],b:bat[:oid],c:bat[:oid],d:bat[:oid]); #[7]
ALGprojectionpath 8 <- 1 3 4 5
+ j4:bat[:any] :=
algebra.projectionpath(a:bat[:oid],b:bat[:oid],c:bat[:oid]); #[8]
ALGprojectionpath 9 <- 1 3 4
+ j5:bat[:oid] :=
algebra.projectionpath(a:bat[:oid],b:bat[:oid],c:bat[:oid],b:bat[:oid]); #[9]
ALGprojectionpath 10 <- 1 3 4 3
+end user.foo; #[10]
# 06:41:06 >
# 06:41:06 > "Done."
diff --git a/monetdb5/optimizer/Tests/projectionchain.malC
b/monetdb5/optimizer/Tests/projectionchain.malC
--- a/monetdb5/optimizer/Tests/projectionchain.malC
+++ b/monetdb5/optimizer/Tests/projectionchain.malC
@@ -48,6 +48,16 @@ l := algebra.projection(f,k);
io.print(g);
io.print(l);
+# recognize common heads
+e1 := algebra.projection(a,b);
+e2 := algebra.projection(e1,b);
+f1 := algebra.projection(a,b);
+f2 := algebra.projection(f1,b);
+g1 := algebra.projection(e2,d);
+l1 := algebra.projection(f2,k);
+#io.print(g1);
+#io.print(l1);
+
h := algebra.projectionpath(c,d);
io.print(h);
diff --git a/monetdb5/optimizer/Tests/projectionchain.stable.out
b/monetdb5/optimizer/Tests/projectionchain.stable.out
--- a/monetdb5/optimizer/Tests/projectionchain.stable.out
+++ b/monetdb5/optimizer/Tests/projectionchain.stable.out
@@ -69,6 +69,15 @@ function user.qry():void;
l := algebra.projection(f,k);
io.print(g);
io.print(l);
+# recognize common heads
+ e1 := algebra.projection(a,b);
+ e2:bat[:oid] := algebra.projectionpath(a,b,b);
+ f1 := algebra.projection(a,b);
+ f2:bat[:oid] := algebra.projectionpath(a,b,b);
+ g1:bat[:str] := algebra.projectionpath(a,b,b,d);
+ l1:bat[:int] := algebra.projectionpath(a,b,b,k);
+#io.print(g1);
+#io.print(l1);
h := algebra.projectionpath(c,d);
io.print(h);
i := algebra.projectionpath(b,c,d);
@@ -123,6 +132,15 @@ function user.qry():void;
l := algebra.projection(f,k);
io.print(g);
io.print(l);
+# recognize common heads
+ e1 := algebra.projection(a,b);
+ e2:bat[:oid] := algebra.projectionpath(a,b,b);
+ f1 := algebra.projection(a,b);
+ f2:bat[:oid] := algebra.projectionpath(a,b,b);
+ g1:bat[:str] := algebra.projectionpath(a,b,b,d);
+ l1:bat[:int] := algebra.projectionpath(a,b,b,k);
+#io.print(g1);
+#io.print(l1);
h := algebra.projectionpath(c,d);
io.print(h);
i := algebra.projectionpath(b,c,d);
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -79,8 +79,8 @@ static struct PIPELINES {
"optimizer.constants();"
"optimizer.commonTerms();"
"optimizer.projectionpath();"
+ "optimizer.deadcode();"
"optimizer.reorder();"
- "optimizer.deadcode();"
"optimizer.reduce();"
"optimizer.matpack();"
"optimizer.dataflow();"
@@ -109,8 +109,8 @@ static struct PIPELINES {
"optimizer.constants();"
"optimizer.commonTerms();"
"optimizer.projectionpath();"
+ "optimizer.deadcode();"
"optimizer.reorder();"
- "optimizer.deadcode();"
"optimizer.reduce();"
"optimizer.matpack();"
"optimizer.dataflow();"
diff --git a/monetdb5/optimizer/opt_projectionpath.c
b/monetdb5/optimizer/opt_projectionpath.c
--- a/monetdb5/optimizer/opt_projectionpath.c
+++ b/monetdb5/optimizer/opt_projectionpath.c
@@ -6,14 +6,10 @@
* Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V.
*/
-/*
- * Post-optimization. After the join path has been constructed
- * we could search for common subpaths. This heuristic is to
- * remove any pair which is used more than once.
- * Inner paths are often foreign key walks.
- * The heuristics is sufficient for the code produced by SQL frontend.
- * The alternative is to search for all possible subpaths and materialize them.
- * For example, using recursion for all common paths.
+/* author: M Kersten
+ * Post-optimization of projection lists.
+ * The algorithm is quadratic in the number of paths considered.
+ * This should be massaged out with a skip list structure.
*/
#include "monetdb_config.h"
#include "opt_projectionpath.h"
@@ -21,10 +17,131 @@
//#undef OPTDEBUGprojectionpath
//#define OPTDEBUGprojectionpath if(1)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list