📄 equalfuncs.c
字号:
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 + -