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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list