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