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

Reply via email to