Changeset: 677e8193f70b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=677e8193f70b
Modified Files:
monetdb5/mal/mal_instruction.c
monetdb5/mal/mal_resolve.c
monetdb5/optimizer/opt_macro.c
monetdb5/optimizer/opt_multiplex.c
monetdb5/optimizer/opt_projectionpath.c
monetdb5/optimizer/opt_pushselect.c
monetdb5/optimizer/opt_remap.c
Branch: default
Log Message:
only do type resolving once. Beware if your writing a mal optimizer,
mark changed statements (If not replaced by newInstructions somehow)
as unresolved (ie p->typechk = TYPE_UNKNOWN).
diffs (135 lines):
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -174,6 +174,10 @@ wrapup:
void
resetMalBlk(MalBlkPtr mb, int stop)
{
+ int i;
+
+ for(i=0; i<stop; i++)
+ mb->stmt[i] ->typechk = TYPE_UNKNOWN;
mb->stop = stop;
}
@@ -513,6 +517,7 @@ oldmoveInstruction(InstrPtr new, InstrPt
memcpy((char *) new, (char *) p, space);
setFunctionId(new, getFunctionId(p));
setModuleId(new, getModuleId(p));
+ new->typechk = TYPE_UNKNOWN;
}
/* Query optimizers walk their way through a MAL program block. They
diff --git a/monetdb5/mal/mal_resolve.c b/monetdb5/mal/mal_resolve.c
--- a/monetdb5/mal/mal_resolve.c
+++ b/monetdb5/mal/mal_resolve.c
@@ -728,7 +728,8 @@ chkTypes(stream *out, Module s, MalBlkPt
for (i = 0; i < mb->stop; i++) {
p = getInstrPtr(mb, i);
assert (p != NULL);
- typeChecker(out, s, mb, p, silent);
+ if (p->typechk != TYPE_RESOLVED)
+ typeChecker(out, s, mb, p, silent);
if (mb->errors)
return;
@@ -749,6 +750,8 @@ chkInstruction(stream *out, Module s, Ma
{
int olderrors= mb->errors;
int error;
+
+ p->typechk = TYPE_UNKNOWN;
typeChecker(out, s, mb, p, TRUE);
error = mb->errors;
mb->errors = olderrors;
diff --git a/monetdb5/optimizer/opt_macro.c b/monetdb5/optimizer/opt_macro.c
--- a/monetdb5/optimizer/opt_macro.c
+++ b/monetdb5/optimizer/opt_macro.c
@@ -181,6 +181,7 @@ inlineMALblock(MalBlkPtr mb, int pc, Mal
clrVarFixed(mb,getArg(ns[k],n)); /* for typing
*/
setModuleId(ns[k],getModuleId(q));
setFunctionId(ns[k],getFunctionId(q));
+ ns[k]->typechk = TYPE_UNKNOWN;
ns[k]->barrier = 0;
ns[k]->token = ASSIGNsymbol;
}
diff --git a/monetdb5/optimizer/opt_multiplex.c
b/monetdb5/optimizer/opt_multiplex.c
--- a/monetdb5/optimizer/opt_multiplex.c
+++ b/monetdb5/optimizer/opt_multiplex.c
@@ -192,8 +192,10 @@ OPTmultiplexSimple(Client cntxt, MalBlkP
if(mb)
for( i=0; i<mb->stop; i++){
p= getInstrPtr(mb,i);
- if(isMultiplex(p))
+ if(isMultiplex(p)) {
+ p->typechk = TYPE_UNKNOWN;
doit++;
+ }
}
if( doit) {
OPTmultiplexImplementation(cntxt, mb, 0, 0);
@@ -226,6 +228,7 @@ OPTmultiplexImplementation(Client cntxt,
if (msg == MAL_SUCCEED && isMultiplex(p)) {
if ( MANIFOLDtypecheck(cntxt,mb,p) != NULL){
setFunctionId(p, manifoldRef);
+ p->typechk = TYPE_UNKNOWN;
pushInstruction(mb, p);
actions++;
continue;
diff --git a/monetdb5/optimizer/opt_projectionpath.c
b/monetdb5/optimizer/opt_projectionpath.c
--- a/monetdb5/optimizer/opt_projectionpath.c
+++ b/monetdb5/optimizer/opt_projectionpath.c
@@ -81,6 +81,7 @@ OPTprojectionPrefix(Client cntxt, MalBlk
setVarUDFtype(mb, getArg(r,0));
if( r->argc == 3)
setFunctionId(r,projectionRef);
+ r->typechk = TYPE_UNKNOWN;
pushInstruction(mb,r);
OPTDEBUGprojectionpath {
mnstr_printf(cntxt->fdout,"#projectionpath
prefix instruction\n");
@@ -253,6 +254,7 @@ OPTprojectionpathImplementation(Client c
setVarType(mb, getArg(q,0), newBatType( TYPE_oid,
getColumnType(getArgType(mb,q,q->argc-1))));
if ( getFunctionId(q) == projectionRef )
setFunctionId(q,projectionpathRef);
+ q->typechk = TYPE_UNKNOWN;
OPTDEBUGprojectionpath {
mnstr_printf(cntxt->fdout,"#after ");
printInstruction(cntxt->fdout,mb, 0, q,
LIST_MAL_ALL);
diff --git a/monetdb5/optimizer/opt_pushselect.c
b/monetdb5/optimizer/opt_pushselect.c
--- a/monetdb5/optimizer/opt_pushselect.c
+++ b/monetdb5/optimizer/opt_pushselect.c
@@ -526,6 +526,7 @@ OPTpushselectImplementation(Client cntxt
getArg(r, 0) = newTmpVariable(mb,
newBatType(TYPE_oid, TYPE_oid));
setVarCList(mb,getArg(r,0));
getArg(r, 1) = getArg(q, 1); /* column */
+ r->typechk = TYPE_UNKNOWN;
pushInstruction(mb,r);
getArg(s, 0) = newTmpVariable(mb,
newBatType(TYPE_oid, TYPE_oid));
setVarCList(mb,getArg(s,0));
@@ -550,6 +551,7 @@ OPTpushselectImplementation(Client cntxt
getArg(u, 3) = getArg(q,2); /* update ids */
getArg(u, 4) = getArg(s,0);
u = pushArgument(mb, u, getArg(t,0));
+ u->typechk = TYPE_UNKNOWN;
pushInstruction(mb,u);
freeInstruction(p);
continue;
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
@@ -229,6 +229,7 @@ OPTmultiplexInline(Client cntxt, MalBlkP
if (getModuleId(q)){
snprintf(buf,1024,"bat%s",getModuleId(q));
setModuleId(q,putName(buf));
+ q->typechk = TYPE_UNKNOWN;
actions++;
/* now see if we can resolve the
instruction */
@@ -247,6 +248,7 @@ OPTmultiplexInline(Client cntxt, MalBlkP
getArg(q,1)= refbat;
actions++;
+ q->typechk = TYPE_UNKNOWN;
typeChecker(cntxt->fdout,
cntxt->nspace,mq,q,TRUE);
if( q->typechk== TYPE_UNKNOWN)
goto terminateMX;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list