Changeset: e629e708114e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e629e708114e
Modified Files:
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
monetdb5/optimizer/opt_support.c
monetdb5/optimizer/opt_support.h
Branch: batcalc-updated
Log Message:
changed mergetable to handle calc ops with more arguments
diffs (153 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
@@ -582,6 +582,64 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat
}
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 tpe = getArgType(mb,p, 0), k, j;
@@ -2224,6 +2282,19 @@ 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 &&
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
@@ -39,6 +39,7 @@ str alter_typeRef;
str alter_userRef;
str alter_viewRef;
str andRef;
+str orRef;
str antijoinRef;
str appendidxRef;
str appendRef;
@@ -339,6 +340,7 @@ void optimizerInit(void)
alter_userRef = putName("alter_user");
alter_viewRef = putName("alter_view");
andRef = putName("and");
+ orRef = putName("or");
antijoinRef = putName("antijoin");
appendidxRef = putName("append_idxbat");
appendRef = putName("append");
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
@@ -35,6 +35,7 @@ mal_export str alter_typeRef;
mal_export str alter_userRef;
mal_export str alter_viewRef;
mal_export str andRef;
+mal_export str orRef;
mal_export str antijoinRef;
mal_export str appendidxRef;
mal_export str appendRef;
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
@@ -505,6 +505,20 @@ inline int isMapOp(InstrPtr p){
getModuleId(p) != batcapiRef;
}
+inline int isMap2Op(InstrPtr p){
+ if (isUnsafeFunction(p) || isSealedFunction(p))
+ return 0;
+ return getModuleId(p) &&
+ ((getModuleId(p) == malRef && getFunctionId(p) == multiplexRef)
||
+ (getModuleId(p) == malRef && getFunctionId(p) == manifoldRef)
||
+ (getModuleId(p) == batcalcRef) ||
+ (getModuleId(p) != batcalcRef && getModuleId(p) != batRef &&
strncmp(getModuleId(p), "bat", 3) == 0) ||
+ (getModuleId(p) == mkeyRef)) && !isOrderDepenent(p) &&
+ getModuleId(p) != batrapiRef &&
+ getModuleId(p) != batpyapi3Ref &&
+ getModuleId(p) != batcapiRef;
+}
+
inline int isLikeOp(InstrPtr p){
return (getModuleId(p) == batalgebraRef &&
(getFunctionId(p) == likeRef ||
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
@@ -41,6 +41,7 @@ mal_export int isDelta(InstrPtr q);
mal_export int isMatJoinOp(InstrPtr q);
mal_export int isMatLeftJoinOp(InstrPtr q);
mal_export int isMapOp(InstrPtr q);
+mal_export int isMap2Op(InstrPtr q);
mal_export int isLikeOp(InstrPtr q);
mal_export int isTopn(InstrPtr q);
mal_export int isSlice(InstrPtr q);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list