Changeset: 1456420e197b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1456420e197b Modified Files: monetdb5/optimizer/opt_mergetable.c Branch: Oct2020 Log Message:
generalized handling Map like operations in the mergetable optimizer, solves issues with 3 (with cands) 6 argument functions diffs (247 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 @@ -473,70 +473,25 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat } static int -mat_apply2(matlist_t *ml, MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n, int mvar, int nvar) +mat_apply(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int nrmats) { - int k, l, is_select = isSelect(p); - InstrPtr *r = NULL; - r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc); - if(!r) - return -1; - for(k=0; k < p->retc; k++) { - if((r[k] = newInstruction(mb, matRef, packRef)) == NULL) { - for(l=0; l < k; l++) - freeInstruction(r[l]); - GDKfree(r); - return -1; - } - getArg(r[k],0) = getArg(p,k); - } + int matvar[8], fargument[8], k, l, parts = 0; + + assert(nrmats <= 8); - for(k=1; k < mat[m].mi->argc; k++) { - int tpe; - InstrPtr q = copyInstruction(p); - if(!q) { - GDKfree(r); - return -1; - } - - 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); - for(l=0; l < p->retc; l++) { - int res = 0; - if (is_select) - res = propagatePartnr(ml, getArg(q,p->retc+1), getArg(q,l), k); - else - res = propagatePartnr(ml, -1, getArg(q,l), k); - if(res) { - for(l=0; l < k; l++) - freeInstruction(r[l]); - GDKfree(r); + for(k=p->retc, l=0; k < p->argc; k++) { + int mv = is_a_mat(getArg(p,k), ml); + if (mv >=0) { + matvar[l] = mv; + fargument[l] = k; + l++; + if (parts==0) + parts = ml->v[mv].mi->argc; + if (parts != ml->v[mv].mi->argc) return -1; - } - r[l] = addArgument(mb, r[l], getArg(q, l)); } } - for(k=0; k < p->retc; k++) { - if(mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, m), -1, -1, 0)) { - for(l=0; l < k; l++) - freeInstruction(r[l]); - GDKfree(r); - return -1; - } - } - GDKfree(r); - return 0; -} - -static int -mat_apply3(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o, int mvar, int nvar, int ovar) -{ - int k, l; InstrPtr *r = NULL; r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc); if(!r) @@ -551,7 +506,7 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat getArg(r[k],0) = getArg(p,k); } - for(k = 1; k < ml->v[m].mi->argc; k++) { + for(k = 1; k < ml->v[matvar[0]].mi->argc; k++) { int tpe; InstrPtr q = copyInstruction(p); if(!q) { @@ -563,9 +518,8 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat tpe = getArgType(mb,p,l); getArg(q, l) = newTmpVariable(mb, tpe); } - getArg(q, mvar) = getArg(ml->v[m].mi, k); - getArg(q, nvar) = getArg(ml->v[n].mi, k); - getArg(q, ovar) = getArg(ml->v[o].mi, k); + for (l = 0; l<nrmats; l++) + getArg(q, fargument[l]) = getArg(ml->v[matvar[l]].mi, k); pushInstruction(mb, q); for(l=0; l < p->retc; l++) { if(setPartnr(ml, -1, getArg(q,l), k)) { @@ -578,7 +532,7 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat } } for(k=0; k < p->retc; k++) { - if(mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, m), -1, -1, 1)) { + if(mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, matvar[0]), -1, -1, 1)) { for(l=0; l < k; l++) freeInstruction(r[l]); GDKfree(r); @@ -590,63 +544,6 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat return 0; } -static int -mat_apply4(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o, int e, int mvar, int nvar, int ovar, int evar) -{ - int k, l; - InstrPtr *r = NULL; - r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc); - if(!r) - return -1; - for(k=0; k < p->retc; k++) { - if((r[k] = newInstruction(mb, matRef, packRef)) == NULL) { - for(l=0; l < k; l++) - freeInstruction(r[l]); - GDKfree(r); - return -1; - } - getArg(r[k],0) = getArg(p,k); - } - - for(k = 1; k < ml->v[m].mi->argc; k++) { - int tpe; - InstrPtr q = copyInstruction(p); - if(!q) { - GDKfree(r); - return -1; - } - - for(l=0; l < p->retc; l++) { - tpe = getArgType(mb,p,l); - getArg(q, l) = newTmpVariable(mb, tpe); - } - getArg(q, mvar) = getArg(ml->v[m].mi, k); - getArg(q, nvar) = getArg(ml->v[n].mi, k); - getArg(q, ovar) = getArg(ml->v[o].mi, k); - getArg(q, evar) = getArg(ml->v[e].mi, k); - pushInstruction(mb, q); - for(l=0; l < p->retc; l++) { - if(setPartnr(ml, -1, getArg(q,l), k)) { - for(l=0; l < k; l++) - freeInstruction(r[l]); - GDKfree(r); - return -1; - } - r[l] = addArgument(mb, r[l], getArg(q, l)); - } - } - for(k=0; k < p->retc; k++) { - if(mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, m), -1, -1, 1)) { - for(l=0; l < k; l++) - freeInstruction(r[l]); - GDKfree(r); - return -1; - } - pushInstruction(mb, r[k]); - } - GDKfree(r); - return 0; -} static int mat_setop(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o) @@ -2089,8 +1986,7 @@ OPTmergetableImplementation(Client cntxt mb->stop = 0; for( i=0; i<oldtop; i++){ - int bats = 0; - int nilbats = 0; + int bats = 0, nilbats = 0; InstrPtr r, cp; p = old[i]; @@ -2414,53 +2310,8 @@ OPTmergetableImplementation(Client cntxt continue; } - if (match == 4 && bats == 4 && isMap2Op(p) && p->retc == 1 && - (m=is_a_mat(getArg(p,fm), &ml)) >= 0 && - (n=is_a_mat(getArg(p,fn), &ml)) >= 0 && - (o=is_a_mat(getArg(p,fo), &ml)) >= 0 && - (e=is_a_mat(getArg(p,fe), &ml)) >= 0){ - assert(ml.v[m].mi->argc == ml.v[n].mi->argc); - if(mat_apply4(mb, p, &ml, m, n, o, e, fm, fn, fo, fe)) { - msg = createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL); - goto cleanup; - } - actions++; - continue; - } - - if (match == 3 && bats == 3 && (isFragmentGroup(p) || isFragmentGroup2(p) || isMapOp(p)) && p->retc != 2 && - (m=is_a_mat(getArg(p,fm), &ml)) >= 0 && - (n=is_a_mat(getArg(p,fn), &ml)) >= 0 && - (o=is_a_mat(getArg(p,fo), &ml)) >= 0){ - assert(ml.v[m].mi->argc == ml.v[n].mi->argc); - if(mat_apply3(mb, p, &ml, m, n, o, fm, fn, fo)) { - msg = createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL); - goto cleanup; - } - actions++; - continue; - } - if (match == 2 && bats == 2 && (isFragmentGroup(p) || isFragmentGroup2(p) || isMapOp(p)) && p->retc != 2 && - (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(mat_apply2(&ml, mb, p, ml.v, m, n, fm, fn)) { - msg = createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL); - goto cleanup; - } - actions++; - continue; - } - - if (match == 1 && bats == 1 && (isFragmentGroup(p) || isMapOp(p) || - (!getModuleId(p) && !getFunctionId(p) && p->barrier == 0 /* simple assignment */)) && p->retc != 2 && - (m=is_a_mat(getArg(p,fm), &ml)) >= 0){ - if ((r = mat_apply1(mb, p, &ml, m, fm)) != NULL) { - if(mat_add(&ml, r, mat_type(ml.v, m), getFunctionId(p))) { - msg = createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL); - goto cleanup; - } - } else { + if (match == bats && p->retc == 1 && (isMap2Op(p) || isMapOp(p) || isFragmentGroup(p) || isFragmentGroup2(p))) { + if(mat_apply(mb, p, &ml, match)) { msg = createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL); goto cleanup; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list