Changeset: bea64b6fa208 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bea64b6fa208
Modified Files:
        monetdb5/modules/mal/manifold.c
        monetdb5/optimizer/opt_commonTerms.c
        monetdb5/optimizer/opt_dataflow.c
        monetdb5/optimizer/opt_support.c
        monetdb5/optimizer/opt_support.h
        sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
Branch: default
Log Message:

unsafe functions shouldn't be removed by the commonTerms optimizer. This
also holds for multiplex/manifold cases.


diffs (151 lines):

diff --git a/monetdb5/modules/mal/manifold.c b/monetdb5/modules/mal/manifold.c
--- a/monetdb5/modules/mal/manifold.c
+++ b/monetdb5/modules/mal/manifold.c
@@ -203,7 +203,8 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
 #endif
        // Localize the underlying opertor
        typeChecker(cntxt->fdout, cntxt->nspace, nmb, q, TRUE);
-       if ( nmb->errors || q->fcn == NULL || q->token != CMDcall)
+       if (nmb->errors || q->fcn == NULL || q->token != CMDcall ||
+               varGetProp( q->blk, getArg(getInstrPtr(q->blk,0), 0), 
PropertyIndex("unsafe") ) != NULL)
                fcn = NULL;
        else
                fcn = q->fcn;
diff --git a/monetdb5/optimizer/opt_commonTerms.c 
b/monetdb5/optimizer/opt_commonTerms.c
--- a/monetdb5/optimizer/opt_commonTerms.c
+++ b/monetdb5/optimizer/opt_commonTerms.c
@@ -117,7 +117,7 @@ OPTcommonTermsImplementation(Client cntx
                mnstr_printf(cntxt->fdout,"#CANDIDATE[%d] ",i);
                printInstruction(cntxt->fdout, mb, 0, p, LIST_MAL_ALL);
 #endif
-               prop = hasSideEffects(p,TRUE) || isUpdateInstruction(p);
+               prop = mayhaveSideEffects(cntxt, mb, p,TRUE) || 
isUpdateInstruction(p);
                j =     isVarConstant(mb, getArg(p,p->argc-1))? cstlist: 
candidate;
                                
                cnt = mb->stop / 128 < 32? 32 : mb->stop/128;   /* limit search 
depth */
@@ -133,7 +133,7 @@ OPTcommonTermsImplementation(Client cntx
                                        q->token != ASSIGNsymbol ,
                                        list[getArg(q,q->argc-1)],i,
                                        !hasCommonResults(p, q), 
-                                       !hasSideEffects(q, TRUE),
+                                       !mayhaveSideEffects(cntxt, mb, q, TRUE),
                                        !isUpdateInstruction(q),
                                        isLinearFlow(q),
                                        isLinearFlow(p));
@@ -175,8 +175,8 @@ OPTcommonTermsImplementation(Client cntx
                                }
                        }
 #ifdef DEBUG_OPT_COMMONTERMS_MORE
-                       else if ( hasSideEffects(q, TRUE) || 
isUpdateInstruction(p)){
-                               mnstr_printf(cntxt->fdout, "COMMON SKIPPED %d 
%d\n", hasSideEffects(q, TRUE) , isUpdateInstruction(p));
+                       else if ( mayhaveSideEffects(cntxt, mb, q, TRUE) || 
isUpdateInstruction(p)){
+                               mnstr_printf(cntxt->fdout, "COMMON SKIPPED %d 
%d\n", mayhaveSideEffects(cntxt, mb, q, TRUE) , isUpdateInstruction(p));
                                printInstruction(cntxt->fdout, mb, 0, q, 
LIST_MAL_ALL);
                        }
 #endif
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
@@ -157,8 +157,12 @@ dflowAssignConflict(InstrPtr p, int pc, 
 
 /* a limited set of MAL instructions may appear in the dataflow block*/
 static int
-dataflowConflict(Client cntxt, MalBlkPtr mb,InstrPtr p) {
-       if ( p->token == ENDsymbol || (getFunctionId(p) == multiplexRef && 
MANIFOLDtypecheck(cntxt,mb,p)== NULL) || blockCntrl(p) || blockStart(p) || 
blockExit(p))     
+dataflowConflict(Client cntxt, MalBlkPtr mb,InstrPtr p) 
+{
+       if (p->token == ENDsymbol || 
+           (getFunctionId(p) == multiplexRef && 
+            MANIFOLDtypecheck(cntxt,mb,p) == NULL) || 
+           blockCntrl(p) || blockStart(p) || blockExit(p))
                return TRUE;
        switch(p->token){
        case ASSIGNsymbol:
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
@@ -128,6 +128,7 @@
 #include "mal_listing.h"
 #include "mal_debugger.h"
 #include "opt_multiplex.h"
+#include "manifold.h"
 
 /*
  * @-
@@ -778,6 +779,17 @@ hasSideEffects(InstrPtr p, int strict)
                return TRUE;
        return FALSE;
 }
+
+int
+mayhaveSideEffects(Client cntxt, MalBlkPtr mb, InstrPtr p, int strict)
+{
+       if (getModuleId(p) != malRef || getFunctionId(p) != multiplexRef) 
+               return hasSideEffects( p, strict);
+       if (MANIFOLDtypecheck(cntxt,mb,p) == NULL)
+               return TRUE;
+       return FALSE;
+}
+
 /*
  * @-
  * Side-effect free functions are crucial for several operators.
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
@@ -113,6 +113,7 @@ opt_export int hasCommonResults(InstrPtr
 opt_export int isProcedure(MalBlkPtr mb, InstrPtr p);
 opt_export int isUpdateInstruction(InstrPtr p);
 opt_export int hasSideEffects(InstrPtr p, int strict);
+opt_export int mayhaveSideEffects(Client cntxt, MalBlkPtr mb, InstrPtr p, int 
strict);
 opt_export int isSideEffectFree(MalBlkPtr mb);
 opt_export int isBlocking(InstrPtr p);
 opt_export int isAllScalar(MalBlkPtr mb, InstrPtr p);
diff --git 
a/sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out 
b/sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
--- a/sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
+++ b/sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
@@ -33,11 +33,11 @@ Ready.
 % .plan # table_name
 % rel # name
 % clob # type
-% 98 # length
+% 64 # length
 project (
 | join (
-| | table(sys.t4311) [ t4311.a as t2.a, t4311.%TID% NOT NULL as t2.%TID% ] 
COUNT ,
-| | table(sys.t4311) [ t4311.a as t1.a, t4311.b as t1.b, t4311.%TID% NOT NULL 
as t1.%TID% ] COUNT 
+| | table(sys.t4311) [ t4311.a as t2.a ] COUNT ,
+| | table(sys.t4311) [ t4311.a as t1.a, t4311.b as t1.b ] COUNT 
 | ) [ t1.a <= t2.a <= t1.b ]
 ) [ t2.a ]
 #plan 
@@ -48,11 +48,11 @@ project (
 % .plan # table_name
 % rel # name
 % clob # type
-% 98 # length
+% 64 # length
 project (
 | join (
-| | table(sys.t4311) [ t4311.a as t2.a, t4311.%TID% NOT NULL as t2.%TID% ] 
COUNT ,
-| | table(sys.t4311) [ t4311.a as t1.a, t4311.b as t1.b, t4311.%TID% NOT NULL 
as t1.%TID% ] COUNT 
+| | table(sys.t4311) [ t4311.a as t2.a ] COUNT ,
+| | table(sys.t4311) [ t4311.a as t1.a, t4311.b as t1.b ] COUNT 
 | ) [ t1.a <= t2.a <= t1.b ]
 ) [ t2.a ]
 #plan 
@@ -63,11 +63,11 @@ project (
 % .plan # table_name
 % rel # name
 % clob # type
-% 98 # length
+% 64 # length
 project (
 | join (
-| | table(sys.t4311) [ t4311.a as t2.a, t4311.%TID% NOT NULL as t2.%TID% ] 
COUNT ,
-| | table(sys.t4311) [ t4311.a as t1.a, t4311.b as t1.b, t4311.%TID% NOT NULL 
as t1.%TID% ] COUNT 
+| | table(sys.t4311) [ t4311.a as t2.a ] COUNT ,
+| | table(sys.t4311) [ t4311.a as t1.a, t4311.b as t1.b ] COUNT 
 | ) [ t1.a <= t2.a <= t1.b ]
 ) [ t2.a ]
 #drop table t4311;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to