Changeset: ee3b12e8326a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ee3b12e8326a
Modified Files:
monetdb5/optimizer/opt_remap.c
Branch: pushcands
Log Message:
for like/notlike push nil:bat's to the end when trying to convert to a
batalgebra.like/notlike
This shows the general idea of rewriting scalar cases into bulk cases with
(only) candidate api's.
diffs (49 lines):
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -224,15 +224,23 @@ OPTmultiplexInline(Client cntxt, MalBlkP
q= getInstrPtr(mq,i);
if( q->token== ENDsymbol)
break;
+ int add_nils = 0;
for(j=0; j<q->argc; j++)
if ( upgrade[getArg(q,j)]){
if ( blockStart(q) ||
q->barrier== REDOsymbol ||
q->barrier==LEAVEsymbol )
goto terminateMX;
if (getModuleId(q)){
-
snprintf(buf,1024,"bat%s",getModuleId(q));
- setModuleId(q,putName(buf));
- q->typechk = TYPE_UNKNOWN;
+ if (strncmp(getModuleId(q), "bat", 3)
!= 0) {
+
snprintf(buf,1024,"bat%s",getModuleId(q));
+ setModuleId(q,putName(buf));
+ q->typechk = TYPE_UNKNOWN;
+ }
+ if (getModuleId(q) == batalgebraRef &&
(getFunctionId(q) == likeRef || getFunctionId(q) == not_likeRef)) {
+ if (j >= q->retc)
+ add_nils++;
+ continue;
+ }
if (q->retc == 1 &&
((getModuleId(q) == batcalcRef
&&
(getFunctionId(q) == mulRef ||
getFunctionId(q) == divRef || getFunctionId(q) == plusRef || getFunctionId(q)
== minusRef || getFunctionId(q) == modRef)) || getModuleId(q) == batmtimeRef ||
getModuleId(q) == batstrRef)) {
@@ -288,9 +296,17 @@ OPTmultiplexInline(Client cntxt, MalBlkP
break;
}
}
+ if (add_nils) {
+ for(j=0; j<add_nils; j++)
+ q = pushNil(mq, q, TYPE_bat);
+ /* now see if we can resolve the instruction */
+ typeChecker(cntxt->usermodule,mq,q,i,TRUE);
+ if( q->typechk== TYPE_UNKNOWN)
+ goto terminateMX;
+ actions++;
+ }
}
-
if(mq->errors){
terminateMX:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list