Changeset: 76cd1f67dc93 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/76cd1f67dc93
Modified Files:
monetdb5/optimizer/opt_macro.c
monetdb5/optimizer/opt_macro.h
Branch: default
Log Message:
Update optimizers to use new calling convention and fix memory leaks
diffs (237 lines):
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
@@ -234,7 +234,7 @@ MACROvalidate(MalBlkPtr mb)
return MAL_SUCCEED;
}
-str
+static int
MACROprocessor(Client cntxt, MalBlkPtr mb, Symbol t)
{
InstrPtr q;
@@ -243,28 +243,29 @@ MACROprocessor(Client cntxt, MalBlkPtr m
(void) cntxt;
if (t == NULL)
- return msg;
- msg = MACROvalidate(t->def);
- if (msg)
- return msg;
+ return 0;
+ if ((msg = MACROvalidate(t->def))) {
+ freeException(msg);
+ return 0;
+ }
for (i = 0; i < mb->stop; i++) {
q = getInstrPtr(mb, i);
if (getFunctionId(q) && idcmp(getFunctionId(q), t->name) == 0 &&
getSignature(t)->token == FUNCTIONsymbol) {
- if (i == last)
- throw(MAL, "optimizer.MACROoptimizer",
SQLSTATE(HY002) MACRO_DUPLICATE);
+ if (i == last) /* Duplicate macro expansion */
+ return cnt;
last = i;
i = inlineMALblock(mb, i, t->def);
- if( i < 0)
- throw(MAL, "optimizer.MACROoptimizer",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ if( i < 0) /* Allocation failure */
+ return cnt;
cnt++;
- if (cnt > MAXEXPANSION)
- throw(MAL, "optimizer.MACROoptimizer",
SQLSTATE(HY002) MACRO_TOO_DEEP);
+ if (cnt > MAXEXPANSION) /* Too many macro expansions */
+ return cnt;
}
}
- return msg;
+ return cnt;
}
/*
@@ -354,7 +355,7 @@ replaceMALblock(MalBlkPtr mb, int pc, Ma
}
static str
-ORCAMprocessor(Client cntxt, MalBlkPtr mb, Symbol t)
+ORCAMprocessor(Client cntxt, MalBlkPtr mb, Symbol t, int *actions)
{
MalBlkPtr mc;
int i;
@@ -373,6 +374,7 @@ ORCAMprocessor(Client cntxt, MalBlkPtr m
if (msg == MAL_SUCCEED){
if( replaceMALblock(mb, i, mc) < 0)
throw(MAL,"orcam", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ (*actions)++;
} else
break;
}
@@ -385,17 +387,15 @@ ORCAMprocessor(Client cntxt, MalBlkPtr m
return msg;
}
-str
+static int
OPTmacroImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
{
MalBlkPtr target= mb;
Module s;
Symbol t;
str mod,fcn;
- int j;
- str msg = MAL_SUCCEED;
+ int j, actions = 0;
- (void) cntxt;
(void) stk;
if( p->argc == 3){
@@ -419,15 +419,11 @@ OPTmacroImplementation(Client cntxt, Mal
for (t = s->space[j]; t != NULL; t = t->peer)
if (t->def->errors == 0) {
if (getSignature(t)->token == FUNCTIONsymbol){
- msg = MACROprocessor(cntxt, target, t);
- // failures from the macro expansion
are ignored
- // They leave the scene as is
- if ( msg)
- freeException(msg);
+ actions += MACROprocessor(cntxt,
target, t);
}
}
}
- return MAL_SUCCEED;
+ return actions;
}
/*
* The optimizer call infrastructure is identical to the liners
@@ -435,8 +431,8 @@ OPTmacroImplementation(Client cntxt, Mal
* functions, regardless their
*/
-str
-OPTorcamImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
+static str
+OPTorcamImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p,
int *actions)
{
MalBlkPtr target= mb;
Module s;
@@ -470,7 +466,7 @@ OPTorcamImplementation(Client cntxt, Mal
if (t->def->errors == 0) {
if (getSignature(t)->token == FUNCTIONsymbol) {
freeException(msg);
- msg =ORCAMprocessor(cntxt, target, t);
+ msg =ORCAMprocessor(cntxt, target, t,
actions);
}
}
}
@@ -480,9 +476,7 @@ OPTorcamImplementation(Client cntxt, Mal
str OPTmacro(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p){
Symbol t;
str msg = MAL_SUCCEED, mod, fcn;
- lng clk= GDKusec();
- char buf[256];
- lng usec = GDKusec();
+ int actions = 0;
if( p ==NULL )
return 0;
@@ -502,36 +496,25 @@ str OPTmacro(Client cntxt, MalBlkPtr mb,
if( msg)
return msg;
if( mb->errors == 0)
- msg= OPTmacroImplementation(cntxt,mb,stk,p);
- // similar to OPTmacro
- if( msg) {
- freeException(msg);
- msg= MAL_SUCCEED;
- }
+ actions = OPTmacroImplementation(cntxt,mb,stk,p);
/* Defense line against incorrect plans */
- msg = chkTypes(cntxt->usermodule, mb, FALSE);
- if( msg == MAL_SUCCEED) msg = chkFlow(mb);
- if( msg == MAL_SUCCEED) msg = chkDeclarations(mb);
- if (msg != MAL_SUCCEED)
- return msg;
- usec += GDKusec() - clk;
- /* keep all actions taken as a post block comment */
- snprintf(buf,256,"%-20s actions= 1 time=" LLFMT " usec","macro",usec);
- newComment(mb,buf);
- addtoMalBlkHistory(mb);
- if (mb->errors)
- throw(MAL, "optimizer.macro", SQLSTATE(42000) PROGRAM_GENERAL);
- return MAL_SUCCEED;
+ if (actions > 0){
+ msg = chkTypes(cntxt->usermodule, mb, FALSE);
+ if (!msg)
+ msg = chkFlow(mb);
+ if (!msg)
+ msg = chkDeclarations(mb);
+ }
+ /* keep actions taken as a fake argument*/
+ (void) pushInt(mb, p, actions);
+ return msg;
}
str OPTorcam(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p){
Symbol t;
- str mod,fcn;
- lng clk= GDKusec();
- char buf[256];
- lng usec = GDKusec();
- str msg = MAL_SUCCEED;
+ str msg = MAL_SUCCEED, mod, fcn;
+ int actions = 0;
if( p ==NULL )
return 0;
@@ -551,21 +534,18 @@ str OPTorcam(Client cntxt, MalBlkPtr mb,
if( msg)
return msg;
if( mb->errors == 0)
- msg= OPTorcamImplementation(cntxt,mb,stk,p);
+ msg= OPTorcamImplementation(cntxt,mb,stk,p, &actions);
if( msg)
return msg;
- msg = chkTypes(cntxt->usermodule, mb, FALSE);
- if( msg == MAL_SUCCEED) msg = chkFlow(mb);
- if( msg == MAL_SUCCEED) msg = chkDeclarations(mb);
- if (msg != MAL_SUCCEED)
- return msg;
- usec += GDKusec() - clk;
- /* keep all actions taken as a post block comment */
- usec = GDKusec()- usec;
- snprintf(buf,256,"%-20s actions= 1 time=" LLFMT " usec","orcam",usec);
- newComment(mb,buf);
- addtoMalBlkHistory(mb);
- if (mb->errors)
- throw(MAL, "optimizer.orcam", SQLSTATE(42000) PROGRAM_GENERAL);
- return MAL_SUCCEED;
+ /* Defense line against incorrect plans */
+ if (actions > 0){
+ msg = chkTypes(cntxt->usermodule, mb, FALSE);
+ if (!msg)
+ msg = chkFlow(mb);
+ if (!msg)
+ msg = chkDeclarations(mb);
+ }
+ /* keep actions taken as a fake argument*/
+ (void) pushInt(mb, p, actions);
+ return msg;
}
diff --git a/monetdb5/optimizer/opt_macro.h b/monetdb5/optimizer/opt_macro.h
--- a/monetdb5/optimizer/opt_macro.h
+++ b/monetdb5/optimizer/opt_macro.h
@@ -9,10 +9,7 @@
#ifndef _MAL_MACRO_H_
#define _MAL_MACRO_H_
-extern str MACROprocessor(Client cntxt, MalBlkPtr mb, Symbol t);
extern int inlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc);
-extern str OPTmacroImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr p);
-extern str OPTorcamImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr p);
extern str OPTmacro(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
extern str OPTorcam(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list