Changeset: 5db56a1d5bc5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5db56a1d5bc5
Added Files:
sql/backends/monet5/Tests/rapi12.stable.err
sql/backends/monet5/Tests/rapi12.stable.out
Modified Files:
clients/Tests/MAL-signatures_all.stable.out
clients/Tests/MAL-signatures_all.stable.out.int128
clients/Tests/exports.stable.out
monetdb5/modules/mal/manifold.mal
monetdb5/optimizer/opt_dataflow.c
monetdb5/optimizer/opt_inline.c
monetdb5/optimizer/opt_multiplex.c
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
monetdb5/optimizer/opt_remap.c
monetdb5/optimizer/opt_support.c
monetdb5/optimizer/opt_support.h
sql/backends/monet5/Tests/All
sql/backends/monet5/Tests/rapi08.sql
sql/backends/monet5/Tests/rapi12.sql
sql/backends/monet5/sql_gencode.c
Branch: default
Log Message:
added a batmal.multiplex, ie pass the info that the functions return
bats per row input.
diffs (truncated from 464 to 300 lines):
diff --git a/clients/Tests/MAL-signatures_all.stable.out
b/clients/Tests/MAL-signatures_all.stable.out
--- a/clients/Tests/MAL-signatures_all.stable.out
+++ b/clients/Tests/MAL-signatures_all.stable.out
@@ -2751,6 +2751,8 @@ command batgeom.point(x:bat[:oid,:dbl],y
address wkbcreatepoint_bat;
comment Construct a point-BAT from two geometry-BATs
+pattern batmal.multiplex(mod:str,fcn:str,a:any...):any...
+address MANIFOLDremapMultiplex;
command batalgebra.ilike(s:bat[:oid,:str],pat:str):bat[:oid,:bit]
address BATPCREilike2;
command batalgebra.ilike(s:bat[:oid,:str],pat:str,esc:str):bat[:oid,:bit]
diff --git a/clients/Tests/MAL-signatures_all.stable.out.int128
b/clients/Tests/MAL-signatures_all.stable.out.int128
--- a/clients/Tests/MAL-signatures_all.stable.out.int128
+++ b/clients/Tests/MAL-signatures_all.stable.out.int128
@@ -3274,6 +3274,8 @@ command batgeom.point(x:bat[:oid,:dbl],y
address wkbcreatepoint_bat;
comment Construct a point-BAT from two geometry-BATs
+pattern batmal.multiplex(mod:str,fcn:str,a:any...):any...
+address MANIFOLDremapMultiplex;
command batalgebra.ilike(s:bat[:oid,:str],pat:str):bat[:oid,:bit]
address BATPCREilike2;
command batalgebra.ilike(s:bat[:oid,:str],pat:str,esc:str):bat[:oid,:bit]
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
@@ -2085,6 +2085,7 @@ void batBeforeCall(ValPtr v, ValPtr bak)
str batRef;
str batalgebraRef;
str batcalcRef;
+str batmalRef;
str batmmathRef;
str batmtimeRef;
str batstrRef;
@@ -2322,6 +2323,7 @@ int isLoopBarrier(MalBlkPtr mb, int pc);
int isMapOp(InstrPtr q);
int isMatJoinOp(InstrPtr q);
int isModuleDefined(Module scope, str name);
+int isMultiplex(InstrPtr q);
int isNotUsedIn(InstrPtr p, int start, int a);
int isOptimizerEnabled(MalBlkPtr mb, str opt);
int isOptimizerPipe(str name);
diff --git a/monetdb5/modules/mal/manifold.mal
b/monetdb5/modules/mal/manifold.mal
--- a/monetdb5/modules/mal/manifold.mal
+++ b/monetdb5/modules/mal/manifold.mal
@@ -16,9 +16,13 @@
# All Rights Reserved.
module mal;
+module batmal;
pattern mal.multiplex(mod:str,fcn:str,a:any...):any...
address MANIFOLDremapMultiplex;
+pattern batmal.multiplex(mod:str,fcn:str,a:any...):any...
+address MANIFOLDremapMultiplex;
+
pattern mal.manifold(mod:str,fcn:str, a:any...):bat[:oid,:any]
address MANIFOLDevaluate;
diff --git a/monetdb5/optimizer/opt_dataflow.c
b/monetdb5/optimizer/opt_dataflow.c
--- a/monetdb5/optimizer/opt_dataflow.c
+++ b/monetdb5/optimizer/opt_dataflow.c
@@ -173,9 +173,7 @@ static int
dataflowConflict(Client cntxt, MalBlkPtr mb,InstrPtr p)
{
if (p->token == ENDsymbol ||
- (getFunctionId(p) == multiplexRef &&
- getModuleId(p) == malRef &&
- MANIFOLDtypecheck(cntxt,mb,p) == NULL) ||
+ (isMultiplex(p) && MANIFOLDtypecheck(cntxt,mb,p) == NULL) ||
blockCntrl(p) || blockStart(p) || blockExit(p))
return TRUE;
switch(p->token){
diff --git a/monetdb5/optimizer/opt_inline.c b/monetdb5/optimizer/opt_inline.c
--- a/monetdb5/optimizer/opt_inline.c
+++ b/monetdb5/optimizer/opt_inline.c
@@ -56,9 +56,7 @@ OPTinlineImplementation(Client cntxt, Ma
* Time for inlining functions that are used in
multiplex operations.
* They are produced by SQL compiler.
*/
- if( getFunctionId(q)== multiplexRef &&
- getModuleId(q) == malRef &&
- OPTinlineMultiplex(cntxt,mb,q)){
+ if(isMultiplex(q) && OPTinlineMultiplex(cntxt,mb,q)){
OPTDEBUGinline {
mnstr_printf(cntxt->fdout,"#multiplex
inline function\n");
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
@@ -47,14 +47,13 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
int i = 2, iter = 0;
int hvar, tvar;
str mod, fcn;
- int *alias;
+ int *alias, *resB;
InstrPtr q;
int ht, tt;
- int *resB;
+ int bat = (getModuleId(pci) == batmalRef) ;
(void) cntxt;
(void) stk;
-
for (i = 0; i < pci->retc; i++) {
ht = getHeadType(getArgType(mb, pci, i));
if (ht != TYPE_oid)
@@ -101,7 +100,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
*/
alias= (int*) GDKmalloc(sizeof(int) * pci->maxarg);
- resB = (int*)GDKmalloc(sizeof(int)*pci->retc);
+ resB = (int*) GDKmalloc(sizeof(int) * pci->retc);
if (alias == NULL || resB == NULL) {
GDKfree(alias);
GDKfree(resB);
@@ -131,7 +130,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
(void) pushArgument(mb,q,iter);
/* $1:= algebra.fetch(Ai,h) or constant */
- for (i = pci->retc+2; i < pci->argc; i++)
+ for (i = pci->retc+2; i < pci->argc; i++) {
if (getArg(pci, i) != iter && isaBatType(getArgType(mb, pci,
i))) {
q = newFcnCall(mb, algebraRef, "fetch");
alias[i] = newTmpVariable(mb,
getColumnType(getArgType(mb, pci, i)));
@@ -139,13 +138,24 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
q= pushArgument(mb, q, getArg(pci, i));
(void) pushArgument(mb, q, hvar);
}
+ }
/* cr:= mod.CMD($1,...,$n); */
q = newFcnCall(mb, mod, fcn);
- q->retc = pci->retc;
- q->argc = pci->retc;
- for (i = 0; i < pci->retc; i++)
- getArg(q, i) = newTmpVariable(mb, TYPE_any);
+ for (i = 0; i < pci->retc; i++) {
+ int nvar = 0;
+ if (bat) {
+ ht = getHeadType(getArgType(mb, pci, i));
+ tt = getColumnType(getArgType(mb, pci, i));
+ nvar = newTmpVariable(mb, newBatType(ht, tt));
+ } else {
+ nvar = newTmpVariable(mb, TYPE_any);
+ }
+ if (i)
+ q = pushReturn(mb, q, nvar);
+ else
+ getArg(q, 0) = nvar;
+ }
for (i = pci->retc+2; i < pci->argc; i++) {
if (getArg(pci, i) == iter) {
@@ -181,6 +191,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
(void) pushArgument(mb, q, resB[i]);
}
GDKfree(alias);
+ GDKfree(resB);
return MAL_SUCCEED;
}
@@ -198,7 +209,7 @@ OPTmultiplexSimple(Client cntxt)
if(mb)
for( i=0; i<mb->stop; i++){
p= getInstrPtr(mb,i);
- if(getModuleId(p) == malRef && getFunctionId(p) == multiplexRef)
+ if(isMultiplex(p))
doit++;
}
if( doit) {
@@ -229,9 +240,7 @@ OPTmultiplexImplementation(Client cntxt,
for (i = 0; i < limit; i++) {
p = old[i];
- if (msg == MAL_SUCCEED && getModuleId(p) == malRef &&
- getFunctionId(p) == multiplexRef) {
-
+ if (msg == MAL_SUCCEED && isMultiplex(p)) {
if ( MANIFOLDtypecheck(cntxt,mb,p) != NULL){
setFunctionId(p, manifoldRef);
pushInstruction(mb, p);
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -140,6 +140,7 @@ str listRef;
str lockRef;
str lookupRef;
str malRef;
+str batmalRef;
str mapiRef;
str markRef;
str mark_grpRef;
@@ -392,6 +393,7 @@ void optimizerInit(void)
lockRef = putName("lock",4);
lookupRef = putName("lookup",6);
malRef = putName("mal", 3);
+ batmalRef = putName("batmal", 6);
mapiRef = putName("mapi", 4);
markRef = putName("mark", 4);
mark_grpRef = putName("mark_grp", 8);
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -138,6 +138,7 @@ opt_export str not_ilikeRef;
opt_export str lockRef;
opt_export str lookupRef;
opt_export str malRef;
+opt_export str batmalRef;
opt_export str mapiRef;
opt_export str markRef;
opt_export str mark_grpRef;
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
@@ -314,8 +314,7 @@ OPTremapSwitched(Client cntxt, MalBlkPtr
(void) stk;
(void) scope;
- if( getModuleId(pci)!= malRef &&
- getFunctionId(pci) != multiplexRef &&
+ if( !isMultiplex(pci) &&
!isVarConstant(mb,getArg(pci,1)) &&
!isVarConstant(mb,getArg(pci,2)) &&
!isVarConstant(mb,getArg(pci,4)) &&
@@ -359,8 +358,7 @@ OPTremapImplementation(Client cntxt, Mal
for (i = 0; i < limit; i++) {
p = old[i];
- if ( getModuleId(p) == malRef &&
- getFunctionId(p) == multiplexRef) {
+ if (isMultiplex(p) && getModuleId(p) != batmalRef /* for now
only simple mal.multiplex */){
/*
* The next step considered is to handle inlined
functions.
* It means we have already skipped the most obvious
ones,
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
@@ -911,6 +911,12 @@ int isSubJoin(InstrPtr p)
return (l >= 7 && strcmp(func+l-7,"subjoin") == 0);
}
+int isMultiplex(InstrPtr p)
+{
+ return ((getModuleId(p) == malRef || getModuleId(p) == batmalRef) &&
+ getFunctionId(p) == multiplexRef);
+}
+
int isFragmentGroup(InstrPtr p){
return
(getModuleId(p)== algebraRef && (
diff --git a/monetdb5/optimizer/opt_support.h b/monetdb5/optimizer/opt_support.h
--- a/monetdb5/optimizer/opt_support.h
+++ b/monetdb5/optimizer/opt_support.h
@@ -121,6 +121,7 @@ opt_export int isOrderby(InstrPtr q);
opt_export int isDiffOp(InstrPtr q);
opt_export int isSubSelect(InstrPtr q);
opt_export int isSubJoin(InstrPtr q);
+opt_export int isMultiplex(InstrPtr q);
opt_export int allTargetsVisible(MalBlkPtr mb, Lifespan span, int pc,int qc);
opt_export int isOptimizerEnabled(MalBlkPtr mb, str opt);
opt_export str OPTsetDebugStr(void *ret, str *nme);
diff --git a/sql/backends/monet5/Tests/All b/sql/backends/monet5/Tests/All
--- a/sql/backends/monet5/Tests/All
+++ b/sql/backends/monet5/Tests/All
@@ -8,10 +8,10 @@ HAVE_LIBR?rapi04
HAVE_LIBR?rapi05
HAVE_LIBR?rapi06
HAVE_LIBR?rapi07
-# this one will require significant work in the SQL layer, so disabled for now
-HAVE_LIBR?rapi08
+#HAVE_LIBR?rapi08
HAVE_LIBR?rapi09
HAVE_LIBR?rapi10
+HAVE_LIBR?rapi12
# should this work?
#inlineUDF
diff --git a/sql/backends/monet5/Tests/rapi08.sql
b/sql/backends/monet5/Tests/rapi08.sql
--- a/sql/backends/monet5/Tests/rapi08.sql
+++ b/sql/backends/monet5/Tests/rapi08.sql
@@ -11,12 +11,9 @@ CREATE FUNCTION pagerank(arg1 integer, a
SELECT * FROM pagerank(1,2);
--- this is the naive version that would be nicest
+SELECT * FROM pagerank( (SELECT * FROM edges AS e) );
--SELECT * FROM pagerank(edges);
--- of course, a subselect might also be useful
-SELECT * FROM pagerank( (SELECT * FROM edges AS e) );
-
-- output should be
-- node rank
-- 1 0.2127660
@@ -27,8 +24,3 @@ DROP FUNCTION pagerank;
DROP TABLE edges;
ROLLBACK;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list