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

📄 equalfuncs.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
📖 第 1 页 / 共 2 页
字号:
		return false;	if (!equal(a->inner, b->inner))		return false;	return true;}static bool_equalMergeOrder(MergeOrder *a, MergeOrder *b){	if (a == (MergeOrder *) NULL && b == (MergeOrder *) NULL)		return true;	Assert(IsA(a, MergeOrder));	Assert(IsA(b, MergeOrder));	if (a->join_operator != b->join_operator)		return false;	if (a->left_operator != b->left_operator)		return false;	if (a->right_operator != b->right_operator)		return false;	if (a->left_type != b->left_type)		return false;	if (a->right_type != b->right_type)		return false;	return true;}static bool_equalHashInfo(HashInfo *a, HashInfo *b){	Assert(IsA(a, HashInfo));	Assert(IsA(b, HashInfo));	if (a->hashop != b->hashop)		return false;	return true;}/* XXX	This equality function is a quick hack, should be *		fixed to compare all fields. */static bool_equalIndexScan(IndexScan *a, IndexScan *b){	Assert(IsA(a, IndexScan));	Assert(IsA(b, IndexScan));	/*	 * if(a->scan.plan.cost != b->scan.plan.cost) return(false);	 */	if (!equal(a->indxqual, b->indxqual))		return false;	if (a->scan.scanrelid != b->scan.scanrelid)		return false;	if (!equali(a->indxid, b->indxid))		return false;	return true;}static bool_equalSubPlan(SubPlan *a, SubPlan *b){	if (a->plan_id != b->plan_id)		return false;	if (!equal(a->sublink->oper, b->sublink->oper))		return false;	return true;}static bool_equalJoinInfo(JoinInfo *a, JoinInfo *b){	Assert(IsA(a, JoinInfo));	Assert(IsA(b, JoinInfo));	if (!equal(a->unjoined_relids, b->unjoined_relids))		return false;	if (!equal(a->jinfo_restrictinfo, b->jinfo_restrictinfo))		return false;	if (a->mergejoinable != b->mergejoinable)		return false;	if (a->hashjoinable != b->hashjoinable)		return false;	return true;}/* *	Stuff from execnodes.h *//* *	EState is a subclass of Node. */static bool_equalEState(EState *a, EState *b){	if (a->es_direction != b->es_direction)		return false;	if (!equal(a->es_range_table, b->es_range_table))		return false;	if (a->es_result_relation_info != b->es_result_relation_info)		return false;	return true;}/* * Stuff from parsenodes.h */static bool_equalQuery(Query *a, Query *b){	if (a->commandType != b->commandType)		return false;	if (!equal(a->utilityStmt, b->utilityStmt))		return false;	if (a->resultRelation != b->resultRelation)		return false;	if (a->into && b->into)	{		if (strcmp(a->into, b->into) != 0)			return false;	}	else	{		if (a->into != b->into)			return false;	}	if (a->isPortal != b->isPortal)		return false;	if (a->isBinary != b->isBinary)		return false;	if (a->isTemp != b->isTemp)		return false;	if (a->unionall != b->unionall)		return false;	if (a->hasAggs != b->hasAggs)		return false;	if (a->hasSubLinks != b->hasSubLinks)		return false;	if (a->uniqueFlag && b->uniqueFlag)	{		if (strcmp(a->uniqueFlag, b->uniqueFlag) != 0)			return false;	}	else	{		if (a->uniqueFlag != b->uniqueFlag)			return false;	}	if (!equal(a->sortClause, b->sortClause))		return false;	if (!equal(a->rtable, b->rtable))		return false;	if (!equal(a->targetList, b->targetList))		return false;	if (!equal(a->qual, b->qual))		return false;	if (!equal(a->rowMark, b->rowMark))		return false;	if (!equal(a->groupClause, b->groupClause))		return false;	if (!equal(a->havingQual, b->havingQual))		return false;	if (!equal(a->intersectClause, b->intersectClause))		return false;	if (!equal(a->unionClause, b->unionClause))		return false;	if (!equal(a->limitOffset, b->limitOffset))		return false;	if (!equal(a->limitCount, b->limitCount))		return false;	/*	 * We do not check the internal-to-the-planner fields base_rel_list	 * and join_rel_list.  They might not be set yet, and in any case they	 * should be derivable from the other fields.	 */	return true;}static bool_equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b){	if (a->relname && b->relname)	{		if (strcmp(a->relname, b->relname) != 0)			return false;	}	else	{		if (a->relname != b->relname)			return false;	}	if (a->refname && b->refname)	{		if (strcmp(a->refname, b->refname) != 0)			return false;	}	else	{		if (a->refname != b->refname)			return false;	}	if (a->relid != b->relid)		return false;	if (a->inh != b->inh)		return false;	if (a->inFromCl != b->inFromCl)		return false;	if (a->skipAcl != b->skipAcl)		return false;	return true;}static bool_equalTargetEntry(TargetEntry *a, TargetEntry *b){	if (!equal(a->resdom, b->resdom))		return false;	if (!equal(a->fjoin, b->fjoin))		return false;	if (!equal(a->expr, b->expr))		return false;	return true;}static bool_equalCaseExpr(CaseExpr *a, CaseExpr *b){	if (a->casetype != b->casetype)		return false;	if (!equal(a->arg, b->arg))		return false;	if (!equal(a->args, b->args))		return false;	if (!equal(a->defresult, b->defresult))		return false;	return true;}static bool_equalCaseWhen(CaseWhen *a, CaseWhen *b){	if (!equal(a->expr, b->expr))		return false;	if (!equal(a->result, b->result))		return false;	return true;}/* * Stuff from pg_list.h */static bool_equalValue(Value *a, Value *b){	if (a->type != b->type)		return false;	switch (a->type)	{		case T_String:			return strcmp(a->val.str, b->val.str);		case T_Integer:			return a->val.ival == b->val.ival;		case T_Float:			return a->val.dval == b->val.dval;		default:			break;	}	return true;}/* * equal *	  returns whether two nodes are equal */boolequal(void *a, void *b){	bool		retval = false;	if (a == b)		return true;	/*	 * note that a!=b, so only one of them can be NULL	 */	if (a == NULL || b == NULL)		return false;	/*	 * are they the same type of nodes?	 */	if (nodeTag(a) != nodeTag(b))		return false;	switch (nodeTag(a))	{		case T_Resdom:			retval = _equalResdom(a, b);			break;		case T_Fjoin:			retval = _equalFjoin(a, b);			break;		case T_Expr:			retval = _equalExpr(a, b);			break;		case T_Iter:			retval = _equalIter(a, b);			break;		case T_Stream:			retval = _equalStream(a, b);			break;		case T_Var:			retval = _equalVar(a, b);			break;		case T_Array:			retval = _equalArray(a, b);			break;		case T_ArrayRef:			retval = _equalArrayRef(a, b);			break;		case T_Oper:			retval = _equalOper(a, b);			break;		case T_Const:			retval = _equalConst(a, b);			break;		case T_Param:			retval = _equalParam(a, b);			break;		case T_Aggref:			retval = _equalAggref(a, b);			break;		case T_Func:			retval = _equalFunc(a, b);			break;		case T_RestrictInfo:			retval = _equalRestrictInfo(a, b);			break;		case T_RelOptInfo:			retval = _equalRelOptInfo(a, b);			break;		case T_JoinMethod:			retval = _equalJoinMethod(a, b);			break;		case T_Path:			retval = _equalPath(a, b);			break;		case T_IndexPath:			retval = _equalIndexPath(a, b);			break;		case T_NestPath:			retval = _equalNestPath(a, b);			break;		case T_MergePath:			retval = _equalMergePath(a, b);			break;		case T_HashPath:			retval = _equalHashPath(a, b);			break;		case T_JoinKey:			retval = _equalJoinKey(a, b);			break;		case T_MergeOrder:			retval = _equalMergeOrder(a, b);			break;		case T_HashInfo:			retval = _equalHashInfo(a, b);			break;		case T_IndexScan:			retval = _equalIndexScan(a, b);			break;		case T_SubPlan:			retval = _equalSubPlan(a, b);			break;		case T_JoinInfo:			retval = _equalJoinInfo(a, b);			break;		case T_EState:			retval = _equalEState(a, b);			break;		case T_Integer:		case T_String:		case T_Float:			retval = _equalValue(a, b);			break;		case T_List:			{				List	   *la = (List *) a;				List	   *lb = (List *) b;				List	   *l;				if (a == NULL && b == NULL)					return true;				if (length(a) != length(b))					return false;				foreach(l, la)				{					if (!equal(lfirst(l), lfirst(lb)))						return false;					lb = lnext(lb);				}				retval = true;			}			break;		case T_Query:			retval = _equalQuery(a, b);			break;		case T_RangeTblEntry:			retval = _equalRangeTblEntry(a, b);			break;		case T_TargetEntry:			retval = _equalTargetEntry(a, b);			break;		case T_CaseExpr:			retval = _equalCaseExpr(a, b);			break;		case T_CaseWhen:			retval = _equalCaseWhen(a, b);			break;		default:			elog(NOTICE, "equal: don't know whether nodes of type %d are equal",				 nodeTag(a));			break;	}	return retval;}/* * equali *	  compares two lists of integers * * XXX temp hack. needs something like T_IntList */static boolequali(List *a, List *b){	List	   *la = (List *) a;	List	   *lb = (List *) b;	List	   *l;	if (a == NULL && b == NULL)		return true;	if (length(a) != length(b))		return false;	foreach(l, la)	{		if (lfirsti(l) != lfirsti(lb))			return false;		lb = lnext(lb);	}	return true;}

⌨️ 快捷键说明

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