Changeset: fb6c0ed3f776 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fb6c0ed3f776
Modified Files:
monetdb5/optimizer/Tests/inlineFunction.malC
monetdb5/optimizer/Tests/inlineFunction.stable.out
monetdb5/optimizer/Tests/inlineFunction1.malC
monetdb5/optimizer/Tests/inlineFunction1.stable.out
monetdb5/optimizer/Tests/inlineFunction4.malC
monetdb5/optimizer/Tests/inlineFunction4.stable.out
monetdb5/optimizer/opt_coercion.c
monetdb5/optimizer/opt_pipes.c
monetdb5/optimizer/opt_remap.c
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
sql/test/Tests/setoptimizer.stable.out
Branch: Apr2019
Log Message:
Remove a linear traversal in opt_coercion, which is very expensive for huge MAL
plans.
Instead rely on a separate call to the alias removal.
diffs (truncated from 305 to 300 lines):
diff --git a/monetdb5/optimizer/Tests/inlineFunction.malC
b/monetdb5/optimizer/Tests/inlineFunction.malC
--- a/monetdb5/optimizer/Tests/inlineFunction.malC
+++ b/monetdb5/optimizer/Tests/inlineFunction.malC
@@ -28,5 +28,6 @@ io.printf("#result of inline\n");
optimizer.remap("user","tst");
optimizer.costModel("user","tst");
optimizer.coercions("user","tst");
+optimizer.aliases("user","tst");
optimizer.evaluate("user","tst");
mdb.list("user","tst");
diff --git a/monetdb5/optimizer/Tests/inlineFunction.stable.out
b/monetdb5/optimizer/Tests/inlineFunction.stable.out
--- a/monetdb5/optimizer/Tests/inlineFunction.stable.out
+++ b/monetdb5/optimizer/Tests/inlineFunction.stable.out
@@ -32,7 +32,6 @@ function user.tst():void;
true:bit;
X_4:int := 0:int;
X_4:int := 100:int;
- z := X_4;
end user.tst;
# 01:05:28 >
diff --git a/monetdb5/optimizer/Tests/inlineFunction1.malC
b/monetdb5/optimizer/Tests/inlineFunction1.malC
--- a/monetdb5/optimizer/Tests/inlineFunction1.malC
+++ b/monetdb5/optimizer/Tests/inlineFunction1.malC
@@ -19,5 +19,6 @@ mdb.list("user","tst");
optimizer.remap("user","tst");
optimizer.costModel("user","tst");
optimizer.coercions("user","tst");
+optimizer.aliases("user","tst");
optimizer.evaluate("user","tst");
mdb.list("user","tst");
diff --git a/monetdb5/optimizer/Tests/inlineFunction1.stable.out
b/monetdb5/optimizer/Tests/inlineFunction1.stable.out
--- a/monetdb5/optimizer/Tests/inlineFunction1.stable.out
+++ b/monetdb5/optimizer/Tests/inlineFunction1.stable.out
@@ -31,12 +31,10 @@ Ready.
#mdb.list("user","tst");
function user.tst():void;
true:bit;
- z := 0:int;
end user.tst;
#mdb.list("user","tst");
function user.tst():void;
true:bit;
- z := 0:int;
end user.tst;
# 05:26:58 >
diff --git a/monetdb5/optimizer/Tests/inlineFunction4.malC
b/monetdb5/optimizer/Tests/inlineFunction4.malC
--- a/monetdb5/optimizer/Tests/inlineFunction4.malC
+++ b/monetdb5/optimizer/Tests/inlineFunction4.malC
@@ -28,5 +28,6 @@ io.printf("#result of inline\n");
optimizer.remap("user","tst");
optimizer.costModel("user","tst");
optimizer.coercions("user","tst");
+optimizer.aliases("user","tst");
optimizer.evaluate("user","tst");
mdb.list("user","tst");
diff --git a/monetdb5/optimizer/Tests/inlineFunction4.stable.out
b/monetdb5/optimizer/Tests/inlineFunction4.stable.out
--- a/monetdb5/optimizer/Tests/inlineFunction4.stable.out
+++ b/monetdb5/optimizer/Tests/inlineFunction4.stable.out
@@ -34,7 +34,6 @@ function user.tst():void;
false:bit;
-1:int;
X_5:int := -1:int;
- z := X_5;
end user.tst;
# 05:29:17 >
diff --git a/monetdb5/optimizer/opt_coercion.c
b/monetdb5/optimizer/opt_coercion.c
--- a/monetdb5/optimizer/opt_coercion.c
+++ b/monetdb5/optimizer/opt_coercion.c
@@ -12,6 +12,7 @@
#include "monetdb_config.h"
#include "opt_coercion.h"
+#include "opt_aliases.h"
typedef struct{
int pc;
@@ -20,29 +21,6 @@ typedef struct{
int src;
} Coercion;
-static int
-coercionOptimizerStep(MalBlkPtr mb, int i, InstrPtr p)
-{
- int t, k, a, b;
-
- a = getArg(p, 0);
- b = getArg(p, 1);
- t = getVarType(mb, b);
- if (getVarType(mb, a) != t)
- return 0;
- if (strcmp(getFunctionId(p), ATOMname(t)) == 0) {
- removeInstruction(mb, p); /* dead code */
- for (; i < mb->stop; i++) {
- p = getInstrPtr(mb, i);
- for (k = p->retc; k < p->argc; k++)
- if (p->argv[k] == a)
- p->argv[k] = b;
- }
- return 1;
- }
- return 0;
-}
-
/* Check coercions for numeric types towards :hge that can be handled with
smaller ones.
* For now, limit to +,-,/,*,% hge expressions
* Not every combination may be available in the MAL layer, which calls
@@ -120,7 +98,7 @@ coercionOptimizerAggrStep(Client cntxt,
str
OPTcoercionImplementation(Client cntxt,MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci)
{
- int i, k;
+ int i, k, t;
InstrPtr p;
int actions = 0;
str calcRef= putName("calc");
@@ -179,9 +157,12 @@ OPTcoercionImplementation(Client cntxt,M
coercionOptimizerAggrStep(cntxt,mb, i, coerce);
coercionOptimizerCalcStep(cntxt,mb, i, coerce);
if (getModuleId(p)==calcRef && p->argc == 2) {
- k= coercionOptimizerStep(mb, i, p);
- actions += k;
- if( k) i--;
+ t = getVarType(mb, getArg(p,1));
+ if (getVarType(mb, getArg(p,0)) == t &&
strcmp(getFunctionId(p), ATOMname(t)) == 0) {
+ /* turn it into an assignment */
+ clrFunction(p);
+ actions ++;
+ }
}
}
/*
@@ -195,13 +176,14 @@ OPTcoercionImplementation(Client cntxt,M
chkTypes(cntxt->usermodule, mb, FALSE);
chkFlow(mb);
chkDeclarations(mb);
- }
+ }
/* keep all actions taken as a post block comment */
usec = GDKusec()- usec;
snprintf(buf,256,"%-20s actions=%2d time=" LLFMT "
usec","coercion",actions, usec);
newComment(mb,buf);
if( actions >= 0)
addtoMalBlkHistory(mb);
+ /* else we can also remove the request to apply the next alias
optimizer */
return msg;
}
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
@@ -68,6 +68,7 @@ static struct PIPELINES {
"optimizer.remap();"
"optimizer.costModel();"
"optimizer.coercions();"
+ "optimizer.aliases();"
"optimizer.evaluate();"
"optimizer.emptybind();"
"optimizer.pushselect();"
@@ -104,6 +105,7 @@ static struct PIPELINES {
"optimizer.remap();"
"optimizer.costModel();"
"optimizer.coercions();"
+ "optimizer.aliases();"
"optimizer.evaluate();"
"optimizer.emptybind();"
"optimizer.pushselect();"
@@ -148,6 +150,7 @@ static struct PIPELINES {
"optimizer.remap();"
"optimizer.costModel();"
"optimizer.coercions();"
+ "optimizer.aliases();"
"optimizer.evaluate();"
"optimizer.emptybind();"
"optimizer.pushselect();"
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -7,7 +7,7 @@
*/
/*
- * The first attempt of the multiple optimizer is to locate
+ * The first attempt of the multiplex optimizer is to locate
* a properly typed multi-plexed implementation.
* The policy is to search for bat<mod>.<fcn> before going
* into the iterator code generation.
@@ -245,11 +245,11 @@ OPTmultiplexInline(Client cntxt, MalBlkP
setModuleId(q,putName(buf));
q->typechk = TYPE_UNKNOWN;
- actions++;
/* now see if we can resolve the
instruction */
typeChecker(cntxt->usermodule,mq,q,TRUE);
if( q->typechk== TYPE_UNKNOWN)
goto terminateMX;
+ actions++;
break;
}
/* handle simple upgraded assignments as well */
@@ -261,11 +261,11 @@ OPTmultiplexInline(Client cntxt, MalBlkP
q= pushArgument(mq,q, getArg(q,1));
getArg(q,1)= refbat;
- actions++;
q->typechk = TYPE_UNKNOWN;
typeChecker(cntxt->usermodule,mq,q,TRUE);
if( q->typechk== TYPE_UNKNOWN)
goto terminateMX;
+ actions++;
break;
}
}
diff --git
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
---
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
+++
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
@@ -40,12 +40,12 @@ function user.s4_1():void;
X_5:int := sql.mvc();
X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str,
0:int);
C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
- C_95:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
+ C_96:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
(X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "name":str, 2:int);
- C_96:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, false:bit);
+ C_97:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, false:bit);
X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"name":str, 1:int);
- C_98:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
- C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+ C_99:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
+ C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 0:int);
(X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "func":str, 2:int);
X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 1:int);
@@ -101,12 +101,12 @@ function user.s6_1():void;
X_5:int := sql.mvc();
X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str,
0:int);
C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
- C_95:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
+ C_96:bat[:oid] := algebra.likeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
(X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "name":str, 2:int);
- C_96:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, true:bit);
+ C_97:bat[:oid] := algebra.likeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, true:bit);
X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"name":str, 1:int);
- C_98:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
- C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+ C_99:bat[:oid] := algebra.likeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
+ C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 0:int);
(X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "func":str, 2:int);
X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 1:int);
@@ -163,12 +163,12 @@ function user.s8_1():void;
X_5:int := sql.mvc();
X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str,
0:int);
C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
- C_95:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
+ C_96:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
(X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "name":str, 2:int);
- C_96:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, false:bit);
+ C_97:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, false:bit);
X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"name":str, 1:int);
- C_98:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
- C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+ C_99:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, false:bit);
+ C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 0:int);
(X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "func":str, 2:int);
X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 1:int);
@@ -223,12 +223,12 @@ function user.s10_1():void;
X_5:int := sql.mvc();
X_9:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str, "name":str,
0:int);
C_6:bat[:oid] := sql.tid(X_5:int, "sys":str, "functions":str);
- C_95:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
+ C_96:bat[:oid] := algebra.ilikeselect(X_9:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
(X_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "name":str, 2:int);
- C_96:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, true:bit);
+ C_97:bat[:oid] := algebra.ilikeselect(X_15:bat[:str], nil:bat[:oid],
"%optimizers%":str, "":str, true:bit);
X_12:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"name":str, 1:int);
- C_98:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
- C_29:bat[:oid] := sql.subdelta(C_95:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_96:bat[:oid], C_98:bat[:oid]);
+ C_99:bat[:oid] := algebra.ilikeselect(X_12:bat[:str], C_6:bat[:oid],
"%optimizers%":str, "":str, true:bit);
+ C_29:bat[:oid] := sql.subdelta(C_96:bat[:oid], C_6:bat[:oid],
X_14:bat[:oid], C_97:bat[:oid], C_99:bat[:oid]);
X_19:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 0:int);
(X_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5:int, "sys":str,
"functions":str, "func":str, 2:int);
X_21:bat[:str] := sql.bind(X_5:int, "sys":str, "functions":str,
"func":str, 1:int);
diff --git a/sql/test/Tests/setoptimizer.stable.out
b/sql/test/Tests/setoptimizer.stable.out
--- a/sql/test/Tests/setoptimizer.stable.out
+++ b/sql/test/Tests/setoptimizer.stable.out
@@ -64,11 +64,11 @@ Ready.
% .L1, .L1, .L1 # table_name
% name, def, status # name
% clob, clob, clob # type
-% 15, 621, 6 # length
+% 15, 641, 6 # length
[ "minimal_pipe",
"optimizer.inline();optimizer.remap();optimizer.deadcode();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.garbageCollector();",
"stable" ]
-[ "default_pipe",
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
"stable" ]
-[ "volcano_pipe",
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.volcano();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
"stable" ]
-[ "no_mitosis_pipe",
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
"stable" ]
+[ "default_pipe",
"optimizer.inline();optimizer.remap();optimizer.costModel();optimizer.coercions();optimizer.aliases();optimizer.evaluate();optimizer.emptybind();optimizer.pushselect();optimizer.aliases();optimizer.mitosis();optimizer.mergetable();optimizer.deadcode();optimizer.aliases();optimizer.constants();optimizer.commonTerms();optimizer.projectionpath();optimizer.deadcode();optimizer.reorder();optimizer.matpack();optimizer.dataflow();optimizer.querylog();optimizer.multiplex();optimizer.generator();optimizer.profiler();optimizer.candidates();optimizer.postfix();optimizer.deadcode();optimizer.wlc();optimizer.garbageCollector();",
"stable" ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list