Changeset: c86f5fee96e3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c86f5fee96e3 Modified Files: monetdb5/optimizer/opt_mergetable.c Branch: Jun2016 Log Message:
allow for multiple outputs in bat*. functions 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); @@ -1860,8 +1871,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