⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opt_mergetable.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
字号:
#line 127 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"#include "mal_config.h"#include "opt_mergetable.h"static intisMATalias(int idx, int mvar[], int top){	int i;	for(i =0; i<top; i++)		if( mvar[i]== idx) return i;	return -1;}#line 140 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"InstrPtr MATpackAll(MalBlkPtr mb, InstrPtr  r, int m, InstrPtr *mat, int *mvar, int mtop){	int l,k;	for(l=mat[m]->retc; l< mat[m]->argc; l++){		k= isMATalias( getArg(mat[m],l),mvar,mtop);		if( k< 0)			r= pushArgument(mb,r, getArg(mat[m],l));		else			r= MATpackAll(mb,r, k, mat,mvar,mtop);	}	return r;}void MATcollect(int m, InstrPtr *mat, int *mvar, int mtop, int *newvar, int *n){	int i,j,k;	for(i= mat[m]->retc; i<mat[m]->argc; i++)		if( (j= isMATalias( getArg(mat[m],i), mvar, mtop)) >= 0){			for(k=0; k<mtop; k++)			if( mvar[k]== j)				MATcollect(k,mat,mvar,mtop,newvar,n);		} else { newvar[*n]=  getArg(mat[m],i); *n = *n+1;}}intOPTmergetableImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	InstrPtr *old=0, q,r, mat[256];	int oldtop,i,j,k,m,mtop=0, mvar[256],tpe;	int size,match,actions=0;#ifdef DEBUG_OPT_MERGETABLE	stream_printf(GDKout,"Start MAT optimizer\n");	printFunction(GDKout, mb, 0);#endif	old = mb->stmt;	oldtop= mb->stop;	size = (mb->stop *1.2 < mb->ssize)? mb->ssize: mb->stop *1.2;	mb->stmt = (InstrPtr *) GDKzalloc(size  * sizeof(InstrPtr));	mb->ssize = size ;	mb->stop = 0;	for( i=0; i<oldtop; i++){		p= old[i];		if( (getModuleId(p)== matRef && getFunctionId(p)==newRef) ||			(getModuleId(p)== matRef && getFunctionId(p)==packRef) ){			mat[mtop]= p;			mvar[mtop] = getArg(p,0);			mtop++;			pushInstruction(mb,p);			continue;		}#line 193 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if( (getModuleId(p)== matRef && getFunctionId(p)==expandRef) &&			isConstant(mb,getArg(p,1)) && 			getVarType(mb,getArg(p,1))== TYPE_str){			openBox("pbm");			k= PBMfindPBAT(getVarConstant(mb,getArg(p,1)).val.sval);			if( k< 0){				pushInstruction(mb,p);				continue;			}			pushInstruction(mb,p);			p= copyInstruction(p);			p->argc--;			for(; k>=0; k= partitions[k].next){				r = newInstruction(mb, ASSIGNsymbol);				setModuleId(r,bbpRef);				setFunctionId(r,bindRef);				j= newTmpVariable(mb, partitions[k].type );				getArg(r,0)= j;				pushStr(mb,r,BBPname(partitions[k].bid));				pushInstruction(mb,r);				pushArgument(mb,p,j);			}			getFunctionId(p)=newRef;			pushInstruction(mb,p);			mat[mtop]= p;			mvar[mtop] = getArg(p,0);			mtop++;			actions++;			continue;		}#line 227 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		match=0;		for(j=p->retc; j<p->argc; j++)		if(  isMATalias(getArg(p,j),mvar,mtop) >= 0) {			m=i; match++;		}		if( match== 0 ){			pushInstruction(mb,p);			continue;		}#line 240 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if( match>1 ){			for( k= p->retc; k<p->argc && match>1; k++, match--)			if(	(m=isMATalias(getArg(p,k),mvar,mtop)) >= 0){#ifdef DEBUG_OPT_MERGETABLE				stream_printf(GDKout,"Dependency resolution k=%d\n",k);				printInstruction(GDKout,mb,p,0);#endif				r = newInstruction(mb, ASSIGNsymbol);				setModuleId(r,matRef);				setFunctionId(r,packRef);				getArg(r,0)= getArg(mat[m],0);				r= MATpackAll(mb, r, m, mat, mvar, mtop);				pushInstruction(mb,r);				getArg(p,k)= getArg(r,0);				for(j=m; j<mtop-1; j++){					mat[j]= mat[j+1];					mvar[j]= mvar[j+1];				}				mtop--; 			}			if( match== 0)				pushInstruction(mb,p);		}#line 274 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if(( (getModuleId(p)== algebraRef && getFunctionId(p)== selectRef) ||			(getModuleId(p)== algebraRef && getFunctionId(p)==uselectRef) ||			(getModuleId(p)== algebraRef && getFunctionId(p)==likeselectRef) ||			(getModuleId(p)== batRef && getFunctionId(p)==reverseRef) ||			(getModuleId(p)== batRef && getFunctionId(p)==mirrorRef) ||			(getModuleId(p)== algebraRef && getFunctionId(p)==markTRef) ||			(getModuleId(p)== algebraRef && getFunctionId(p)==kdifferenceRef) ||			(getModuleId(p)== algebraRef && getFunctionId(p)== joinRef) ||			(getModuleId(p)== algebraRef && getFunctionId(p)== semijoinRef) ||			(getModuleId(p)== batRef && getFunctionId(p)== setAccessRef) ||			(getModuleId(p)== batRef && getFunctionId(p)== appendRef)  ||			(getModuleId(p)== batRef && getFunctionId(p)== deleteRef)  ||			getModuleId(p)== calcRef 		)  && (m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){			r = newInstruction(mb, ASSIGNsymbol);			setModuleId(r,matRef);			setFunctionId(r,newRef);			getArg(r,0)= getArg(p,0);			tpe= getArgType(mb,p,0);			for(k=1; k< mat[m]->argc; k++){				if( k<mat[m]->argc-1 &&  (					getFunctionId(p)== insertRef ||					getFunctionId(p)== appendRef ))					continue;				q= copyInstruction(p);				getArg(q,1) = getArg(mat[m],k);				getArg(q,0) = newTmpVariable(mb, tpe);				pushInstruction(mb,q);				r= pushArgument(mb,r,getArg(q,0));			}			if( getFunctionId(p)== insertRef ||				getFunctionId(p)== appendRef ||				getFunctionId(p)== deleteRef )					match=1;			else {				match =0;				for(j=0;j<mtop; j++)					if( mvar[j]== getArg(p,0)) match++;				if( match == 0){					mvar[mtop] = getArg(p,0);					mat[mtop++]= r;					pushInstruction(mb,r);				}			}			if( match)				freeInstruction(r);			actions++;			continue;		} #line 328 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if(getModuleId(p)== batRef && getFunctionId(p)== insertRef &&		(m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){			getArg(p,1) = getArg(mat[m],mat[m]->argc-1);			pushInstruction(mb,p);			continue;		} #line 337 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if( getModuleId(p)==algebraRef && getFunctionId(p)== joinRef &&			(m=isMATalias(getArg(p,2),mvar,mtop)) >= 0){			r = newInstruction(mb, ASSIGNsymbol);			setModuleId(r,matRef);			setFunctionId(r,newRef);			getArg(r,0)= getArg(p,0);			tpe= getArgType(mb,p,0);			for(k=1; k< mat[m]->argc; k++){				q= copyInstruction(p);				getArg(q,2) = getArg(mat[m],k);				getArg(q,0) = newTmpVariable(mb, tpe);				pushInstruction(mb,q);				r= pushArgument(mb,r,getArg(q,0));			}			match =0;			for(j=0;j<mtop; j++)			if( mvar[j]== getArg(p,0)) match++;			if( match == 0){				mvar[mtop] = getArg(p,0);				mat[mtop++]= r;				pushInstruction(mb,r);			}			actions++;			continue;		} #line 366 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if( ((getModuleId(p)==aggrRef && getFunctionId(p)== countRef) || 			(getModuleId(p)==aggrRef && getFunctionId(p)==sumRef && p->argc==2)) &&			(m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){			r = newInstruction(mb,ASSIGNsymbol);			getArg(r,0)= getArg(p,0);			pushInt(mb,r,0);			pushInstruction(mb,r);			for(k=1; k< mat[m]->argc; k++){				int v= newTmpVariable(mb,TYPE_int);				q= newInstruction(mb,ASSIGNsymbol);				setModuleId(q,aggrRef);				setFunctionId(q,getFunctionId(p));				getArg(q,0)= v;				q= pushArgument(mb,q,getArg(mat[m],k));				pushInstruction(mb,q);				q= newInstruction(mb,ASSIGNsymbol);				setModuleId(q,calcRef);				setFunctionId(q,plusRef);				getArg(q,0)= getArg(r,0);				q= pushArgument(mb,q,getArg(r,0));				q= pushArgument(mb,q,v);				pushInstruction(mb,q);			}			continue;		} #line 395 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		if( ((getModuleId(p)==aggrRef && getFunctionId(p)== maxRef) || 			(getModuleId(p)==aggrRef && getFunctionId(p)==minRef )) &&			p->argc==3 &&			(m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){			r = newInstruction(mb,ASSIGNsymbol);			getArg(r,0)= getArg(p,0);			pushNil(mb,r,getArgType(mb,p,0));			pushInstruction(mb,r);			for(k=1; k< mat[m]->argc; k++){				int v= newTmpVariable(mb,TYPE_int);				q= newInstruction(mb,ASSIGNsymbol);				setModuleId(q,aggrRef);				setFunctionId(q,getFunctionId(p));				getArg(q,0)= v;				q= pushArgument(mb,q,getArg(mat[m],k));				pushInstruction(mb,q);				q= newInstruction(mb,ASSIGNsymbol);				setModuleId(q,calcRef);				setFunctionId(q,plusRef);				getArg(q,0)= getArg(r,0);				q= pushArgument(mb,q,getArg(r,0));				q= pushArgument(mb,q,v);				pushInstruction(mb,q);			}			continue;		} #line 427 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"		for( k= p->retc; k<p->argc; k++)		if(	(m=isMATalias(getArg(p,k),mvar,mtop)) >= 0){#ifdef DEBUG_OPT_MERGETABLE			stream_printf(GDKout,"Dependency resolution k=%d\n",k);			printInstruction(GDKout,mb,p,0);#endif			r = newInstruction(mb, ASSIGNsymbol);			setModuleId(r,matRef);			setFunctionId(r,packRef);			getArg(r,0)= getArg(mat[m],0);			r= MATpackAll(mb, r, m, mat, mvar, mtop);			if(	!( getModuleId(p) == matRef && getFunctionId(p)== newRef) )				pushInstruction(mb,r);			else freeInstruction(r);			for(j=m; j<mtop-1; j++){				mat[j]= mat[j+1];				mvar[j]= mvar[j+1];			}			mtop--; 			actions++;			break;		}		pushInstruction(mb,p);	}	GDKfree(old);#line 459 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"	(void) stk; #ifdef DEBUG_OPT_MERGETABLE	stream_printf(GDKout,"Result of multi table optimizer\n");	printFunction(GDKout, mb, 0);#endif	return actions;}#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"#line 469 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTmergetable(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 mergetable\n");	printFunction(GDKout,mb,LIST_MAL_ALL);#endif	if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_		stream_printf(GDKout,"locate function mergetable\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.mergetable",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.mergetable",buf);		}#ifdef _DEBUG_OPTIMIZER_		stream_printf(GDKout,"mergetable %s %d\n",modnme,fcnnme);#endif		mb = s->def;		stk= 0;	} 	if( mb->errors )		return MAL_SUCCEED;	addtoMalBlkHistory(mb);	actions= OPTmergetableImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_	stream_printf(GDKout,"finished mergetable %d\n",actions);	printFunction(GDKout,mb,LIST_MAL_ALL);#endif    optimizerCheck(mb, "optimizer.mergetable", actions, GDKusec() - clk,OPT_CHECK_ALL);	return MAL_SUCCEED;}#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"#line 473 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -