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

📄 opt_pushranges.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
字号:
#line 85 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"#include "mal_config.h"#include "opt_pushranges.h"#include "mal_interpreter.h"	/* for showErrors() */typedef struct RANGE{	int used;		/* how often it has been used */	int lcst, hcst; /* constant variables holding the range bounds */	int  srcvar;	/* BAT variable on which the range depends */	int lastupdate, lastrange;}RangeRec, *Range;#ifdef DEBUG_OPT_RANGEPUSHstatic void printRange(MalBlkPtr mb, Range rng, int idx){	(void) rng;	stream_printf(GDKout,"[%3d] %5s used=%d\tlcst=%s\t ", 		idx, getVarName(mb,idx), rng[idx].used,		(rng[idx].lcst? getVarName(mb,rng[idx].lcst):""));	stream_printf(GDKout,"hcst=%s\tsource %s ", 		(rng[idx].hcst? getVarName(mb,rng[idx].hcst):""), 		(rng[idx].srcvar?getVarName(mb,rng[idx].srcvar):""));	stream_printf(GDKout,"\tlu=%d\tr=%d", rng[idx].lastupdate, rng[idx].lastrange);	stream_printf(GDKout,"\n");}#endifstatic intOPTpushrangesImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	int i,j, limit,actions=0;	InstrPtr p, *old;	int x,y,z,typ;	Range range= (Range) alloca(mb->vtop * sizeof(RangeRec));	memset((char*) range, 0, mb->vtop * sizeof(RangeRec));	if( mb->errors) 		return 0;#ifdef DEBUG_OPT_RANGEPUSH	printf("Range select optimizer started\n");#endif	(void) stk;	(void) pci;		limit = mb->stop;	old = mb->stmt;#line 134 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"	for (i = 0; i < limit; i++) {		p = old[i];		if( p->barrier) 			break; /* end of optimizer */		for(j=p->retc; j< p->argc; j++)			range[getArg(p,j)].used++;		for(j=0; j<p->retc; j++){			range[getArg(p,j)].lastupdate= i;			if( range[getArg(p,j)].lastrange == 0)				range[getArg(p,j)].lastrange= i;		}		if( getModuleId(p)== algebraRef && 			( getFunctionId(p)== selectRef || getFunctionId(p)== uselectRef) ){#line 155 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"			x= getArg(p,1);			y= getArg(p,2);			if( range[x].lcst && isConstant(mb,y) ){				/* merge lowerbound */				if( ATOMcmp( getVarType(mb,y), 						VALptr( &getVarConstant(mb,range[x].lcst)), 						VALptr( &getVarConstant(mb,y)) ) > 0){					getArg(p,2)= range[x].lcst;					z= range[x].srcvar;					if( getArg(p,1) == x && 						range[z].lastupdate == range[z].lastrange){						getArg(p,1) = z;						actions++;					}				}				y= getArg(p,3);				/* merge higherbound */				if( ATOMcmp( getVarType(mb,y), 						VALptr( &getVarConstant(mb,range[x].hcst)), 						VALptr( &getVarConstant(mb,y)) ) < 0 ||					ATOMcmp( getVarType(mb,y),						VALptr( &getVarConstant(mb,y)),						 ATOMnilptr(getVarType(mb,y)) ) == 0){					getArg(p,3)= range[x].hcst;					z= range[x].srcvar;					if( getArg(p,1) == x && range[z].lastupdate == range[z].lastrange){						getArg(p,1) = z;						actions++;					}				}			}#line 190 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"			x= getArg(p,0);			if( isConstant(mb, getArg(p,2)) ){				range[x].lcst = getArg(p,2);				range[x].srcvar= getArg(p,1);				range[x].lastupdate= range[x].lastrange = i;			}			if( isConstant(mb, getArg(p,3)) ){				range[x].hcst = getArg(p,3);				range[x].srcvar= getArg(p,1);				range[x].lastupdate= range[x].lastrange = i;			}#line 205 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"			x= getArg(p,2);			y= getArg(p,3);			if( isConstant(mb, x)  &&				isConstant(mb, y)  ){				z =ATOMcmp( getVarType(mb,y),                        VALptr( &getVarConstant(mb,x)),                        VALptr( &getVarConstant(mb,y)));				x=  p->argc > 4;				x= x && isConstant(mb,getArg(p,4));				x= x && isConstant(mb,getArg(p,5));				x= x && getVarConstant(mb,getArg(p,4)).val.cval[0];				x= x && getVarConstant(mb,getArg(p,5)).val.cval[0];				if( z > 0 || (z==0 && p->argc>4 && !x)) {					int zero= 0;					if( mb->var[getArg(p,0)]->props== NULL)						mb->var[getArg(p,0)]->props= newPropertySet();					setProperty(mb->var[getArg(p,0)]->props,							"rows","=",TYPE_int,&zero);					/* create an empty replacement */					x= getArgType(mb, p, 1);					p->argc=1;					getModuleId(p)= batRef;					getFunctionId(p)= newRef;					pushArgument(mb,p, typ=newTypeVariable(mb, getHeadType(x)));					isConstant(mb,typ)= TRUE;					pushArgument(mb,p, typ=newTypeVariable(mb, getTailType(x)));					isConstant(mb,typ)= TRUE;					actions++;				}			}		}	}#ifdef DEBUG_OPT_RANGEPUSH		for(j=0; j< mb->vtop; j++)		if( range[j].used )			printRange(mb,range,j);#endif#line 247 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"	return actions;}#line 253 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"#line 251 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTpushranges(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 pushranges\n");	printFunction(GDKout,mb,LIST_MAL_ALL);#endif	if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_		stream_printf(GDKout,"locate function pushranges\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.pushranges",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.pushranges",buf);		}#ifdef _DEBUG_OPTIMIZER_		stream_printf(GDKout,"pushranges %s %d\n",modnme,fcnnme);#endif		mb = s->def;		stk= 0;	} 	if( mb->errors )		return MAL_SUCCEED;	addtoMalBlkHistory(mb);	actions= OPTpushrangesImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_	stream_printf(GDKout,"finished pushranges %d\n",actions);	printFunction(GDKout,mb,LIST_MAL_ALL);#endif    optimizerCheck(mb, "optimizer.pushranges", actions, GDKusec() - clk,OPT_CHECK_ALL);	return MAL_SUCCEED;}#line 253 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"#line 255 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"

⌨️ 快捷键说明

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