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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list