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