Changeset: 045cb2f0294d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=045cb2f0294d
Modified Files:
clients/Tests/exports.stable.out
monetdb5/optimizer/opt_dataflow.c
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_support.c
monetdb5/optimizer/opt_support.h
Branch: default
Log Message:
Add support for blocking optimizers
Some optimizers, e.g. mergetable and dataflow, may only be applied
once against a MAL block. The second call should be ignored.
diffs (74 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -2347,6 +2347,7 @@ str operatorName(int i);
lng optDebug;
str optimizeMALBlock(Client cntxt, MalBlkPtr mb);
str optimizerCheck(Client cntxt, MalBlkPtr mb, str name, int actions, lng
usec);
+int optimizerIsApplied(MalBlkPtr mb, str name);
str optimizerRef;
str optimizer_prelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
str pack2Ref;
diff --git a/monetdb5/optimizer/opt_dataflow.c
b/monetdb5/optimizer/opt_dataflow.c
--- a/monetdb5/optimizer/opt_dataflow.c
+++ b/monetdb5/optimizer/opt_dataflow.c
@@ -208,6 +208,8 @@ OPTdataflowImplementation(Client cntxt,
if (GDKnr_threads <= 1)
return 0;
+ if ( optimizerIsApplied(mb,"dataflow"))
+ return 0;
(void) stk;
/* inlined functions will get their dataflow control later */
if ( mb->inlineProp)
diff --git a/monetdb5/optimizer/opt_mergetable.c
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -1495,6 +1495,8 @@ OPTmergetableImplementation(Client cntxt
char buf[256];
lng usec = GDKusec();
+ if( optimizerIsApplied(mb, "mergetable"))
+ return 0;
old = mb->stmt;
oldtop= mb->stop;
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -203,6 +203,24 @@ OPTsetDebugStr(void *ret, str *nme)
return MAL_SUCCEED;
}
+/* some optimizers can only be applied once.
+ * The optimizer trace at the end of the MAL block
+ * can be used to check for this.
+ */
+int
+optimizerIsApplied(MalBlkPtr mb, str optname)
+{
+ InstrPtr p;
+ int i;
+ for( i = mb->stop; i < mb->ssize; i++){
+ p = getInstrPtr(mb,i);
+ if( p == NULL)
+ return 0;
+ if (getModuleId(p) == optimizerRef && p->token == REMsymbol &&
strcmp(getFunctionId(p),optname) == 0)
+ return 1;
+ }
+ return 0;
+}
/*
* All optimizers should pass the optimizerCheck for defense against
* incomplete and malicious MAL code.
diff --git a/monetdb5/optimizer/opt_support.h b/monetdb5/optimizer/opt_support.h
--- a/monetdb5/optimizer/opt_support.h
+++ b/monetdb5/optimizer/opt_support.h
@@ -74,6 +74,7 @@ mal_export str optimizeMALBlock(Client c
mal_export void showOptimizerStep(str fnme,int i, int flg);
mal_export void showOptimizerHistory(void);
+mal_export int optimizerIsApplied(MalBlkPtr mb, str name);
mal_export int isUnsafeInstruction(InstrPtr q);
mal_export int isUnsafeFunction(InstrPtr q);
mal_export int isInvariant(MalBlkPtr mb, int pcf, int pcl, int varid);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list