]> granicus.if.org Git - postgresql/blob - src/backend/nodes/equalfuncs.c
Back out BETWEEN node patch, was causing initdb failure.
[postgresql] / src / backend / nodes / equalfuncs.c
1 /*-------------------------------------------------------------------------
2  *
3  * equalfuncs.c
4  *        Equality functions to compare node trees.
5  *
6  * NOTE: a general convention when copying or comparing plan nodes is
7  * that we ignore the executor state subnode.  We do not need to look
8  * at it because no current uses of copyObject() or equal() need to
9  * deal with already-executing plan trees.      By leaving the state subnodes
10  * out, we avoid needing to write copy/compare routines for all the
11  * different executor state node types.
12  *
13  * Currently, in fact, equal() doesn't know how to compare Plan nodes
14  * at all, let alone their executor-state subnodes.  This will probably
15  * need to be fixed someday, but presently there is no need to compare
16  * plan trees.
17  *
18  *
19  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
20  * Portions Copyright (c) 1994, Regents of the University of California
21  *
22  * IDENTIFICATION
23  *        $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.143 2002/07/18 17:14:19 momjian Exp $
24  *
25  *-------------------------------------------------------------------------
26  */
27
28 #include "postgres.h"
29
30 #include "nodes/plannodes.h"
31 #include "nodes/relation.h"
32 #include "utils/datum.h"
33
34
35 /* Macro for comparing string fields that might be NULL */
36 #define equalstr(a, b)  \
37         (((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))
38
39
40 /*
41  *      Stuff from primnodes.h
42  */
43
44 static bool
45 _equalResdom(Resdom *a, Resdom *b)
46 {
47         if (a->resno != b->resno)
48                 return false;
49         if (a->restype != b->restype)
50                 return false;
51         if (a->restypmod != b->restypmod)
52                 return false;
53         if (!equalstr(a->resname, b->resname))
54                 return false;
55         if (a->ressortgroupref != b->ressortgroupref)
56                 return false;
57         if (a->reskey != b->reskey)
58                 return false;
59         if (a->reskeyop != b->reskeyop)
60                 return false;
61         /* we ignore resjunk flag ... is this correct? */
62
63         return true;
64 }
65
66 static bool
67 _equalFjoin(Fjoin *a, Fjoin *b)
68 {
69         int                     nNodes;
70
71         if (a->fj_initialized != b->fj_initialized)
72                 return false;
73         if (a->fj_nNodes != b->fj_nNodes)
74                 return false;
75         if (!equal(a->fj_innerNode, b->fj_innerNode))
76                 return false;
77
78         nNodes = a->fj_nNodes;
79         if (memcmp(a->fj_results, b->fj_results, nNodes * sizeof(Datum)) != 0)
80                 return false;
81         if (memcmp(a->fj_alwaysDone, b->fj_alwaysDone, nNodes * sizeof(bool)) != 0)
82                 return false;
83
84         return true;
85 }
86
87 static bool
88 _equalExpr(Expr *a, Expr *b)
89 {
90         /*
91          * We do not examine typeOid, since the optimizer often doesn't bother
92          * to set it in created nodes, and it is logically a derivative of the
93          * oper field anyway.
94          */
95         if (a->opType != b->opType)
96                 return false;
97         if (!equal(a->oper, b->oper))
98                 return false;
99         if (!equal(a->args, b->args))
100                 return false;
101
102         return true;
103 }
104
105 static bool
106 _equalVar(Var *a, Var *b)
107 {
108         if (a->varno != b->varno)
109                 return false;
110         if (a->varattno != b->varattno)
111                 return false;
112         if (a->vartype != b->vartype)
113                 return false;
114         if (a->vartypmod != b->vartypmod)
115                 return false;
116         if (a->varlevelsup != b->varlevelsup)
117                 return false;
118         if (a->varnoold != b->varnoold)
119                 return false;
120         if (a->varoattno != b->varoattno)
121                 return false;
122
123         return true;
124 }
125
126 static bool
127 _equalOper(Oper *a, Oper *b)
128 {
129         if (a->opno != b->opno)
130                 return false;
131         if (a->opresulttype != b->opresulttype)
132                 return false;
133         if (a->opretset != b->opretset)
134                 return false;
135
136         /*
137          * We do not examine opid or op_fcache, since these are logically
138          * derived from opno, and they may not be set yet depending on how far
139          * along the node is in the parse/plan pipeline.
140          *
141          * (Besides, op_fcache is executor state, which we don't check --- see
142          * notes at head of file.)
143          *
144          * It's probably not really necessary to check opresulttype or opretset,
145          * either...
146          */
147
148         return true;
149 }
150
151 static bool
152 _equalConst(Const *a, Const *b)
153 {
154         if (a->consttype != b->consttype)
155                 return false;
156         if (a->constlen != b->constlen)
157                 return false;
158         if (a->constisnull != b->constisnull)
159                 return false;
160         if (a->constbyval != b->constbyval)
161                 return false;
162         /* XXX What about constisset and constiscast? */
163
164         /*
165          * We treat all NULL constants of the same type as equal. Someday this
166          * might need to change?  But datumIsEqual doesn't work on nulls,
167          * so...
168          */
169         if (a->constisnull)
170                 return true;
171         return datumIsEqual(a->constvalue, b->constvalue,
172                                                 a->constbyval, a->constlen);
173 }
174
175 static bool
176 _equalParam(Param *a, Param *b)
177 {
178         if (a->paramkind != b->paramkind)
179                 return false;
180         if (a->paramtype != b->paramtype)
181                 return false;
182
183         switch (a->paramkind)
184         {
185                 case PARAM_NAMED:
186                 case PARAM_NEW:
187                 case PARAM_OLD:
188                         if (strcmp(a->paramname, b->paramname) != 0)
189                                 return false;
190                         break;
191                 case PARAM_NUM:
192                 case PARAM_EXEC:
193                         if (a->paramid != b->paramid)
194                                 return false;
195                         break;
196                 case PARAM_INVALID:
197
198                         /*
199                          * XXX: Hmmm... What are we supposed to return in this case ??
200                          */
201                         return true;
202                         break;
203                 default:
204                         elog(ERROR, "_equalParam: Invalid paramkind value: %d",
205                                  a->paramkind);
206         }
207
208         return true;
209 }
210
211 static bool
212 _equalFunc(Func *a, Func *b)
213 {
214         if (a->funcid != b->funcid)
215                 return false;
216         if (a->funcresulttype != b->funcresulttype)
217                 return false;
218         if (a->funcretset != b->funcretset)
219                 return false;
220         /* Note we do not look at func_fcache; see notes for _equalOper */
221
222         return true;
223 }
224
225 static bool
226 _equalAggref(Aggref *a, Aggref *b)
227 {
228         if (a->aggfnoid != b->aggfnoid)
229                 return false;
230         if (a->aggtype != b->aggtype)
231                 return false;
232         if (!equal(a->target, b->target))
233                 return false;
234         if (a->aggstar != b->aggstar)
235                 return false;
236         if (a->aggdistinct != b->aggdistinct)
237                 return false;
238         /* ignore aggno, which is only a private field for the executor */
239         return true;
240 }
241
242 static bool
243 _equalSubLink(SubLink *a, SubLink *b)
244 {
245         if (a->subLinkType != b->subLinkType)
246                 return false;
247         if (a->useor != b->useor)
248                 return false;
249         if (!equal(a->lefthand, b->lefthand))
250                 return false;
251         if (!equal(a->oper, b->oper))
252                 return false;
253         if (!equal(a->subselect, b->subselect))
254                 return false;
255         return true;
256 }
257
258 static bool
259 _equalArrayRef(ArrayRef *a, ArrayRef *b)
260 {
261         if (a->refelemtype != b->refelemtype)
262                 return false;
263         if (a->refattrlength != b->refattrlength)
264                 return false;
265         if (a->refelemlength != b->refelemlength)
266                 return false;
267         if (a->refelembyval != b->refelembyval)
268                 return false;
269         if (!equal(a->refupperindexpr, b->refupperindexpr))
270                 return false;
271         if (!equal(a->reflowerindexpr, b->reflowerindexpr))
272                 return false;
273         if (!equal(a->refexpr, b->refexpr))
274                 return false;
275         return equal(a->refassgnexpr, b->refassgnexpr);
276 }
277
278 static bool
279 _equalFieldSelect(FieldSelect *a, FieldSelect *b)
280 {
281         if (!equal(a->arg, b->arg))
282                 return false;
283         if (a->fieldnum != b->fieldnum)
284                 return false;
285         if (a->resulttype != b->resulttype)
286                 return false;
287         if (a->resulttypmod != b->resulttypmod)
288                 return false;
289         return true;
290 }
291
292 static bool
293 _equalRelabelType(RelabelType *a, RelabelType *b)
294 {
295         if (!equal(a->arg, b->arg))
296                 return false;
297         if (a->resulttype != b->resulttype)
298                 return false;
299         if (a->resulttypmod != b->resulttypmod)
300                 return false;
301         return true;
302 }
303
304 static bool
305 _equalRangeTblRef(RangeTblRef *a, RangeTblRef *b)
306 {
307         if (a->rtindex != b->rtindex)
308                 return false;
309
310         return true;
311 }
312
313 static bool
314 _equalFromExpr(FromExpr *a, FromExpr *b)
315 {
316         if (!equal(a->fromlist, b->fromlist))
317                 return false;
318         if (!equal(a->quals, b->quals))
319                 return false;
320
321         return true;
322 }
323
324 static bool
325 _equalJoinExpr(JoinExpr *a, JoinExpr *b)
326 {
327         if (a->jointype != b->jointype)
328                 return false;
329         if (a->isNatural != b->isNatural)
330                 return false;
331         if (!equal(a->larg, b->larg))
332                 return false;
333         if (!equal(a->rarg, b->rarg))
334                 return false;
335         if (!equal(a->using, b->using))
336                 return false;
337         if (!equal(a->quals, b->quals))
338                 return false;
339         if (!equal(a->alias, b->alias))
340                 return false;
341         if (a->rtindex != b->rtindex)
342                 return false;
343
344         return true;
345 }
346
347 /*
348  * Stuff from relation.h
349  */
350
351 static bool
352 _equalRelOptInfo(RelOptInfo *a, RelOptInfo *b)
353 {
354         /*
355          * We treat RelOptInfos as equal if they refer to the same base rels
356          * joined in the same order.  Is this appropriate/sufficient?
357          */
358         return equali(a->relids, b->relids);
359 }
360
361 static bool
362 _equalIndexOptInfo(IndexOptInfo *a, IndexOptInfo *b)
363 {
364         /*
365          * We treat IndexOptInfos as equal if they refer to the same index. Is
366          * this sufficient?
367          */
368         if (a->indexoid != b->indexoid)
369                 return false;
370         return true;
371 }
372
373 static bool
374 _equalPathKeyItem(PathKeyItem *a, PathKeyItem *b)
375 {
376         if (a->sortop != b->sortop)
377                 return false;
378         if (!equal(a->key, b->key))
379                 return false;
380         return true;
381 }
382
383 static bool
384 _equalPath(Path *a, Path *b)
385 {
386         if (a->pathtype != b->pathtype)
387                 return false;
388         if (!equal(a->parent, b->parent))
389                 return false;
390
391         /*
392          * do not check path costs, since they may not be set yet, and being
393          * float values there are roundoff error issues anyway...
394          */
395         if (!equal(a->pathkeys, b->pathkeys))
396                 return false;
397         return true;
398 }
399
400 static bool
401 _equalIndexPath(IndexPath *a, IndexPath *b)
402 {
403         if (!_equalPath((Path *) a, (Path *) b))
404                 return false;
405         if (!equal(a->indexinfo, b->indexinfo))
406                 return false;
407         if (!equal(a->indexqual, b->indexqual))
408                 return false;
409         if (a->indexscandir != b->indexscandir)
410                 return false;
411         if (!equali(a->joinrelids, b->joinrelids))
412                 return false;
413         if (a->alljoinquals != b->alljoinquals)
414                 return false;
415
416         /*
417          * Skip 'rows' because of possibility of floating-point roundoff
418          * error. It should be derivable from the other fields anyway.
419          */
420         return true;
421 }
422
423 static bool
424 _equalTidPath(TidPath *a, TidPath *b)
425 {
426         if (!_equalPath((Path *) a, (Path *) b))
427                 return false;
428         if (!equal(a->tideval, b->tideval))
429                 return false;
430         if (!equali(a->unjoined_relids, b->unjoined_relids))
431                 return false;
432         return true;
433 }
434
435 static bool
436 _equalAppendPath(AppendPath *a, AppendPath *b)
437 {
438         if (!_equalPath((Path *) a, (Path *) b))
439                 return false;
440         if (!equal(a->subpaths, b->subpaths))
441                 return false;
442         return true;
443 }
444
445 static bool
446 _equalJoinPath(JoinPath *a, JoinPath *b)
447 {
448         if (!_equalPath((Path *) a, (Path *) b))
449                 return false;
450         if (a->jointype != b->jointype)
451                 return false;
452         if (!equal(a->outerjoinpath, b->outerjoinpath))
453                 return false;
454         if (!equal(a->innerjoinpath, b->innerjoinpath))
455                 return false;
456         if (!equal(a->joinrestrictinfo, b->joinrestrictinfo))
457                 return false;
458         return true;
459 }
460
461 static bool
462 _equalNestPath(NestPath *a, NestPath *b)
463 {
464         if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
465                 return false;
466         return true;
467 }
468
469 static bool
470 _equalMergePath(MergePath *a, MergePath *b)
471 {
472         if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
473                 return false;
474         if (!equal(a->path_mergeclauses, b->path_mergeclauses))
475                 return false;
476         if (!equal(a->outersortkeys, b->outersortkeys))
477                 return false;
478         if (!equal(a->innersortkeys, b->innersortkeys))
479                 return false;
480         return true;
481 }
482
483 static bool
484 _equalHashPath(HashPath *a, HashPath *b)
485 {
486         if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
487                 return false;
488         if (!equal(a->path_hashclauses, b->path_hashclauses))
489                 return false;
490         return true;
491 }
492
493 static bool
494 _equalSubPlan(SubPlan *a, SubPlan *b)
495 {
496         /* should compare plans, but have to settle for comparing plan IDs */
497         if (a->plan_id != b->plan_id)
498                 return false;
499
500         if (!equal(a->rtable, b->rtable))
501                 return false;
502
503         if (!equal(a->sublink, b->sublink))
504                 return false;
505
506         return true;
507 }
508
509 static bool
510 _equalRestrictInfo(RestrictInfo *a, RestrictInfo *b)
511 {
512         if (!equal(a->clause, b->clause))
513                 return false;
514         if (a->ispusheddown != b->ispusheddown)
515                 return false;
516
517         /*
518          * We ignore eval_cost, this_selec, left/right_pathkey, and
519          * left/right_bucketsize, since they may not be set yet, and should be
520          * derivable from the clause anyway.  Probably it's not really
521          * necessary to compare any of these remaining fields ...
522          */
523         if (!equal(a->subclauseindices, b->subclauseindices))
524                 return false;
525         if (a->mergejoinoperator != b->mergejoinoperator)
526                 return false;
527         if (a->left_sortop != b->left_sortop)
528                 return false;
529         if (a->right_sortop != b->right_sortop)
530                 return false;
531         if (a->hashjoinoperator != b->hashjoinoperator)
532                 return false;
533         return true;
534 }
535
536 static bool
537 _equalJoinInfo(JoinInfo *a, JoinInfo *b)
538 {
539         if (!equali(a->unjoined_relids, b->unjoined_relids))
540                 return false;
541         if (!equal(a->jinfo_restrictinfo, b->jinfo_restrictinfo))
542                 return false;
543         return true;
544 }
545
546 static bool
547 _equalStream(Stream *a, Stream *b)
548 {
549         if (a->clausetype != b->clausetype)
550                 return false;
551         if (a->groupup != b->groupup)
552                 return false;
553         if (a->groupcost != b->groupcost)
554                 return false;
555         if (a->groupsel != b->groupsel)
556                 return false;
557         if (!equal(a->pathptr, b->pathptr))
558                 return false;
559         if (!equal(a->cinfo, b->cinfo))
560                 return false;
561         if (!equal(a->upstream, b->upstream))
562                 return false;
563         return equal(a->downstream, b->downstream);
564 }
565
566 /*
567  * Stuff from parsenodes.h
568  */
569
570 static bool
571 _equalQuery(Query *a, Query *b)
572 {
573         if (a->commandType != b->commandType)
574                 return false;
575         if (!equal(a->utilityStmt, b->utilityStmt))
576                 return false;
577         if (a->resultRelation != b->resultRelation)
578                 return false;
579         if (!equal(a->into, b->into))
580                 return false;
581         if (a->isPortal != b->isPortal)
582                 return false;
583         if (a->isBinary != b->isBinary)
584                 return false;
585         if (a->hasAggs != b->hasAggs)
586                 return false;
587         if (a->hasSubLinks != b->hasSubLinks)
588                 return false;
589         /* we deliberately ignore originalQuery */
590         if (!equal(a->rtable, b->rtable))
591                 return false;
592         if (!equal(a->jointree, b->jointree))
593                 return false;
594         if (!equali(a->rowMarks, b->rowMarks))
595                 return false;
596         if (!equal(a->targetList, b->targetList))
597                 return false;
598         if (!equal(a->groupClause, b->groupClause))
599                 return false;
600         if (!equal(a->havingQual, b->havingQual))
601                 return false;
602         if (!equal(a->distinctClause, b->distinctClause))
603                 return false;
604         if (!equal(a->sortClause, b->sortClause))
605                 return false;
606         if (!equal(a->limitOffset, b->limitOffset))
607                 return false;
608         if (!equal(a->limitCount, b->limitCount))
609                 return false;
610         if (!equal(a->setOperations, b->setOperations))
611                 return false;
612         if (!equali(a->resultRelations, b->resultRelations))
613                 return false;
614
615         /*
616          * We do not check the internal-to-the-planner fields: base_rel_list,
617          * other_rel_list, join_rel_list, equi_key_list, query_pathkeys. They
618          * might not be set yet, and in any case they should be derivable from
619          * the other fields.
620          */
621         return true;
622 }
623
624 static bool
625 _equalInsertStmt(InsertStmt *a, InsertStmt *b)
626 {
627         if (!equal(a->relation, b->relation))
628                 return false;
629         if (!equal(a->cols, b->cols))
630                 return false;
631         if (!equal(a->targetList, b->targetList))
632                 return false;
633         if (!equal(a->selectStmt, b->selectStmt))
634                 return false;
635
636         return true;
637 }
638
639 static bool
640 _equalDeleteStmt(DeleteStmt *a, DeleteStmt *b)
641 {
642         if (!equal(a->relation, b->relation))
643                 return false;
644         if (!equal(a->whereClause, b->whereClause))
645                 return false;
646
647         return true;
648 }
649
650 static bool
651 _equalUpdateStmt(UpdateStmt *a, UpdateStmt *b)
652 {
653         if (!equal(a->relation, b->relation))
654                 return false;
655         if (!equal(a->targetList, b->targetList))
656                 return false;
657         if (!equal(a->whereClause, b->whereClause))
658                 return false;
659         if (!equal(a->fromClause, b->fromClause))
660                 return false;
661
662         return true;
663 }
664
665 static bool
666 _equalSelectStmt(SelectStmt *a, SelectStmt *b)
667 {
668         if (!equal(a->distinctClause, b->distinctClause))
669                 return false;
670         if (!equal(a->into, b->into))
671                 return false;
672         if (!equal(a->intoColNames, b->intoColNames))
673                 return false;
674         if (!equal(a->targetList, b->targetList))
675                 return false;
676         if (!equal(a->fromClause, b->fromClause))
677                 return false;
678         if (!equal(a->whereClause, b->whereClause))
679                 return false;
680         if (!equal(a->groupClause, b->groupClause))
681                 return false;
682         if (!equal(a->havingClause, b->havingClause))
683                 return false;
684         if (!equal(a->sortClause, b->sortClause))
685                 return false;
686         if (!equalstr(a->portalname, b->portalname))
687                 return false;
688         if (a->binary != b->binary)
689                 return false;
690         if (!equal(a->limitOffset, b->limitOffset))
691                 return false;
692         if (!equal(a->limitCount, b->limitCount))
693                 return false;
694         if (!equal(a->forUpdate, b->forUpdate))
695                 return false;
696         if (a->op != b->op)
697                 return false;
698         if (a->all != b->all)
699                 return false;
700         if (!equal(a->larg, b->larg))
701                 return false;
702         if (!equal(a->rarg, b->rarg))
703                 return false;
704
705         return true;
706 }
707
708 static bool
709 _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
710 {
711         if (a->op != b->op)
712                 return false;
713         if (a->all != b->all)
714                 return false;
715         if (!equal(a->larg, b->larg))
716                 return false;
717         if (!equal(a->rarg, b->rarg))
718                 return false;
719         if (!equali(a->colTypes, b->colTypes))
720                 return false;
721
722         return true;
723 }
724
725 static bool
726 _equalAlterTableStmt(AlterTableStmt *a, AlterTableStmt *b)
727 {
728         if (a->subtype != b->subtype)
729                 return false;
730         if (!equal(a->relation, b->relation))
731                 return false;
732         if (!equalstr(a->name, b->name))
733                 return false;
734         if (!equal(a->def, b->def))
735                 return false;
736         if (a->behavior != b->behavior)
737                 return false;
738
739         return true;
740 }
741
742 static bool
743 _equalGrantStmt(GrantStmt *a, GrantStmt *b)
744 {
745         if (a->is_grant != b->is_grant)
746                 return false;
747         if (a->objtype != b->objtype)
748                 return false;
749         if (!equal(a->objects, b->objects))
750                 return false;
751         if (!equali(a->privileges, b->privileges))
752                 return false;
753         if (!equal(a->grantees, b->grantees))
754                 return false;
755
756         return true;
757 }
758
759 static bool
760 _equalPrivGrantee(PrivGrantee *a, PrivGrantee *b)
761 {
762         return equalstr(a->username, b->username)
763                 && equalstr(a->groupname, b->groupname);
764 }
765
766 static bool
767 _equalFuncWithArgs(FuncWithArgs *a, FuncWithArgs *b)
768 {
769         return equal(a->funcname, b->funcname)
770                 && equal(a->funcargs, b->funcargs);
771 }
772
773 static bool
774 _equalInsertDefault(InsertDefault *a, InsertDefault *b)
775 {
776         return true;
777 }
778
779 static bool
780 _equalClosePortalStmt(ClosePortalStmt *a, ClosePortalStmt *b)
781 {
782         if (!equalstr(a->portalname, b->portalname))
783                 return false;
784
785         return true;
786 }
787
788 static bool
789 _equalClusterStmt(ClusterStmt *a, ClusterStmt *b)
790 {
791         if (!equal(a->relation, b->relation))
792                 return false;
793         if (!equalstr(a->indexname, b->indexname))
794                 return false;
795
796         return true;
797 }
798
799 static bool
800 _equalCopyStmt(CopyStmt *a, CopyStmt *b)
801 {
802         if (!equal(a->relation, b->relation))
803                 return false;
804         if (a->is_from != b->is_from)
805                 return false;
806         if (!equalstr(a->filename, b->filename))
807                 return false;
808         if (!equal(a->options, b->options))
809                 return false;
810
811         return true;
812 }
813
814 static bool
815 _equalCreateStmt(CreateStmt *a, CreateStmt *b)
816 {
817         if (!equal(a->relation, b->relation))
818                 return false;
819         if (!equal(a->tableElts, b->tableElts))
820                 return false;
821         if (!equal(a->inhRelations, b->inhRelations))
822                 return false;
823         if (!equal(a->constraints, b->constraints))
824                 return false;
825         if (a->hasoids != b->hasoids)
826                 return false;
827
828         return true;
829 }
830
831 static bool
832 _equalDefineStmt(DefineStmt *a, DefineStmt *b)
833 {
834         if (a->defType != b->defType)
835                 return false;
836         if (!equal(a->defnames, b->defnames))
837                 return false;
838         if (!equal(a->definition, b->definition))
839                 return false;
840
841         return true;
842 }
843
844 static bool
845 _equalDropStmt(DropStmt *a, DropStmt *b)
846 {
847         if (!equal(a->objects, b->objects))
848                 return false;
849         if (a->removeType != b->removeType)
850                 return false;
851         if (a->behavior != b->behavior)
852                 return false;
853
854         return true;
855 }
856
857 static bool
858 _equalTruncateStmt(TruncateStmt *a, TruncateStmt *b)
859 {
860         if (!equal(a->relation, b->relation))
861                 return false;
862
863         return true;
864 }
865
866 static bool
867 _equalCommentStmt(CommentStmt *a, CommentStmt *b)
868 {
869         if (a->objtype != b->objtype)
870                 return false;
871         if (!equal(a->objname, b->objname))
872                 return false;
873         if (!equal(a->objargs, b->objargs))
874                 return false;
875         if (!equalstr(a->comment, b->comment))
876                 return false;
877
878         return true;
879 }
880
881 static bool
882 _equalFetchStmt(FetchStmt *a, FetchStmt *b)
883 {
884         if (a->direction != b->direction)
885                 return false;
886         if (a->howMany != b->howMany)
887                 return false;
888         if (!equalstr(a->portalname, b->portalname))
889                 return false;
890         if (a->ismove != b->ismove)
891                 return false;
892
893         return true;
894 }
895
896 static bool
897 _equalIndexStmt(IndexStmt *a, IndexStmt *b)
898 {
899         if (!equalstr(a->idxname, b->idxname))
900                 return false;
901         if (!equal(a->relation, b->relation))
902                 return false;
903         if (!equalstr(a->accessMethod, b->accessMethod))
904                 return false;
905         if (!equal(a->indexParams, b->indexParams))
906                 return false;
907         if (!equal(a->whereClause, b->whereClause))
908                 return false;
909         if (!equal(a->rangetable, b->rangetable))
910                 return false;
911         if (a->unique != b->unique)
912                 return false;
913         if (a->primary != b->primary)
914                 return false;
915         if (a->isconstraint != b->isconstraint)
916                 return false;
917
918         return true;
919 }
920
921 static bool
922 _equalCreateFunctionStmt(CreateFunctionStmt *a, CreateFunctionStmt *b)
923 {
924         if (a->replace != b->replace)
925                 return false;
926         if (!equal(a->funcname, b->funcname))
927                 return false;
928         if (!equal(a->argTypes, b->argTypes))
929                 return false;
930         if (!equal(a->returnType, b->returnType))
931                 return false;
932         if (!equal(a->options, b->options))
933                 return false;
934         if (!equal(a->withClause, b->withClause))
935                 return false;
936
937         return true;
938 }
939
940 static bool
941 _equalRemoveAggrStmt(RemoveAggrStmt *a, RemoveAggrStmt *b)
942 {
943         if (!equal(a->aggname, b->aggname))
944                 return false;
945         if (!equal(a->aggtype, b->aggtype))
946                 return false;
947         if (a->behavior != b->behavior)
948                 return false;
949
950         return true;
951 }
952
953 static bool
954 _equalRemoveFuncStmt(RemoveFuncStmt *a, RemoveFuncStmt *b)
955 {
956         if (!equal(a->funcname, b->funcname))
957                 return false;
958         if (!equal(a->args, b->args))
959                 return false;
960         if (a->behavior != b->behavior)
961                 return false;
962
963         return true;
964 }
965
966 static bool
967 _equalRemoveOperStmt(RemoveOperStmt *a, RemoveOperStmt *b)
968 {
969         if (!equal(a->opname, b->opname))
970                 return false;
971         if (!equal(a->args, b->args))
972                 return false;
973         if (a->behavior != b->behavior)
974                 return false;
975
976         return true;
977 }
978
979
980 static bool
981 _equalRenameStmt(RenameStmt *a, RenameStmt *b)
982 {
983         if (!equal(a->relation, b->relation))
984                 return false;
985         if (!equalstr(a->oldname, b->oldname))
986                 return false;
987         if (!equalstr(a->newname, b->newname))
988                 return false;
989         if (a->renameType != b->renameType)
990                 return false;
991
992         return true;
993 }
994
995 static bool
996 _equalRuleStmt(RuleStmt *a, RuleStmt *b)
997 {
998         if (!equal(a->relation, b->relation))
999                 return false;
1000         if (!equalstr(a->rulename, b->rulename))
1001                 return false;
1002         if (!equal(a->whereClause, b->whereClause))
1003                 return false;
1004         if (a->event != b->event)
1005                 return false;
1006         if (a->instead != b->instead)
1007                 return false;
1008         if (!equal(a->actions, b->actions))
1009                 return false;
1010
1011         return true;
1012 }
1013
1014 static bool
1015 _equalNotifyStmt(NotifyStmt *a, NotifyStmt *b)
1016 {
1017         if (!equal(a->relation, b->relation))
1018                 return false;
1019
1020         return true;
1021 }
1022
1023 static bool
1024 _equalListenStmt(ListenStmt *a, ListenStmt *b)
1025 {
1026         if (!equal(a->relation, b->relation))
1027                 return false;
1028
1029         return true;
1030 }
1031
1032 static bool
1033 _equalUnlistenStmt(UnlistenStmt *a, UnlistenStmt *b)
1034 {
1035         if (!equal(a->relation, b->relation))
1036                 return false;
1037
1038         return true;
1039 }
1040
1041 static bool
1042 _equalTransactionStmt(TransactionStmt *a, TransactionStmt *b)
1043 {
1044         if (a->command != b->command)
1045                 return false;
1046
1047         return true;
1048 }
1049
1050 static bool
1051 _equalViewStmt(ViewStmt *a, ViewStmt *b)
1052 {
1053         if (!equal(a->view, b->view))
1054                 return false;
1055         if (!equal(a->aliases, b->aliases))
1056                 return false;
1057         if (!equal(a->query, b->query))
1058                 return false;
1059
1060         return true;
1061 }
1062
1063 static bool
1064 _equalLoadStmt(LoadStmt *a, LoadStmt *b)
1065 {
1066         if (!equalstr(a->filename, b->filename))
1067                 return false;
1068
1069         return true;
1070 }
1071
1072 static bool
1073 _equalCreateDomainStmt(CreateDomainStmt *a, CreateDomainStmt *b)
1074 {
1075         if (!equal(a->domainname, b->domainname))
1076                 return false;
1077         if (!equal(a->typename, b->typename))
1078                 return false;
1079         if (!equal(a->constraints, b->constraints))
1080                 return false;
1081
1082         return true;
1083 }
1084
1085 static bool
1086 _equalCreatedbStmt(CreatedbStmt *a, CreatedbStmt *b)
1087 {
1088         if (!equalstr(a->dbname, b->dbname))
1089                 return false;
1090         if (!equal(a->options, b->options))
1091                 return false;
1092
1093         return true;
1094 }
1095
1096 static bool
1097 _equalAlterDatabaseSetStmt(AlterDatabaseSetStmt *a, AlterDatabaseSetStmt *b)
1098 {
1099         if (!equalstr(a->dbname, b->dbname))
1100                 return false;
1101         if (!equalstr(a->variable, b->variable))
1102                 return false;
1103         if (!equal(a->value, b->value))
1104                 return false;
1105
1106         return true;
1107 }
1108
1109 static bool
1110 _equalDropdbStmt(DropdbStmt *a, DropdbStmt *b)
1111 {
1112         if (!equalstr(a->dbname, b->dbname))
1113                 return false;
1114
1115         return true;
1116 }
1117
1118 static bool
1119 _equalVacuumStmt(VacuumStmt *a, VacuumStmt *b)
1120 {
1121         if (a->vacuum != b->vacuum)
1122                 return false;
1123         if (a->full != b->full)
1124                 return false;
1125         if (a->analyze != b->analyze)
1126                 return false;
1127         if (a->freeze != b->freeze)
1128                 return false;
1129         if (a->verbose != b->verbose)
1130                 return false;
1131         if (!equal(a->relation, b->relation))
1132                 return false;
1133         if (!equal(a->va_cols, b->va_cols))
1134                 return false;
1135
1136         return true;
1137 }
1138
1139 static bool
1140 _equalExplainStmt(ExplainStmt *a, ExplainStmt *b)
1141 {
1142         if (!equal(a->query, b->query))
1143                 return false;
1144         if (a->verbose != b->verbose)
1145                 return false;
1146         if (a->analyze != b->analyze)
1147                 return false;
1148
1149         return true;
1150 }
1151
1152 static bool
1153 _equalCreateSeqStmt(CreateSeqStmt *a, CreateSeqStmt *b)
1154 {
1155         if (!equal(a->sequence, b->sequence))
1156                 return false;
1157         if (!equal(a->options, b->options))
1158                 return false;
1159
1160         return true;
1161 }
1162
1163 static bool
1164 _equalVariableSetStmt(VariableSetStmt *a, VariableSetStmt *b)
1165 {
1166         if (!equalstr(a->name, b->name))
1167                 return false;
1168         if (!equal(a->args, b->args))
1169                 return false;
1170         if (a->is_local != b->is_local)
1171                 return false;
1172
1173         return true;
1174 }
1175
1176 static bool
1177 _equalVariableShowStmt(VariableShowStmt *a, VariableShowStmt *b)
1178 {
1179         if (!equalstr(a->name, b->name))
1180                 return false;
1181
1182         return true;
1183 }
1184
1185 static bool
1186 _equalVariableResetStmt(VariableResetStmt *a, VariableResetStmt *b)
1187 {
1188         if (!equalstr(a->name, b->name))
1189                 return false;
1190
1191         return true;
1192 }
1193
1194 static bool
1195 _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
1196 {
1197         if (!equalstr(a->trigname, b->trigname))
1198                 return false;
1199         if (!equal(a->relation, b->relation))
1200                 return false;
1201         if (!equal(a->funcname, b->funcname))
1202                 return false;
1203         if (!equal(a->args, b->args))
1204                 return false;
1205         if (a->before != b->before)
1206                 return false;
1207         if (a->row != b->row)
1208                 return false;
1209         if (strcmp(a->actions, b->actions) != 0)
1210                 return false;
1211         if (!equalstr(a->lang, b->lang))
1212                 return false;
1213         if (!equalstr(a->text, b->text))
1214                 return false;
1215         if (!equal(a->attr, b->attr))
1216                 return false;
1217         if (!equalstr(a->when, b->when))
1218                 return false;
1219         if (a->isconstraint != b->isconstraint)
1220                 return false;
1221         if (a->deferrable != b->deferrable)
1222                 return false;
1223         if (a->initdeferred != b->initdeferred)
1224                 return false;
1225         if (!equal(a->constrrel, b->constrrel))
1226                 return false;
1227
1228         return true;
1229 }
1230
1231 static bool
1232 _equalDropPropertyStmt(DropPropertyStmt *a, DropPropertyStmt *b)
1233 {
1234         if (!equal(a->relation, b->relation))
1235                 return false;
1236         if (!equalstr(a->property, b->property))
1237                 return false;
1238         if (a->removeType != b->removeType)
1239                 return false;
1240         if (a->behavior != b->behavior)
1241                 return false;
1242
1243         return true;
1244 }
1245
1246 static bool
1247 _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
1248 {
1249         if (!equalstr(a->plname, b->plname))
1250                 return false;
1251         if (!equal(a->plhandler, b->plhandler))
1252                 return false;
1253         if (!equal(a->plvalidator, b->plvalidator))
1254                 return false;
1255         if (!equalstr(a->plcompiler, b->plcompiler))
1256                 return false;
1257         if (a->pltrusted != b->pltrusted)
1258                 return false;
1259
1260         return true;
1261 }
1262
1263 static bool
1264 _equalDropPLangStmt(DropPLangStmt *a, DropPLangStmt *b)
1265 {
1266         if (!equalstr(a->plname, b->plname))
1267                 return false;
1268         if (a->behavior != b->behavior)
1269                 return false;
1270
1271         return true;
1272 }
1273
1274 static bool
1275 _equalCreateUserStmt(CreateUserStmt *a, CreateUserStmt *b)
1276 {
1277         if (!equalstr(a->user, b->user))
1278                 return false;
1279         if (!equal(a->options, b->options))
1280                 return false;
1281
1282         return true;
1283 }
1284
1285 static bool
1286 _equalAlterUserStmt(AlterUserStmt *a, AlterUserStmt *b)
1287 {
1288         if (!equalstr(a->user, b->user))
1289                 return false;
1290         if (!equal(a->options, b->options))
1291                 return false;
1292
1293         return true;
1294 }
1295
1296 static bool
1297 _equalAlterUserSetStmt(AlterUserSetStmt *a, AlterUserSetStmt *b)
1298 {
1299         if (!equalstr(a->user, b->user))
1300                 return false;
1301         if (!equalstr(a->variable, b->variable))
1302                 return false;
1303         if (!equal(a->value, b->value))
1304                 return false;
1305
1306         return true;
1307 }
1308
1309 static bool
1310 _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
1311 {
1312         if (!equal(a->users, b->users))
1313                 return false;
1314
1315         return true;
1316 }
1317
1318 static bool
1319 _equalLockStmt(LockStmt *a, LockStmt *b)
1320 {
1321         if (!equal(a->relations, b->relations))
1322                 return false;
1323         if (a->mode != b->mode)
1324                 return false;
1325
1326         return true;
1327 }
1328
1329 static bool
1330 _equalConstraintsSetStmt(ConstraintsSetStmt *a, ConstraintsSetStmt *b)
1331 {
1332         if (!equal(a->constraints, b->constraints))
1333                 return false;
1334         if (a->deferred != b->deferred)
1335                 return false;
1336
1337         return true;
1338 }
1339
1340 static bool
1341 _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
1342 {
1343         if (!equalstr(a->name, b->name))
1344                 return false;
1345         if (!equal(a->options, b->options))
1346                 return false;
1347
1348         return true;
1349 }
1350
1351 static bool
1352 _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
1353 {
1354         if (!equalstr(a->name, b->name))
1355                 return false;
1356         if (a->action != b->action)
1357                 return false;
1358         if (!equal(a->listUsers, b->listUsers))
1359                 return false;
1360
1361         return true;
1362 }
1363
1364 static bool
1365 _equalDropGroupStmt(DropGroupStmt *a, DropGroupStmt *b)
1366 {
1367         if (!equalstr(a->name, b->name))
1368                 return false;
1369
1370         return true;
1371 }
1372
1373 static bool
1374 _equalReindexStmt(ReindexStmt *a, ReindexStmt *b)
1375 {
1376         if (a->reindexType != b->reindexType)
1377                 return false;
1378         if (!equal(a->relation, b->relation))
1379                 return false;
1380         if (!equalstr(a->name, b->name))
1381                 return false;
1382         if (a->force != b->force)
1383                 return false;
1384         if (a->all != b->all)
1385                 return false;
1386
1387         return true;
1388 }
1389
1390 static bool
1391 _equalCreateSchemaStmt(CreateSchemaStmt *a, CreateSchemaStmt *b)
1392 {
1393         if (!equalstr(a->schemaname, b->schemaname))
1394                 return false;
1395         if (!equalstr(a->authid, b->authid))
1396                 return false;
1397         if (!equal(a->schemaElts, b->schemaElts))
1398                 return false;
1399
1400         return true;
1401 }
1402
1403 static bool
1404 _equalAExpr(A_Expr *a, A_Expr *b)
1405 {
1406         if (a->oper != b->oper)
1407                 return false;
1408         if (!equal(a->name, b->name))
1409                 return false;
1410         if (!equal(a->lexpr, b->lexpr))
1411                 return false;
1412         if (!equal(a->rexpr, b->rexpr))
1413                 return false;
1414
1415         return true;
1416 }
1417
1418 static bool
1419 _equalColumnRef(ColumnRef *a, ColumnRef *b)
1420 {
1421         if (!equal(a->fields, b->fields))
1422                 return false;
1423         if (!equal(a->indirection, b->indirection))
1424                 return false;
1425
1426         return true;
1427 }
1428
1429 static bool
1430 _equalParamRef(ParamRef *a, ParamRef *b)
1431 {
1432         if (a->number != b->number)
1433                 return false;
1434         if (!equal(a->fields, b->fields))
1435                 return false;
1436         if (!equal(a->indirection, b->indirection))
1437                 return false;
1438
1439         return true;
1440 }
1441
1442 static bool
1443 _equalAConst(A_Const *a, A_Const *b)
1444 {
1445         if (!equal(&a->val, &b->val))
1446                 return false;
1447         if (!equal(a->typename, b->typename))
1448                 return false;
1449
1450         return true;
1451 }
1452
1453 static bool
1454 _equalIdent(Ident *a, Ident *b)
1455 {
1456         if (!equalstr(a->name, b->name))
1457                 return false;
1458
1459         return true;
1460 }
1461
1462 static bool
1463 _equalFuncCall(FuncCall *a, FuncCall *b)
1464 {
1465         if (!equal(a->funcname, b->funcname))
1466                 return false;
1467         if (!equal(a->args, b->args))
1468                 return false;
1469         if (a->agg_star != b->agg_star)
1470                 return false;
1471         if (a->agg_distinct != b->agg_distinct)
1472                 return false;
1473
1474         return true;
1475 }
1476
1477 static bool
1478 _equalAIndices(A_Indices *a, A_Indices *b)
1479 {
1480         if (!equal(a->lidx, b->lidx))
1481                 return false;
1482         if (!equal(a->uidx, b->uidx))
1483                 return false;
1484
1485         return true;
1486 }
1487
1488 static bool
1489 _equalExprFieldSelect(ExprFieldSelect *a, ExprFieldSelect *b)
1490 {
1491         if (!equal(a->arg, b->arg))
1492                 return false;
1493         if (!equal(a->fields, b->fields))
1494                 return false;
1495         if (!equal(a->indirection, b->indirection))
1496                 return false;
1497
1498         return true;
1499 }
1500
1501 static bool
1502 _equalResTarget(ResTarget *a, ResTarget *b)
1503 {
1504         if (!equalstr(a->name, b->name))
1505                 return false;
1506         if (!equal(a->indirection, b->indirection))
1507                 return false;
1508         if (!equal(a->val, b->val))
1509                 return false;
1510
1511         return true;
1512 }
1513
1514 static bool
1515 _equalTypeCast(TypeCast *a, TypeCast *b)
1516 {
1517         if (!equal(a->arg, b->arg))
1518                 return false;
1519         if (!equal(a->typename, b->typename))
1520                 return false;
1521
1522         return true;
1523 }
1524
1525 static bool
1526 _equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
1527 {
1528         if (!equal(a->useOp, b->useOp))
1529                 return false;
1530         if (!equal(a->node, b->node))
1531                 return false;
1532
1533         return true;
1534 }
1535
1536 static bool
1537 _equalAlias(Alias *a, Alias *b)
1538 {
1539         if (!equalstr(a->aliasname, b->aliasname))
1540                 return false;
1541         if (!equal(a->colnames, b->colnames))
1542                 return false;
1543
1544         return true;
1545 }
1546
1547 static bool
1548 _equalRangeVar(RangeVar *a, RangeVar *b)
1549 {
1550         if (!equalstr(a->catalogname, b->catalogname))
1551                 return false;
1552         if (!equalstr(a->schemaname, b->schemaname))
1553                 return false;
1554         if (!equalstr(a->relname, b->relname))
1555                 return false;
1556         if (a->inhOpt != b->inhOpt)
1557                 return false;
1558         if (a->istemp != b->istemp)
1559                 return false;
1560         if (!equal(a->alias, b->alias))
1561                 return false;
1562
1563         return true;
1564 }
1565
1566 static bool
1567 _equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
1568 {
1569         if (!equal(a->subquery, b->subquery))
1570                 return false;
1571         if (!equal(a->alias, b->alias))
1572                 return false;
1573
1574         return true;
1575 }
1576
1577 static bool
1578 _equalRangeFunction(RangeFunction *a, RangeFunction *b)
1579 {
1580         if (!equal(a->funccallnode, b->funccallnode))
1581                 return false;
1582         if (!equal(a->alias, b->alias))
1583                 return false;
1584
1585         return true;
1586 }
1587
1588 static bool
1589 _equalTypeName(TypeName *a, TypeName *b)
1590 {
1591         if (!equal(a->names, b->names))
1592                 return false;
1593         if (a->typeid != b->typeid)
1594                 return false;
1595         if (a->timezone != b->timezone)
1596                 return false;
1597         if (a->setof != b->setof)
1598                 return false;
1599         if (a->pct_type != b->pct_type)
1600                 return false;
1601         if (a->typmod != b->typmod)
1602                 return false;
1603         if (!equal(a->arrayBounds, b->arrayBounds))
1604                 return false;
1605
1606         return true;
1607 }
1608
1609 static bool
1610 _equalIndexElem(IndexElem *a, IndexElem *b)
1611 {
1612         if (!equalstr(a->name, b->name))
1613                 return false;
1614         if (!equal(a->funcname, b->funcname))
1615                 return false;
1616         if (!equal(a->args, b->args))
1617                 return false;
1618         if (!equal(a->opclass, b->opclass))
1619                 return false;
1620
1621         return true;
1622 }
1623
1624 static bool
1625 _equalColumnDef(ColumnDef *a, ColumnDef *b)
1626 {
1627         if (!equalstr(a->colname, b->colname))
1628                 return false;
1629         if (!equal(a->typename, b->typename))
1630                 return false;
1631         if (a->is_not_null != b->is_not_null)
1632                 return false;
1633         if (!equal(a->raw_default, b->raw_default))
1634                 return false;
1635         if (!equalstr(a->cooked_default, b->cooked_default))
1636                 return false;
1637         if (!equal(a->constraints, b->constraints))
1638                 return false;
1639         if (!equal(a->support, b->support))
1640                 return false;
1641
1642         return true;
1643 }
1644
1645 static bool
1646 _equalConstraint(Constraint *a, Constraint *b)
1647 {
1648         if (a->contype != b->contype)
1649                 return false;
1650         if (!equalstr(a->name, b->name))
1651                 return false;
1652         if (!equal(a->raw_expr, b->raw_expr))
1653                 return false;
1654         if (!equalstr(a->cooked_expr, b->cooked_expr))
1655                 return false;
1656         if (!equal(a->keys, b->keys))
1657                 return false;
1658
1659         return true;
1660 }
1661
1662 static bool
1663 _equalDefElem(DefElem *a, DefElem *b)
1664 {
1665         if (!equalstr(a->defname, b->defname))
1666                 return false;
1667         if (!equal(a->arg, b->arg))
1668                 return false;
1669
1670         return true;
1671 }
1672
1673 static bool
1674 _equalTargetEntry(TargetEntry *a, TargetEntry *b)
1675 {
1676         if (!equal(a->resdom, b->resdom))
1677                 return false;
1678         if (!equal(a->fjoin, b->fjoin))
1679                 return false;
1680         if (!equal(a->expr, b->expr))
1681                 return false;
1682
1683         return true;
1684 }
1685
1686 static bool
1687 _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
1688 {
1689         if (a->rtekind != b->rtekind)
1690                 return false;
1691         if (a->relid != b->relid)
1692                 return false;
1693         if (!equal(a->subquery, b->subquery))
1694                 return false;
1695         if (!equal(a->funcexpr, b->funcexpr))
1696                 return false;
1697         if (a->jointype != b->jointype)
1698                 return false;
1699         if (!equal(a->joinaliasvars, b->joinaliasvars))
1700                 return false;
1701         if (!equal(a->alias, b->alias))
1702                 return false;
1703         if (!equal(a->eref, b->eref))
1704                 return false;
1705         if (a->inh != b->inh)
1706                 return false;
1707         if (a->inFromCl != b->inFromCl)
1708                 return false;
1709         if (a->checkForRead != b->checkForRead)
1710                 return false;
1711         if (a->checkForWrite != b->checkForWrite)
1712                 return false;
1713         if (a->checkAsUser != b->checkAsUser)
1714                 return false;
1715
1716         return true;
1717 }
1718
1719 static bool
1720 _equalSortClause(SortClause *a, SortClause *b)
1721 {
1722         if (a->tleSortGroupRef != b->tleSortGroupRef)
1723                 return false;
1724         if (a->sortop != b->sortop)
1725                 return false;
1726
1727         return true;
1728 }
1729
1730 static bool
1731 _equalFkConstraint(FkConstraint *a, FkConstraint *b)
1732 {
1733         if (!equalstr(a->constr_name, b->constr_name))
1734                 return false;
1735         if (!equal(a->pktable, b->pktable))
1736                 return false;
1737         if (!equal(a->fk_attrs, b->fk_attrs))
1738                 return false;
1739         if (!equal(a->pk_attrs, b->pk_attrs))
1740                 return false;
1741         if (a->fk_matchtype != b->fk_matchtype)
1742                 return false;
1743         if (a->fk_upd_action != b->fk_upd_action)
1744                 return false;
1745         if (a->fk_del_action != b->fk_del_action)
1746                 return false;
1747         if (a->deferrable != b->deferrable)
1748                 return false;
1749         if (a->initdeferred != b->initdeferred)
1750                 return false;
1751         if (a->skip_validation != b->skip_validation)
1752                 return false;
1753
1754         return true;
1755 }
1756
1757 static bool
1758 _equalCaseExpr(CaseExpr *a, CaseExpr *b)
1759 {
1760         if (a->casetype != b->casetype)
1761                 return false;
1762         if (!equal(a->arg, b->arg))
1763                 return false;
1764         if (!equal(a->args, b->args))
1765                 return false;
1766         if (!equal(a->defresult, b->defresult))
1767                 return false;
1768
1769         return true;
1770 }
1771
1772 static bool
1773 _equalCaseWhen(CaseWhen *a, CaseWhen *b)
1774 {
1775         if (!equal(a->expr, b->expr))
1776                 return false;
1777         if (!equal(a->result, b->result))
1778                 return false;
1779
1780         return true;
1781 }
1782
1783 static bool
1784 _equalNullTest(NullTest *a, NullTest *b)
1785 {
1786         if (!equal(a->arg, b->arg))
1787                 return false;
1788         if (a->nulltesttype != b->nulltesttype)
1789                 return false;
1790         return true;
1791 }
1792
1793 static bool
1794 _equalBooleanTest(BooleanTest *a, BooleanTest *b)
1795 {
1796         if (!equal(a->arg, b->arg))
1797                 return false;
1798         if (a->booltesttype != b->booltesttype)
1799                 return false;
1800         return true;
1801 }
1802
1803 /*
1804  * Stuff from pg_list.h
1805  */
1806
1807 static bool
1808 _equalValue(Value *a, Value *b)
1809 {
1810         if (a->type != b->type)
1811                 return false;
1812
1813         switch (a->type)
1814         {
1815                 case T_Integer:
1816                         return a->val.ival == b->val.ival;
1817                 case T_Float:
1818                 case T_String:
1819                 case T_BitString:
1820                         return strcmp(a->val.str, b->val.str) == 0;
1821                 default:
1822                         break;
1823         }
1824
1825         return true;
1826 }
1827
1828 /*
1829  * equal
1830  *        returns whether two nodes are equal
1831  */
1832 bool
1833 equal(void *a, void *b)
1834 {
1835         bool            retval = false;
1836
1837         if (a == b)
1838                 return true;
1839
1840         /*
1841          * note that a!=b, so only one of them can be NULL
1842          */
1843         if (a == NULL || b == NULL)
1844                 return false;
1845
1846         /*
1847          * are they the same type of nodes?
1848          */
1849         if (nodeTag(a) != nodeTag(b))
1850                 return false;
1851
1852         switch (nodeTag(a))
1853         {
1854                 case T_SubPlan:
1855                         retval = _equalSubPlan(a, b);
1856                         break;
1857
1858                 case T_Resdom:
1859                         retval = _equalResdom(a, b);
1860                         break;
1861                 case T_Fjoin:
1862                         retval = _equalFjoin(a, b);
1863                         break;
1864                 case T_Expr:
1865                         retval = _equalExpr(a, b);
1866                         break;
1867                 case T_Var:
1868                         retval = _equalVar(a, b);
1869                         break;
1870                 case T_Oper:
1871                         retval = _equalOper(a, b);
1872                         break;
1873                 case T_Const:
1874                         retval = _equalConst(a, b);
1875                         break;
1876                 case T_Param:
1877                         retval = _equalParam(a, b);
1878                         break;
1879                 case T_Aggref:
1880                         retval = _equalAggref(a, b);
1881                         break;
1882                 case T_SubLink:
1883                         retval = _equalSubLink(a, b);
1884                         break;
1885                 case T_Func:
1886                         retval = _equalFunc(a, b);
1887                         break;
1888                 case T_FieldSelect:
1889                         retval = _equalFieldSelect(a, b);
1890                         break;
1891                 case T_ArrayRef:
1892                         retval = _equalArrayRef(a, b);
1893                         break;
1894                 case T_RelabelType:
1895                         retval = _equalRelabelType(a, b);
1896                         break;
1897                 case T_RangeTblRef:
1898                         retval = _equalRangeTblRef(a, b);
1899                         break;
1900                 case T_FromExpr:
1901                         retval = _equalFromExpr(a, b);
1902                         break;
1903                 case T_JoinExpr:
1904                         retval = _equalJoinExpr(a, b);
1905                         break;
1906
1907                 case T_RelOptInfo:
1908                         retval = _equalRelOptInfo(a, b);
1909                         break;
1910                 case T_Path:
1911                         retval = _equalPath(a, b);
1912                         break;
1913                 case T_IndexPath:
1914                         retval = _equalIndexPath(a, b);
1915                         break;
1916                 case T_NestPath:
1917                         retval = _equalNestPath(a, b);
1918                         break;
1919                 case T_MergePath:
1920                         retval = _equalMergePath(a, b);
1921                         break;
1922                 case T_HashPath:
1923                         retval = _equalHashPath(a, b);
1924                         break;
1925                 case T_PathKeyItem:
1926                         retval = _equalPathKeyItem(a, b);
1927                         break;
1928                 case T_RestrictInfo:
1929                         retval = _equalRestrictInfo(a, b);
1930                         break;
1931                 case T_JoinInfo:
1932                         retval = _equalJoinInfo(a, b);
1933                         break;
1934                 case T_Stream:
1935                         retval = _equalStream(a, b);
1936                         break;
1937                 case T_TidPath:
1938                         retval = _equalTidPath(a, b);
1939                         break;
1940                 case T_AppendPath:
1941                         retval = _equalAppendPath(a, b);
1942                         break;
1943                 case T_IndexOptInfo:
1944                         retval = _equalIndexOptInfo(a, b);
1945                         break;
1946
1947                 case T_List:
1948                         {
1949                                 List       *la = (List *) a;
1950                                 List       *lb = (List *) b;
1951                                 List       *l;
1952
1953                                 /*
1954                                  * Try to reject by length check before we grovel through
1955                                  * all the elements...
1956                                  */
1957                                 if (length(la) != length(lb))
1958                                         return false;
1959                                 foreach(l, la)
1960                                 {
1961                                         if (!equal(lfirst(l), lfirst(lb)))
1962                                                 return false;
1963                                         lb = lnext(lb);
1964                                 }
1965                                 retval = true;
1966                         }
1967                         break;
1968                 case T_Integer:
1969                 case T_Float:
1970                 case T_String:
1971                 case T_BitString:
1972                         retval = _equalValue(a, b);
1973                         break;
1974
1975                 case T_Query:
1976                         retval = _equalQuery(a, b);
1977                         break;
1978                 case T_InsertStmt:
1979                         retval = _equalInsertStmt(a, b);
1980                         break;
1981                 case T_DeleteStmt:
1982                         retval = _equalDeleteStmt(a, b);
1983                         break;
1984                 case T_UpdateStmt:
1985                         retval = _equalUpdateStmt(a, b);
1986                         break;
1987                 case T_SelectStmt:
1988                         retval = _equalSelectStmt(a, b);
1989                         break;
1990                 case T_SetOperationStmt:
1991                         retval = _equalSetOperationStmt(a, b);
1992                         break;
1993                 case T_AlterTableStmt:
1994                         retval = _equalAlterTableStmt(a, b);
1995                         break;
1996                 case T_GrantStmt:
1997                         retval = _equalGrantStmt(a, b);
1998                         break;
1999                 case T_ClosePortalStmt:
2000                         retval = _equalClosePortalStmt(a, b);
2001                         break;
2002                 case T_ClusterStmt:
2003                         retval = _equalClusterStmt(a, b);
2004                         break;
2005                 case T_CopyStmt:
2006                         retval = _equalCopyStmt(a, b);
2007                         break;
2008                 case T_CreateStmt:
2009                         retval = _equalCreateStmt(a, b);
2010                         break;
2011                 case T_DefineStmt:
2012                         retval = _equalDefineStmt(a, b);
2013                         break;
2014                 case T_DropStmt:
2015                         retval = _equalDropStmt(a, b);
2016                         break;
2017                 case T_TruncateStmt:
2018                         retval = _equalTruncateStmt(a, b);
2019                         break;
2020                 case T_CommentStmt:
2021                         retval = _equalCommentStmt(a, b);
2022                         break;
2023                 case T_FetchStmt:
2024                         retval = _equalFetchStmt(a, b);
2025                         break;
2026                 case T_IndexStmt:
2027                         retval = _equalIndexStmt(a, b);
2028                         break;
2029                 case T_CreateFunctionStmt:
2030                         retval = _equalCreateFunctionStmt(a, b);
2031                         break;
2032                 case T_RemoveAggrStmt:
2033                         retval = _equalRemoveAggrStmt(a, b);
2034                         break;
2035                 case T_RemoveFuncStmt:
2036                         retval = _equalRemoveFuncStmt(a, b);
2037                         break;
2038                 case T_RemoveOperStmt:
2039                         retval = _equalRemoveOperStmt(a, b);
2040                         break;
2041                 case T_RenameStmt:
2042                         retval = _equalRenameStmt(a, b);
2043                         break;
2044                 case T_RuleStmt:
2045                         retval = _equalRuleStmt(a, b);
2046                         break;
2047                 case T_NotifyStmt:
2048                         retval = _equalNotifyStmt(a, b);
2049                         break;
2050                 case T_ListenStmt:
2051                         retval = _equalListenStmt(a, b);
2052                         break;
2053                 case T_UnlistenStmt:
2054                         retval = _equalUnlistenStmt(a, b);
2055                         break;
2056                 case T_TransactionStmt:
2057                         retval = _equalTransactionStmt(a, b);
2058                         break;
2059                 case T_ViewStmt:
2060                         retval = _equalViewStmt(a, b);
2061                         break;
2062                 case T_LoadStmt:
2063                         retval = _equalLoadStmt(a, b);
2064                         break;
2065                 case T_CreateDomainStmt:
2066                         retval = _equalCreateDomainStmt(a, b);
2067                         break;
2068                 case T_CreatedbStmt:
2069                         retval = _equalCreatedbStmt(a, b);
2070                         break;
2071                 case T_AlterDatabaseSetStmt:
2072                         retval = _equalAlterDatabaseSetStmt(a, b);
2073                         break;
2074                 case T_DropdbStmt:
2075                         retval = _equalDropdbStmt(a, b);
2076                         break;
2077                 case T_VacuumStmt:
2078                         retval = _equalVacuumStmt(a, b);
2079                         break;
2080                 case T_ExplainStmt:
2081                         retval = _equalExplainStmt(a, b);
2082                         break;
2083                 case T_CreateSeqStmt:
2084                         retval = _equalCreateSeqStmt(a, b);
2085                         break;
2086                 case T_VariableSetStmt:
2087                         retval = _equalVariableSetStmt(a, b);
2088                         break;
2089                 case T_VariableShowStmt:
2090                         retval = _equalVariableShowStmt(a, b);
2091                         break;
2092                 case T_VariableResetStmt:
2093                         retval = _equalVariableResetStmt(a, b);
2094                         break;
2095                 case T_CreateTrigStmt:
2096                         retval = _equalCreateTrigStmt(a, b);
2097                         break;
2098                 case T_DropPropertyStmt:
2099                         retval = _equalDropPropertyStmt(a, b);
2100                         break;
2101                 case T_CreatePLangStmt:
2102                         retval = _equalCreatePLangStmt(a, b);
2103                         break;
2104                 case T_DropPLangStmt:
2105                         retval = _equalDropPLangStmt(a, b);
2106                         break;
2107                 case T_CreateUserStmt:
2108                         retval = _equalCreateUserStmt(a, b);
2109                         break;
2110                 case T_AlterUserStmt:
2111                         retval = _equalAlterUserStmt(a, b);
2112                         break;
2113                 case T_AlterUserSetStmt:
2114                         retval = _equalAlterUserSetStmt(a, b);
2115                         break;
2116                 case T_DropUserStmt:
2117                         retval = _equalDropUserStmt(a, b);
2118                         break;
2119                 case T_LockStmt:
2120                         retval = _equalLockStmt(a, b);
2121                         break;
2122                 case T_ConstraintsSetStmt:
2123                         retval = _equalConstraintsSetStmt(a, b);
2124                         break;
2125                 case T_CreateGroupStmt:
2126                         retval = _equalCreateGroupStmt(a, b);
2127                         break;
2128                 case T_AlterGroupStmt:
2129                         retval = _equalAlterGroupStmt(a, b);
2130                         break;
2131                 case T_DropGroupStmt:
2132                         retval = _equalDropGroupStmt(a, b);
2133                         break;
2134                 case T_ReindexStmt:
2135                         retval = _equalReindexStmt(a, b);
2136                         break;
2137                 case T_CheckPointStmt:
2138                         retval = true;
2139                         break;
2140                 case T_CreateSchemaStmt:
2141                         retval = _equalCreateSchemaStmt(a, b);
2142                         break;
2143
2144                 case T_A_Expr:
2145                         retval = _equalAExpr(a, b);
2146                         break;
2147                 case T_ColumnRef:
2148                         retval = _equalColumnRef(a, b);
2149                         break;
2150                 case T_ParamRef:
2151                         retval = _equalParamRef(a, b);
2152                         break;
2153                 case T_A_Const:
2154                         retval = _equalAConst(a, b);
2155                         break;
2156                 case T_Ident:
2157                         retval = _equalIdent(a, b);
2158                         break;
2159                 case T_FuncCall:
2160                         retval = _equalFuncCall(a, b);
2161                         break;
2162                 case T_A_Indices:
2163                         retval = _equalAIndices(a, b);
2164                         break;
2165                 case T_ExprFieldSelect:
2166                         retval = _equalExprFieldSelect(a, b);
2167                         break;
2168                 case T_ResTarget:
2169                         retval = _equalResTarget(a, b);
2170                         break;
2171                 case T_TypeCast:
2172                         retval = _equalTypeCast(a, b);
2173                         break;
2174                 case T_SortGroupBy:
2175                         retval = _equalSortGroupBy(a, b);
2176                         break;
2177                 case T_Alias:
2178                         retval = _equalAlias(a, b);
2179                         break;
2180                 case T_RangeVar:
2181                         retval = _equalRangeVar(a, b);
2182                         break;
2183                 case T_RangeSubselect:
2184                         retval = _equalRangeSubselect(a, b);
2185                         break;
2186                 case T_RangeFunction:
2187                         retval = _equalRangeFunction(a, b);
2188                         break;
2189                 case T_TypeName:
2190                         retval = _equalTypeName(a, b);
2191                         break;
2192                 case T_IndexElem:
2193                         retval = _equalIndexElem(a, b);
2194                         break;
2195                 case T_ColumnDef:
2196                         retval = _equalColumnDef(a, b);
2197                         break;
2198                 case T_Constraint:
2199                         retval = _equalConstraint(a, b);
2200                         break;
2201                 case T_DefElem:
2202                         retval = _equalDefElem(a, b);
2203                         break;
2204                 case T_TargetEntry:
2205                         retval = _equalTargetEntry(a, b);
2206                         break;
2207                 case T_RangeTblEntry:
2208                         retval = _equalRangeTblEntry(a, b);
2209                         break;
2210                 case T_SortClause:
2211                         retval = _equalSortClause(a, b);
2212                         break;
2213                 case T_GroupClause:
2214                         /* GroupClause is equivalent to SortClause */
2215                         retval = _equalSortClause(a, b);
2216                         break;
2217                 case T_CaseExpr:
2218                         retval = _equalCaseExpr(a, b);
2219                         break;
2220                 case T_CaseWhen:
2221                         retval = _equalCaseWhen(a, b);
2222                         break;
2223                 case T_NullTest:
2224                         retval = _equalNullTest(a, b);
2225                         break;
2226                 case T_BooleanTest:
2227                         retval = _equalBooleanTest(a, b);
2228                         break;
2229                 case T_FkConstraint:
2230                         retval = _equalFkConstraint(a, b);
2231                         break;
2232                 case T_PrivGrantee:
2233                         retval = _equalPrivGrantee(a, b);
2234                         break;
2235                 case T_FuncWithArgs:
2236                         retval = _equalFuncWithArgs(a, b);
2237                         break;
2238                 case T_InsertDefault:
2239                         retval = _equalInsertDefault(a, b);
2240                         break;
2241
2242                 default:
2243                         elog(WARNING, "equal: don't know whether nodes of type %d are equal",
2244                                  nodeTag(a));
2245                         break;
2246         }
2247
2248         return retval;
2249 }