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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list