Changeset: 65e0001e12b5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=65e0001e12b5
Modified Files:
        monetdb5/optimizer/opt_mergetable.c
Branch: default
Log Message:

merged with jun2016


diffs (94 lines):

diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -335,6 +335,8 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat
        InstrPtr r = NULL, q;
        mat_t *mat = ml->v;
 
+       assert (p->retc == 1);
+
        /* Find the mat we overwrite */
        if (is_assign) {
                n = is_a_mat(getArg(p, 0), ml);
@@ -389,34 +391,45 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat
        return r;
 }
 
-static InstrPtr
+static void
 mat_apply2(matlist_t *ml, MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n, 
int mvar, int nvar)
 {
-       int tpe, k, is_select = isSubSelect(p);
-       InstrPtr r = NULL;
+       int k, is_select = isSubSelect(p);
+       InstrPtr *r = NULL;
 
-       //printf("# %s.%s(%d,%d)", getModuleId(p), getFunctionId(p), m, n);
-
-       r = newInstruction(mb, ASSIGNsymbol);
-       setModuleId(r,matRef);
-       setFunctionId(r,packRef);
-       getArg(r, 0) = getArg(p,0);
-       tpe = getArgType(mb,p,0);
+       r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc);
+       for(k=0; k < p->retc; k++) {
+               r[k] = newInstruction(mb, ASSIGNsymbol);
+               setModuleId(r[k],matRef);
+               setFunctionId(r[k],packRef);
+               getArg(r[k],0) = getArg(p,k);
+       }
 
        for(k=1; k < mat[m].mi->argc; k++) {
+               int l, tpe;
                InstrPtr q = copyInstruction(p);
 
-               getArg(q, 0) = newTmpVariable(mb, tpe);
+               for(l=0; l < p->retc; l++) {
+                       tpe = getArgType(mb,p,l);
+                       getArg(q, l) = newTmpVariable(mb, tpe);
+               }
                getArg(q, mvar) = getArg(mat[m].mi, k);
                getArg(q, nvar) = getArg(mat[n].mi, k);
                pushInstruction(mb, q);
-               if (is_select)
-                       setPartnr(ml, getArg(q,2), getArg(q,0), k);
-               else
-                       setPartnr(ml, -1, getArg(q,0), k);
-               r = pushArgument(mb, r, getArg(q, 0));
+               for(l=0; l < p->retc; l++) {
+                       if (is_select)
+                               setPartnr(ml, getArg(q,p->retc+1), getArg(q,l), 
k);
+                       else
+                               setPartnr(ml, -1, getArg(q,l), k);
+                       r[l] = pushArgument(mb, r[l], getArg(q, l));
+               }
        }
-       return r;
+
+       for(k=0; k < p->retc; k++) {
+               mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, 
m),  -1, -1, 1);
+               pushInstruction(mb, r[k]);
+       }
+       GDKfree(r);
 }
 
 static void
@@ -433,8 +446,6 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat
                getArg(r[k],0) = getArg(p,k);
        }
 
-       //printf("# %s.%s(%d,%d,%d)", getModuleId(p), getFunctionId(p), m, n, 
o);
-
        for(k = 1; k < ml->v[m].mi->argc; k++) {
                int l, tpe;
                InstrPtr q = copyInstruction(p);
@@ -1868,8 +1879,7 @@ OPTmergetableImplementation(Client cntxt
                   (m=is_a_mat(getArg(p,fm), &ml)) >= 0 &&
                   (n=is_a_mat(getArg(p,fn), &ml)) >= 0){
                        assert(ml.v[m].mi->argc == ml.v[n].mi->argc); 
-                       if ((r = mat_apply2(&ml, mb, p, ml.v, m, n, fm, fn)) != 
NULL)
-                               mat_add(&ml, r, mat_type(ml.v, m), 
getFunctionId(p));
+                       mat_apply2(&ml, mb, p, ml.v, m, n, fm, fn);
                        actions++;
                        continue;
                }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to