diff options
Diffstat (limited to 'src/backend/nodes/equalfuncs.c')
-rw-r--r-- | src/backend/nodes/equalfuncs.c | 1149 |
1 files changed, 583 insertions, 566 deletions
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 4a8a072d33f..792c8783f99 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1,13 +1,13 @@ /*------------------------------------------------------------------------- * * equalfuncs.c-- - * equal functions to compare the nodes + * equal functions to compare the nodes * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.6 1997/08/19 21:31:36 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.7 1997/09/07 04:42:44 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -26,700 +26,717 @@ #include "utils/elog.h" #include "storage/itemptr.h" -static bool equali(List *a, List *b); +static bool equali(List * a, List * b); /* - * Stuff from primnodes.h + * Stuff from primnodes.h */ /* - * Resdom is a subclass of Node. + * Resdom is a subclass of Node. */ -static bool -_equalResdom(Resdom *a, Resdom *b) +static bool +_equalResdom(Resdom * a, Resdom * b) { - if (a->resno != b->resno) - return (false); - if (a->restype != b->restype) - return (false); - if (a->reslen != b->reslen) - return (false); - if (strcmp(a->resname, b->resname) != 0) - return (false); - if (a->reskey != b->reskey) - return (false); - if (a->reskeyop != b->reskeyop) - return (false); - - return (true); + if (a->resno != b->resno) + return (false); + if (a->restype != b->restype) + return (false); + if (a->reslen != b->reslen) + return (false); + if (strcmp(a->resname, b->resname) != 0) + return (false); + if (a->reskey != b->reskey) + return (false); + if (a->reskeyop != b->reskeyop) + return (false); + + return (true); } -static bool -_equalFjoin(Fjoin *a, Fjoin *b) +static bool +_equalFjoin(Fjoin * a, Fjoin * b) { - int nNodes; - - if (a->fj_initialized != b->fj_initialized) - return (false); - if (a->fj_nNodes != b->fj_nNodes) - return (false); - if (!equal(a->fj_innerNode, b->fj_innerNode)) - return (false); - - nNodes = a->fj_nNodes; - if (memcmp(a->fj_results, b->fj_results, nNodes*sizeof(Datum)) != 0) - return (false); - if (memcmp(a->fj_alwaysDone, b->fj_alwaysDone, nNodes*sizeof(bool)) != 0) - return (false); - - return(true); + int nNodes; + + if (a->fj_initialized != b->fj_initialized) + return (false); + if (a->fj_nNodes != b->fj_nNodes) + return (false); + if (!equal(a->fj_innerNode, b->fj_innerNode)) + return (false); + + nNodes = a->fj_nNodes; + if (memcmp(a->fj_results, b->fj_results, nNodes * sizeof(Datum)) != 0) + return (false); + if (memcmp(a->fj_alwaysDone, b->fj_alwaysDone, nNodes * sizeof(bool)) != 0) + return (false); + + return (true); } /* - * Expr is a subclass of Node. + * Expr is a subclass of Node. */ -static bool -_equalExpr(Expr *a, Expr *b) +static bool +_equalExpr(Expr * a, Expr * b) { - if (a->opType != b->opType) - return (false); - if (!equal(a->oper, b->oper)) - return (false); - if (!equal(a->args, b->args)) - return (false); - - return (true); + if (a->opType != b->opType) + return (false); + if (!equal(a->oper, b->oper)) + return (false); + if (!equal(a->args, b->args)) + return (false); + + return (true); } -static bool -_equalIter(Iter *a, Iter *b) +static bool +_equalIter(Iter * a, Iter * b) { - return (equal(a->iterexpr, b->iterexpr)); + return (equal(a->iterexpr, b->iterexpr)); } -static bool -_equalStream(Stream *a, Stream *b) +static bool +_equalStream(Stream * a, Stream * b) { - if (a->clausetype != b->clausetype) - return(false); - if (a->groupup != b->groupup) - return(false); - if (a->groupcost != b->groupcost) - return(false); - if (a->groupsel != b->groupsel) - return(false); - if (!equal(a->pathptr, b->pathptr)) - return(false); - if (!equal(a->cinfo, b->cinfo)) - return(false); - if (!equal(a->upstream, b->upstream)) - return(false); - return(equal(a->downstream, b->downstream)); + if (a->clausetype != b->clausetype) + return (false); + if (a->groupup != b->groupup) + return (false); + if (a->groupcost != b->groupcost) + return (false); + if (a->groupsel != b->groupsel) + return (false); + if (!equal(a->pathptr, b->pathptr)) + return (false); + if (!equal(a->cinfo, b->cinfo)) + return (false); + if (!equal(a->upstream, b->upstream)) + return (false); + return (equal(a->downstream, b->downstream)); } /* - * Var is a subclass of Expr. + * Var is a subclass of Expr. */ -static bool -_equalVar(Var *a, Var *b) +static bool +_equalVar(Var * a, Var * b) { - if (a->varno != b->varno) - return (false); - if (a->varattno != b->varattno) - return (false); - if (a->vartype != b->vartype) - return (false); - if (a->varnoold != b->varnoold) - return (false); - if (a->varoattno != b->varoattno) - return (false); - - return (true); + if (a->varno != b->varno) + return (false); + if (a->varattno != b->varattno) + return (false); + if (a->vartype != b->vartype) + return (false); + if (a->varnoold != b->varnoold) + return (false); + if (a->varoattno != b->varoattno) + return (false); + + return (true); } -static bool -_equalArray(Array *a, Array *b) +static bool +_equalArray(Array * a, Array * b) { - if (a->arrayelemtype != b->arrayelemtype) - return (false); - if (a->arrayndim != b->arrayndim) - return (false); - if (a->arraylow.indx[0] != b->arraylow.indx[0]) - return (false); - if (a->arrayhigh.indx[0] != b->arrayhigh.indx[0]) - return (false); - if (a->arraylen != b->arraylen) - return (false); - return(TRUE); + if (a->arrayelemtype != b->arrayelemtype) + return (false); + if (a->arrayndim != b->arrayndim) + return (false); + if (a->arraylow.indx[0] != b->arraylow.indx[0]) + return (false); + if (a->arrayhigh.indx[0] != b->arrayhigh.indx[0]) + return (false); + if (a->arraylen != b->arraylen) + return (false); + return (TRUE); } -static bool -_equalArrayRef(ArrayRef *a, ArrayRef *b) +static bool +_equalArrayRef(ArrayRef * a, ArrayRef * b) { - if (a->refelemtype != b->refelemtype) - return (false); - if (a->refattrlength != b->refattrlength) - return (false); - if (a->refelemlength != b->refelemlength) - return (false); - if (a->refelembyval != b->refelembyval) - return (false); - if (!equal(a->refupperindexpr, b->refupperindexpr)) - return (false); - if (!equal(a->reflowerindexpr, b->reflowerindexpr)) - return (false); - if (!equal(a->refexpr, b->refexpr)) - return (false); - return (equal(a->refassgnexpr, b->refassgnexpr)); + if (a->refelemtype != b->refelemtype) + return (false); + if (a->refattrlength != b->refattrlength) + return (false); + if (a->refelemlength != b->refelemlength) + return (false); + if (a->refelembyval != b->refelembyval) + return (false); + if (!equal(a->refupperindexpr, b->refupperindexpr)) + return (false); + if (!equal(a->reflowerindexpr, b->reflowerindexpr)) + return (false); + if (!equal(a->refexpr, b->refexpr)) + return (false); + return (equal(a->refassgnexpr, b->refassgnexpr)); } /* - * Oper is a subclass of Expr. + * Oper is a subclass of Expr. */ -static bool -_equalOper(Oper *a, Oper *b) +static bool +_equalOper(Oper * a, Oper * b) { - if (a->opno != b->opno) - return (false); - if (a->opresulttype != b->opresulttype) - return (false); - - return (true); + if (a->opno != b->opno) + return (false); + if (a->opresulttype != b->opresulttype) + return (false); + + return (true); } /* - * Const is a subclass of Expr. + * Const is a subclass of Expr. */ -static bool -_equalConst(Const *a, Const *b) +static bool +_equalConst(Const * a, Const * b) { - /* - ** this function used to do a pointer compare on a and b. That's - ** ridiculous. -- JMH, 7/11/92 - */ - if (a->consttype != b->consttype) - return(false); - if (a->constlen != b->constlen) - return(false); - if (a->constisnull != b->constisnull) - return(false); - if (a->constbyval != b->constbyval) - return(false); - return(datumIsEqual(a->constvalue, b->constvalue, - a->consttype, a->constbyval, a->constlen)); + + /* + * * this function used to do a pointer compare on a and b. That's * + * ridiculous. -- JMH, 7/11/92 + */ + if (a->consttype != b->consttype) + return (false); + if (a->constlen != b->constlen) + return (false); + if (a->constisnull != b->constisnull) + return (false); + if (a->constbyval != b->constbyval) + return (false); + return (datumIsEqual(a->constvalue, b->constvalue, + a->consttype, a->constbyval, a->constlen)); } /* - * Param is a subclass of Expr. + * Param is a subclass of Expr. */ -static bool -_equalParam(Param *a, Param *b) +static bool +_equalParam(Param * a, Param * b) { - if (a->paramkind != b->paramkind) - return (false); - if (a->paramtype != b->paramtype) - return (false); - if (!equal(a->param_tlist, b->param_tlist)) - return (false); - - switch (a->paramkind) { - case PARAM_NAMED: - case PARAM_NEW: - case PARAM_OLD: - if (strcmp(a->paramname, b->paramname) != 0) - return (false); - break; - case PARAM_NUM: - if (a->paramid != b->paramid) - return (false); - break; - case PARAM_INVALID: - /* - * XXX: Hmmm... What are we supposed to return - * in this case ?? - */ - return(true); - break; - default: - elog(WARN, "_equalParam: Invalid paramkind value: %d", - a->paramkind); - } - - return (true); + if (a->paramkind != b->paramkind) + return (false); + if (a->paramtype != b->paramtype) + return (false); + if (!equal(a->param_tlist, b->param_tlist)) + return (false); + + switch (a->paramkind) + { + case PARAM_NAMED: + case PARAM_NEW: + case PARAM_OLD: + if (strcmp(a->paramname, b->paramname) != 0) + return (false); + break; + case PARAM_NUM: + if (a->paramid != b->paramid) + return (false); + break; + case PARAM_INVALID: + + /* + * XXX: Hmmm... What are we supposed to return in this case ?? + */ + return (true); + break; + default: + elog(WARN, "_equalParam: Invalid paramkind value: %d", + a->paramkind); + } + + return (true); } /* - * Func is a subclass of Expr. + * Func is a subclass of Expr. */ -static bool -_equalFunc(Func *a, Func *b) +static bool +_equalFunc(Func * a, Func * b) { - if (a->funcid != b->funcid) - return (false); - if (a->functype != b->functype) - return (false); - if (a->funcisindex != b->funcisindex) - return (false); - if (a->funcsize != b->funcsize) - return (false); - if (!equal(a->func_tlist, b->func_tlist)) - return (false); - if (!equal(a->func_planlist, b->func_planlist)) - return (false); - - return (true); + if (a->funcid != b->funcid) + return (false); + if (a->functype != b->functype) + return (false); + if (a->funcisindex != b->funcisindex) + return (false); + if (a->funcsize != b->funcsize) + return (false); + if (!equal(a->func_tlist, b->func_tlist)) + return (false); + if (!equal(a->func_planlist, b->func_planlist)) + return (false); + + return (true); } /* * CInfo is a subclass of Node. */ -static bool -_equalCInfo(CInfo *a, CInfo *b) +static bool +_equalCInfo(CInfo * a, CInfo * b) { - Assert(IsA(a,CInfo)); - Assert(IsA(b,CInfo)); - - if (!equal(a->clause, b->clause)) - return(false); - if (a->selectivity != b->selectivity) - return(false); - if (a->notclause != b->notclause) - return(false); + Assert(IsA(a, CInfo)); + Assert(IsA(b, CInfo)); + + if (!equal(a->clause, b->clause)) + return (false); + if (a->selectivity != b->selectivity) + return (false); + if (a->notclause != b->notclause) + return (false); #ifdef EqualMergeOrderExists - if (!EqualMergeOrder(a->mergesortorder,b->mergesortorder)) - return(false); + if (!EqualMergeOrder(a->mergesortorder, b->mergesortorder)) + return (false); #endif - if(a->hashjoinoperator != b->hashjoinoperator) - return(false); - return(equal((a->indexids), - (b->indexids))); + if (a->hashjoinoperator != b->hashjoinoperator) + return (false); + return (equal((a->indexids), + (b->indexids))); } -static bool -_equalJoinMethod(JoinMethod *a, JoinMethod *b) +static bool +_equalJoinMethod(JoinMethod * a, JoinMethod * b) { - Assert(IsA(a,JoinMethod)); - Assert(IsA(b,JoinMethod)); - - if (!equal((a->jmkeys), - (b->jmkeys))) - return(false); - if (!equal((a->clauses), - (b->clauses))) - return(false); - return(true); + Assert(IsA(a, JoinMethod)); + Assert(IsA(b, JoinMethod)); + + if (!equal((a->jmkeys), + (b->jmkeys))) + return (false); + if (!equal((a->clauses), + (b->clauses))) + return (false); + return (true); } -static bool -_equalPath(Path *a, Path *b) +static bool +_equalPath(Path * a, Path * b) { - if (a->pathtype != b->pathtype) - return(false); - if (a->parent != b->parent) - return(false); - /* - if (a->path_cost != b->path_cost) - return(false); - */ - if (a->p_ordering.ordtype == SORTOP_ORDER) { - int i = 0; - if (a->p_ordering.ord.sortop==NULL || - b->p_ordering.ord.sortop==NULL) { - - if (a->p_ordering.ord.sortop != b->p_ordering.ord.sortop) - return false; - } else { - while(a->p_ordering.ord.sortop[i]!=0 && - b->p_ordering.ord.sortop[i]!=0) { - if (a->p_ordering.ord.sortop[i] != b->p_ordering.ord.sortop[i]) - return false; - i++; - } - if (a->p_ordering.ord.sortop[i]!=0 || - b->p_ordering.ord.sortop[i]!=0) - return false; + if (a->pathtype != b->pathtype) + return (false); + if (a->parent != b->parent) + return (false); + + /* + * if (a->path_cost != b->path_cost) return(false); + */ + if (a->p_ordering.ordtype == SORTOP_ORDER) + { + int i = 0; + + if (a->p_ordering.ord.sortop == NULL || + b->p_ordering.ord.sortop == NULL) + { + + if (a->p_ordering.ord.sortop != b->p_ordering.ord.sortop) + return false; + } + else + { + while (a->p_ordering.ord.sortop[i] != 0 && + b->p_ordering.ord.sortop[i] != 0) + { + if (a->p_ordering.ord.sortop[i] != b->p_ordering.ord.sortop[i]) + return false; + i++; + } + if (a->p_ordering.ord.sortop[i] != 0 || + b->p_ordering.ord.sortop[i] != 0) + return false; + } + } + else + { + if (!equal((a->p_ordering.ord.merge), + (b->p_ordering.ord.merge))) + return (false); } - } else { - if (!equal((a->p_ordering.ord.merge), - (b->p_ordering.ord.merge))) - return(false); - } - if (!equal((a->keys), - (b->keys))) - return(false); - /* - if (a->outerjoincost != b->outerjoincost) - return(false); - */ - if (!equali((a->joinid), - (b->joinid))) - return(false); - return(true); + if (!equal((a->keys), + (b->keys))) + return (false); + + /* + * if (a->outerjoincost != b->outerjoincost) return(false); + */ + if (!equali((a->joinid), + (b->joinid))) + return (false); + return (true); } -static bool -_equalIndexPath(IndexPath *a, IndexPath *b) +static bool +_equalIndexPath(IndexPath * a, IndexPath * b) { - if (!_equalPath((Path*)a,(Path*)b)) - return(false); - if (!equali((a->indexid), (b->indexid))) - return(false); - if (!equal((a->indexqual), (b->indexqual))) - return(false); - return(true); + if (!_equalPath((Path *) a, (Path *) b)) + return (false); + if (!equali((a->indexid), (b->indexid))) + return (false); + if (!equal((a->indexqual), (b->indexqual))) + return (false); + return (true); } -static bool -_equalJoinPath(JoinPath *a,JoinPath *b) +static bool +_equalJoinPath(JoinPath * a, JoinPath * b) { - Assert(IsA_JoinPath(a)); - Assert(IsA_JoinPath(b)); - - if (!_equalPath((Path*)a,(Path*)b)) - return(false); - if (!equal((a->pathclauseinfo), (b->pathclauseinfo))) - return(false); - if (!equal((a->outerjoinpath), (b->outerjoinpath))) - return(false); - if (!equal((a->innerjoinpath), (b->innerjoinpath))) - return(false); - return(true); + Assert(IsA_JoinPath(a)); + Assert(IsA_JoinPath(b)); + + if (!_equalPath((Path *) a, (Path *) b)) + return (false); + if (!equal((a->pathclauseinfo), (b->pathclauseinfo))) + return (false); + if (!equal((a->outerjoinpath), (b->outerjoinpath))) + return (false); + if (!equal((a->innerjoinpath), (b->innerjoinpath))) + return (false); + return (true); } -static bool -_equalMergePath(MergePath *a, MergePath *b) +static bool +_equalMergePath(MergePath * a, MergePath * b) { - Assert(IsA(a,MergePath)); - Assert(IsA(b,MergePath)); - - if (!_equalJoinPath((JoinPath*)a,(JoinPath*)b)) - return(false); - if (!equal((a->path_mergeclauses), (b->path_mergeclauses))) - return(false); - if (!equal((a->outersortkeys), (b->outersortkeys))) - return(false); - if (!equal((a->innersortkeys), (b->innersortkeys))) - return(false); - return(true); + Assert(IsA(a, MergePath)); + Assert(IsA(b, MergePath)); + + if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b)) + return (false); + if (!equal((a->path_mergeclauses), (b->path_mergeclauses))) + return (false); + if (!equal((a->outersortkeys), (b->outersortkeys))) + return (false); + if (!equal((a->innersortkeys), (b->innersortkeys))) + return (false); + return (true); } -static bool -_equalHashPath(HashPath *a, HashPath *b) +static bool +_equalHashPath(HashPath * a, HashPath * b) { - Assert(IsA(a,HashPath)); - Assert(IsA(b,HashPath)); - - if (!_equalJoinPath((JoinPath*)a,(JoinPath*)b)) - return(false); - if (!equal((a->path_hashclauses), (b->path_hashclauses))) - return(false); - if (!equal((a->outerhashkeys), (b->outerhashkeys))) - return(false); - if (!equal((a->innerhashkeys), (b->innerhashkeys))) - return(false); - return(true); + Assert(IsA(a, HashPath)); + Assert(IsA(b, HashPath)); + + if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b)) + return (false); + if (!equal((a->path_hashclauses), (b->path_hashclauses))) + return (false); + if (!equal((a->outerhashkeys), (b->outerhashkeys))) + return (false); + if (!equal((a->innerhashkeys), (b->innerhashkeys))) + return (false); + return (true); } -static bool -_equalJoinKey(JoinKey *a, JoinKey *b) +static bool +_equalJoinKey(JoinKey * a, JoinKey * b) { - Assert(IsA(a,JoinKey)); - Assert(IsA(b,JoinKey)); - - if (!equal((a->outer),(b->outer))) - return(false); - if (!equal((a->inner),(b->inner))) - return(false); - return(true); + Assert(IsA(a, JoinKey)); + Assert(IsA(b, JoinKey)); + + if (!equal((a->outer), (b->outer))) + return (false); + if (!equal((a->inner), (b->inner))) + return (false); + return (true); } -static bool -_equalMergeOrder(MergeOrder *a, MergeOrder *b) +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); + 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 -_equalHInfo(HInfo *a, HInfo *b) +static bool +_equalHInfo(HInfo * a, HInfo * b) { - Assert(IsA(a,HInfo)); - Assert(IsA(b,HInfo)); - - if (a->hashop != b->hashop) - return(false); - return(true); + Assert(IsA(a, HInfo)); + Assert(IsA(b, HInfo)); + + if (a->hashop != b->hashop) + return (false); + return (true); } -/* XXX This equality function is a quick hack, should be - * fixed to compare all fields. +/* XXX This equality function is a quick hack, should be + * fixed to compare all fields. */ -static bool -_equalIndexScan(IndexScan *a, IndexScan *b) +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); + 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 -_equalJInfo(JInfo *a, JInfo *b) +static bool +_equalJInfo(JInfo * a, JInfo * b) { - Assert(IsA(a,JInfo)); - Assert(IsA(b,JInfo)); - if (!equal((a->otherrels),(b->otherrels))) - return(false); - if (!equal((a->jinfoclauseinfo),(b->jinfoclauseinfo))) - return(false); - if (a->mergesortable != b->mergesortable) - return(false); - if (a->hashjoinable != b->hashjoinable) - return(false); - return(true); + Assert(IsA(a, JInfo)); + Assert(IsA(b, JInfo)); + if (!equal((a->otherrels), (b->otherrels))) + return (false); + if (!equal((a->jinfoclauseinfo), (b->jinfoclauseinfo))) + return (false); + if (a->mergesortable != b->mergesortable) + return (false); + if (a->hashjoinable != b->hashjoinable) + return (false); + return (true); } /* - * Stuff from execnodes.h + * Stuff from execnodes.h */ /* - * EState is a subclass of Node. + * EState is a subclass of Node. */ -static bool -_equalEState(EState *a, EState *b) +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); + 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); } -static bool -_equalTargetEntry(TargetEntry *a, TargetEntry *b) +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); + 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); } /* - * equal -- are two lists equal? + * equal -- are two lists equal? * - * This is a comparison by value. It would be simpler to write it - * to be recursive, but it should run faster if we iterate. + * This is a comparison by value. It would be simpler to write it + * to be recursive, but it should run faster if we iterate. */ -static bool -_equalValue(Value *a, Value *b) +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); + 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 + * returns whether two nodes are equal */ bool equal(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_TargetEntry: - retval = _equalTargetEntry(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_Func: - retval = _equalFunc(a, b); - break; - case T_CInfo: - retval = _equalCInfo(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_JoinPath: - retval = _equalJoinPath(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_HInfo: - retval = _equalHInfo(a, b); - break; - case T_IndexScan: - retval = _equalIndexScan(a, b); - break; - case T_JInfo: - retval = _equalJInfo(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; + bool retval = false; - if (a==NULL && b==NULL) + if (a == b) return (true); - if (length(a)!=length(b)) + + /* + * note that a!=b, so only one of them can be NULL + */ + if (a == NULL || b == NULL) return (false); - foreach(l, la) { - if (!equal(lfirst(l), lfirst(lb))) - return (false); - lb = lnext(lb); - } - retval = true; + + /* + * 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_TargetEntry: + retval = _equalTargetEntry(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_Func: + retval = _equalFunc(a, b); + break; + case T_CInfo: + retval = _equalCInfo(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_JoinPath: + retval = _equalJoinPath(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_HInfo: + retval = _equalHInfo(a, b); + break; + case T_IndexScan: + retval = _equalIndexScan(a, b); + break; + case T_JInfo: + retval = _equalJInfo(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; + default: + elog(NOTICE, "equal: don't know whether nodes of type %d are equal", + nodeTag(a)); + break; } - break; - default: - elog(NOTICE, "equal: don't know whether nodes of type %d are equal", - nodeTag(a)); - break; - } - - return retval; + + return retval; } /* * equali-- - * compares two lists of integers + * compares two lists of integers * * XXX temp hack. needs something like T_IntList */ -static bool -equali(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; +static bool +equali(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; } |