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

📄 opt_multiplex.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
字号:
#line 87 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"#include "mal_config.h"#include "opt_multiplex.h"#include "mal_interpreter.h"#line 112 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"static strOPTexpandMultiplex(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	int i = 2, k, mloop, resB, iter = 0, cr;	int hvar, tvar;	str mod, fcn;	str msg = MAL_SUCCEED;	int alias[MAXARG];	InstrPtr q;	int ht, tt;	(void) stk;	mod = VALget(&getVar(mb, getArg(pci, 1))->value);	mod = putName(mod,strlen(mod));	fcn = VALget(&getVar(mb, getArg(pci, 2))->value);	fcn = putName(fcn,strlen(fcn));	/* search the iterator bat */	iter = getArg(pci, 3);	for (i = 3; i < pci->argc; i++)		if (isaBatType(getArgType(mb, pci, i))) {			iter = getArg(pci, i);			break;		}#ifdef DEBUG_OPT_MULTIPLEX	printf("calling the optimize multiplex script routine\n");	printFunction(GDKout,mb,LIST_MAL_ALL);	printf("multiplex against operator %d %s\n",iter, getTypeName(getVarType(mb,iter)));	printInstruction(GDKout,mb,pci,LIST_MAL_ALL);#endif#line 148 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"	/* resB := new(refBat) */	q = newFcnCall(mb, batRef, newRef);	resB = getArg(q, 0);	if (isAnyExpression(getArgType(mb, pci, 0)))		msg = createException(MAL, "optimizer.multiplex", "Target type is missing");	ht = getHeadType(getArgType(mb, pci, 0));	tt = getTailType(getArgType(mb, pci, 0));	setVarType(mb, getArg(q, 0), newBatType(ht, tt));	q = pushNil(mb, q, ht);	freezeVarType(mb,getArg(q,q->argc-1));	q = pushNil(mb, q, tt);	freezeVarType(mb,getArg(q,q->argc-1));	/* barrier (mloop,h,r) := newIterator(refBat); */	q = newFcnCall(mb, batRef, "newIterator");	q->barrier = BARRIERsymbol;	getArg(q, 0) = mloop = newTmpVariable(mb, TYPE_lng);	hvar = newTmpVariable(mb, TYPE_any);	pushReturn(mb, q, hvar);	tvar = newTmpVariable(mb, TYPE_any);	pushReturn(mb, q, tvar);	pushArgument(mb, q, iter);	/* $1:= bat.find(Ai,h) or constant */	alias[i] = tvar;	for (i++; i < pci->argc; i++)		if (isaBatType(getArgType(mb, pci, i))) {			q = newFcnCall(mb, algebraRef, "find");			alias[i] = newTmpVariable(mb, getTailType(getArgType(mb, pci, i)));			getArg(q, 0) = alias[i];			pushArgument(mb, q, getArg(pci, i));			pushArgument(mb, q, hvar);		}	/* cr:= mod.CMD($1,...,$n); */	q = newFcnCall(mb, mod, fcn);	cr = getArg(q, 0) = newTmpVariable(mb, TYPE_any);	for (i = 3; i < pci->argc; i++)		if (isaBatType(getArgType(mb, pci, i))) {			pushArgument(mb, q, alias[i]);		} else {			q = pushArgument(mb, q, getArg(pci, i));		}	/* insert(resB,h,cr);  	   not append(resB, cr); the head type (oid) may dynamically change */		q = newFcnCall(mb, batRef, insertRef);	pushArgument(mb, q, resB);	pushArgument(mb, q, hvar);	pushArgument(mb, q, cr);/* redo (mloop,h,r):= hasMoreElements(refBat); */	q = newFcnCall(mb, batRef, "hasMoreElements");	q->barrier = REDOsymbol;	getArg(q, 0) = mloop;	pushReturn(mb, q, hvar);	pushReturn(mb, q, tvar);	pushArgument(mb, q, iter);/* catch   MALException and ignore them  and replace value with nil*/	q = newInstruction(mb,CATCHsymbol);	k = newVariable(mb, GDKstrdup(exceptionToString(MAL)), TYPE_str);	getVar(mb,k)->isudftype = 1;	pushReturn(mb, q, k);	pushInstruction(mb, q);/* redo (mloop,h,r):= hasMoreElements(refBat); *//* ignore the error and continue */	q = newFcnCall(mb, batRef, "hasMoreElements");	q->barrier = REDOsymbol;	getArg(q, 0) = mloop;	pushReturn(mb, q, hvar);	pushReturn(mb, q, tvar);	pushArgument(mb, q, iter);/* finalized the catch block */	q= newInstruction(mb,EXITsymbol);	pushReturn(mb,q,k);	pushInstruction(mb,q);	q = newAssignment(mb);	q->barrier = EXITsymbol;	getArg(q, 0) = mloop;	pushReturn(mb, q, hvar);	pushReturn(mb, q, tvar);	q = newAssignment(mb);	getArg(q, 0) = getArg(pci, 0);	pushArgument(mb, q, resB);	return msg;}#line 248 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"strOPTmultiplex(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	InstrPtr *old, p;	int i,j, limit,doit= 0, init=0;	lng clk=GDKusec();	(void) stk;	(void) pci;	old = mb->stmt;	limit = mb->stop;	for (i = 0; i < limit; i++) {		p = old[i];		if (getModuleId(p) == optimizerRef && getFunctionId(p) == multiplexRef) {			if(init==0){				newMalBlkStmt(mb, mb->stop);				for(j= 0; j<i; j++)					pushInstruction(mb,old[j]);				init++;			}			OPTexpandMultiplex(mb, stk, p);			/* freeInstruction(p);*/			doit++;		} else		if( init )			pushInstruction(mb, p);	}	if( init){		GDKfree(old);		optimizerCheck(mb, "optimizer.multiplex", doit, GDKusec() - clk,OPT_CHECK_ALL);	}	return MAL_SUCCEED;}#line 284 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_multiplex.mx"

⌨️ 快捷键说明

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