📄 opt_partitionedquery.c
字号:
#line 84 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"#include "mal_config.h"#include "opt_partitionedQuery.h"#include "mal_interpreter.h" /* for showErrors() */extern int OPTvalidFlowNetwork(MalBlkPtr mb, int *first, int *last, int varid);#line 98 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"static strOPTreplacement(MalBlkPtr mb, int *first, int *last, int varid){ InstrPtr *old, p; int i, limit, actions = 0; int idx = -1, bid = -1; int pcf, pcl; lng clk= GDKusec(); setLifespan(mb); old = mb->stmt; limit = mb->stop; newMalBlkStmt(mb, limit + 10);#ifdef DEBUG_OPT_PARTITIONED stream_printf(GDKout, "variable replacement '%s'", getVarName(mb, varid)); stream_printf(GDKout, " instructions %d-%d ", *first, *last); stream_printf(GDKout, " lifespan %d-%d\n", mb->var[varid]->beginLifespan, mb->var[varid]->endLifespan);#endif /* copy prelude into place */ for (i = 0; i < *first; i++) pushInstruction(mb, old[i]); actions++; /* barrier (idx,bid):= partitions.newIterator(var); */ p = newInstruction(mb,ASSIGNsymbol); setModuleId(p, putName("partitions", 10)); setFunctionId(p, putName("newIterator", 11)); p->barrier = BARRIERsymbol; idx = newTmpVariable(mb, TYPE_int); pushReturn(mb, p, idx); bid = newTmpVariable(mb, getVarType(mb, varid)); pushReturn(mb, p, bid); pushArgument(mb, p, varid); pushInstruction(mb, p); pcf = mb->stop; for (i = *first; i <= *last; i++) pushInstruction(mb, old[i]); pcl = mb->stop;#line 143 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx" /* finalize the loop */ /* redo (idx,bid):= partitions.hasMoreElements(var); */ p = newInstruction(mb,REDOsymbol); setModuleId(p, putName("partitions", 10)); setFunctionId(p, putName("hasMoreElements", 15)); pushReturn(mb, p, idx); pushReturn(mb, p, bid); pushArgument(mb, p, varid); pushInstruction(mb, p); /* exit (idx,bid) */ p = newInstruction(mb,EXITsymbol); pushReturn(mb, p, idx); pushReturn(mb, p, bid); pushInstruction(mb, p); *first = mb->stop; /* copy the rest of the program back into place */ for (; i < limit; i++) pushInstruction(mb, old[i]); GDKfree(old); *last = mb->stop - 1; /* now replace variable with the alias bid */ if (bid != -1) replaceAlias(mb, pcf, pcl, varid, bid); /* and have to check the baked program */ optimizerCheck(mb,"partitionedQuery",1,GDKusec()-clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 179 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"static strOPTneedsExpansion(MalBlkPtr mb, int varid){ int tpe; int first, last; str msg = 0; tpe = getVarType(mb, varid); if (isaBatType(tpe) && getHeadType(tpe) == TYPE_oid) { first = 1; last = mb->stop - 2; printf("start first=%d last=%d \n", first, last); for (; first < mb->stop && last < mb->stop;) { if (OPTvalidFlowNetwork(mb, &first, &last, varid)) { printf("replace first=%d last=%d \n", first, last); msg = OPTreplacement(mb, &first, &last, varid); if (msg) return msg; } else { first = last; last = mb->stop - 1; } printf("first=%d last=%d \n", first, last); } } return MAL_SUCCEED;}#line 211 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"static intOPTpartitionedQueryImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ int i; InstrPtr p; (void) stk; (void) pci; p = getInstrPtr(mb, 0); for (i = p->retc; i < p->argc; i++) { OPTneedsExpansion(mb, p->argv[i]); } return 0; /* optimizer administration alread handled */}#line 228 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"#line 241 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"intOPTvalidFlowNetwork(MalBlkPtr mb, int *first, int *last, int varid){ int i, k = 0, iocount = 0; InstrPtr p; for (i = *first; i <= *last; i++) { p = getInstrPtr(mb, i); for (k = 0; k < p->retc; k++) if (getArg(p, k) == varid) { *first = i + 1; return 0; } for (k = p->retc; k < p->argc; k++) if (getArg(p, k) == varid) break; if (k < p->argc) break; if (i == *last) { *last = mb->stop; return 0; } } *first = i; for (; i <= *last; i++) { p = getInstrPtr(mb, i); if (getFunctionId(p) && strncmp(getFunctionId(p), "print", 5) == 0) iocount++; else if (p->barrier) iocount++; else if (p->token == ENDsymbol) iocount++; if (iocount > 1) { *last = i - 1; return TRUE; } } return iocount > 0;}#line 285 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"#line 283 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTpartitionedQuery(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme; str fcnnme; Module scope=NULL; Symbol s= NULL; lng clk= GDKusec(); int actions = 0; optimizerInit(); if( p ) removeInstruction(mb, p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"apply partitionedQuery\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function partitionedQuery\n");#endif if( getArgType(mb,p,1) != TYPE_str || getArgType(mb,p,2) != TYPE_str || !isConstant(mb,getArg(p,1)) || !isConstant(mb,getArg(p,2)) ) { char buf[1024]; snprintf(buf,1024, "Optimizer requires constant string arguments\n"); throw(MAL, "optimizer.partitionedQuery",buf); } if( stk != 0){ modnme= (str)getArgValue(stk,p,1); fcnnme= (str)getArgValue(stk,p,2); } else { modnme= getArgDefault(mb,p,1); fcnnme= getArgDefault(mb,p,2); } scope = findModule(MCgetClient()->nspace,putName(modnme,strlen(modnme)) ); if( scope) s= findSymbolInModule(scope,putName(fcnnme,strlen(fcnnme))); if( s == NULL) { char buf[1024]; snprintf(buf,1024, "Could not find %s.%s\n",modnme,fcnnme); throw(MAL, "optimizer.partitionedQuery",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"partitionedQuery %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTpartitionedQueryImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished partitionedQuery %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.partitionedQuery", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 285 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"#line 287 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_partitionedQuery.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -