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

Reply via email to