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

Reply via email to