Changeset: 5326eb88e506 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5326eb88e506
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_instruction.h
        monetdb5/mal/mal_session.c
        monetdb5/modules/mal/wlc.c
        monetdb5/optimizer/opt_deadcode.c
        monetdb5/optimizer/opt_support.c
        sql/backends/monet5/wlr.c
Branch: default
Log Message:

Prepare cleanup of MAL block initialization


diffs (213 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1295,8 +1295,8 @@ const char *rename_tableRef;
 const char *rename_userRef;
 const char *replaceRef;
 const char *replicatorRef;
-void resetMalBlk(MalBlkPtr mb, int stop);
-void resetMalBlkAndFreeInstructions(MalBlkPtr mb, int stop);
+void resetMalTypes(MalBlkPtr mb, int stop);
+void resetMalBlk(MalBlkPtr mb);
 void resetScenario(Client c);
 int resizeMalBlk(MalBlkPtr mb, int elements);
 int resolveType(int dsttype, int srctype);
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
@@ -190,10 +190,11 @@ resizeMalBlk(MalBlkPtr mb, int elements)
        }
        return 0;
 }
-/* The resetMalBlk code removes instructions, but without freeing the
- * space. This way the structure is prepared for re-use */
+/* For a MAL session we have to keep the variables around
+ * and only need to reset the instruction pointer
+ */
 void
-resetMalBlk(MalBlkPtr mb, int stop)
+resetMalTypes(MalBlkPtr mb, int stop)
 {
        int i;
 
@@ -203,18 +204,53 @@ resetMalBlk(MalBlkPtr mb, int stop)
        mb->errors = NULL;
 }
 
+/* For SQL operations we have to cleanup variables and trim the space
+ * A portion is retained for the next query */
 void
-resetMalBlkAndFreeInstructions(MalBlkPtr mb, int stop)
+resetMalBlk(MalBlkPtr mb)
 {
        int i;
+       InstrPtr *new;
+       VarRecord *vnew;
 
-       for(i=stop; i<mb->stop; i++) {
+       for(i=MALCHUNK; i<mb->ssize; i++) {
                freeInstruction(mb->stmt[i]);
                mb->stmt[i] = NULL;
        }
-       resetMalBlk(mb, stop);
+       if( mb->ssize != MALCHUNK){
+               new = (InstrPtr*) GDKrealloc(mb->var, sizeof(InstrPtr) * 
MALCHUNK);
+               if( new == NULL){
+                       // the only place to return an error signal at this 
stage.
+                       // The Client context should be passed around more 
deeply
+                       mb->errors = createMalException(mb,0,TYPE, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       return ;
+               }
+               mb->stmt = new;
+               mb->ssize = MALCHUNK;
+       }
+       /* Reuse the initial function statement */
+       mb->stop = 1;
+       resetMalTypes(mb, 1);
+
+       for(i=0; i< mb->vtop; i++)
+               VALclear(&getVarConstant(mb,i));
+
+       if(mb->vsize != MALCHUNK){
+               vnew = (VarRecord*) GDKrealloc(mb->var, sizeof(VarRecord) * 
MALCHUNK);
+               if (vnew == NULL) {
+                       // the only place to return an error signal at this 
stage.
+                       // The Client context should be passed around more 
deeply
+                       mb->errors = createMalException(mb,0,TYPE, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       return;
+               }
+               mb->var = vnew;
+               mb->vsize = MALCHUNK;
+       }
+    mb->vtop = 1;
+    mb->vid = 1;
 }
 
+
 /* The freeMalBlk code is quite defensive. It is used to localize an
  * illegal re-use of a MAL blk. */
 void
diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -134,8 +134,8 @@ mal_export void freeSymbolList(Symbol s)
 mal_export void printSignature(stream *fd, Symbol s, int flg);
 
 mal_export MalBlkPtr newMalBlk(int elements);
-mal_export void resetMalBlk(MalBlkPtr mb, int stop);
-mal_export void resetMalBlkAndFreeInstructions(MalBlkPtr mb, int stop);
+mal_export void resetMalBlk(MalBlkPtr mb);
+mal_export void resetMalTypes(MalBlkPtr mb, int stop);
 mal_export int newMalBlkStmt(MalBlkPtr mb, int elements);
 mal_export int resizeMalBlk(MalBlkPtr mb, int elements);
 mal_export int prepareMalBlk(MalBlkPtr mb, str s);
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -621,7 +621,7 @@ MALparser(Client c)
                msg =c->curprg->def->errors;
                c->curprg->def->errors = 0;
                MSresetVariables(c, c->curprg->def, c->glb, oldstate.vtop);
-               resetMalBlk(c->curprg->def, 1);
+               resetMalTypes(c->curprg->def, 1);
                return msg;
        }
        pushEndInstruction(c->curprg->def);
@@ -629,7 +629,7 @@ MALparser(Client c)
        if (msg !=MAL_SUCCEED || (msg =c->curprg->def->errors) ){
                c->curprg->def->errors = 0;
                MSresetVariables(c, c->curprg->def, c->glb, oldstate.vtop);
-               resetMalBlk(c->curprg->def, 1);
+               resetMalTypes(c->curprg->def, 1);
                return msg;
        }
        return MAL_SUCCEED;
@@ -689,7 +689,7 @@ MALengine(Client c)
                msg = prg->def->errors;
                prg->def->errors = NULL;
                MSresetVariables(c, c->curprg->def, c->glb, oldstate.vtop);
-               resetMalBlk(c->curprg->def, 1);
+               resetMalTypes(c->curprg->def, 1);
                return msg;
        }
        if (prg->def->stop == 1 || MALcommentsOnly(prg->def))
@@ -724,7 +724,7 @@ MALengine(Client c)
                }
        }
        MSresetVariables(c, prg->def, c->glb, 0);
-       resetMalBlk(prg->def, 1);
+       resetMalTypes(prg->def, 1);
        if (c->glb) {
                /* for global stacks avoid reinitialization from this point */
                c->glb->stkbot = prg->def->vtop;
diff --git a/monetdb5/modules/mal/wlc.c b/monetdb5/modules/mal/wlc.c
--- a/monetdb5/modules/mal/wlc.c
+++ b/monetdb5/modules/mal/wlc.c
@@ -563,7 +563,7 @@ WLCpreparewrite(Client cntxt)
 
        if( wlc_state != WLC_RUN){
                trimMalVariables(cntxt->wlc, NULL);
-               resetMalBlk(cntxt->wlc, 0);
+               resetMalTypes(cntxt->wlc, 0);
                cntxt->wlc_kind = WLC_QUERY;
                return MAL_SUCCEED;
        }
@@ -585,7 +585,7 @@ WLCpreparewrite(Client cntxt)
 
                MT_lock_unset(&wlc_lock);
                trimMalVariables(cntxt->wlc, NULL);
-               resetMalBlk(cntxt->wlc, 0);
+               resetMalTypes(cntxt->wlc, 0);
                cntxt->wlc_kind = WLC_QUERY;
        } else
                throw(MAL,"wlc.write","WLC log path missing ");
diff --git a/monetdb5/optimizer/opt_deadcode.c 
b/monetdb5/optimizer/opt_deadcode.c
--- a/monetdb5/optimizer/opt_deadcode.c
+++ b/monetdb5/optimizer/opt_deadcode.c
@@ -40,6 +40,7 @@ OPTdeadcodeImplementation(Client cntxt, 
                GDKfree(varused);
                throw(MAL,"optimizer.deadcode", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
+       //mnstr_printf(cntxt->fdout,"deadcode limit %d ssize %d vtop %d vsize 
%d\n", limit, (int)(mb->ssize), mb->vtop, (int)(mb->vsize));
 
        // Calculate the instructions in which a variable is used.
        // Variables can be used multiple times in an instruction.
@@ -107,9 +108,11 @@ OPTdeadcodeImplementation(Client cntxt, 
                        }
                }
        }
+       /* save the free instructions records for later */
        for(; i<slimit; i++)
-               if( old[i])
-                       freeInstruction(old[i]);
+       if(old[i]){
+               freeInstruction(old[i]);
+       }
     /* Defense line against incorrect plans */
        /* we don't create or change existing structures */
         // no type change msg = chkTypes(cntxt->usermodule, mb, FALSE);
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
@@ -141,7 +141,7 @@ optimizeMALBlock(Client cntxt, MalBlkPtr
 
        // strong defense line, assure that MAL plan is initially correct
        if( mb->errors == 0 && mb->stop > 1){
-               resetMalBlk(mb, mb->stop);
+               resetMalTypes(mb, mb->stop);
                msg = chkTypes(cntxt->usermodule, mb, FALSE);
                if (!msg)
                        msg = chkFlow(mb);
diff --git a/sql/backends/monet5/wlr.c b/sql/backends/monet5/wlr.c
--- a/sql/backends/monet5/wlr.c
+++ b/sql/backends/monet5/wlr.c
@@ -198,8 +198,7 @@ WLRgetMaster(void)
  */
 
 #define cleanup(){\
-       resetMalBlkAndFreeInstructions(mb, 1);\
-       trimMalVariables(mb, NULL);\
+       resetMalBlk(mb);\
        }
 
 static str
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to