]> granicus.if.org Git - postgresql/blob - src/backend/nodes/equalfuncs.c
Change CREATE DATABASE to use DefElem instead of constructing structure
[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-2001, 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.136 2002/06/18 17:27:57 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 (a->binary != b->binary)
803                 return false;
804         if (!equal(a->relation, b->relation))
805                 return false;
806         if (a->oids != b->oids)
807                 return false;
808         if (a->direction != b->direction)
809                 return false;
810         if (!equalstr(a->filename, b->filename))
811                 return false;
812         if (!equalstr(a->delimiter, b->delimiter))
813                 return false;
814         if (!equalstr(a->null_print, b->null_print))
815                 return false;
816
817         return true;
818 }
819
820 static bool
821 _equalCreateStmt(CreateStmt *a, CreateStmt *b)
822 {
823         if (!equal(a->relation, b->relation))
824                 return false;
825         if (!equal(a->tableElts, b->tableElts))
826                 return false;
827         if (!equal(a->inhRelations, b->inhRelations))
828                 return false;
829         if (!equal(a->constraints, b->constraints))
830                 return false;
831         if (a->hasoids != b->hasoids)
832                 return false;
833
834         return true;
835 }
836
837 static bool
838 _equalDefineStmt(DefineStmt *a, DefineStmt *b)
839 {
840         if (a->defType != b->defType)
841                 return false;
842         if (!equal(a->defnames, b->defnames))
843                 return false;
844         if (!equal(a->definition, b->definition))
845                 return false;
846
847         return true;
848 }
849
850 static bool
851 _equalDropStmt(DropStmt *a, DropStmt *b)
852 {
853         if (!equal(a->objects, b->objects))
854                 return false;
855         if (a->removeType != b->removeType)
856                 return false;
857         if (a->behavior != b->behavior)
858                 return false;
859
860         return true;
861 }
862
863 static bool
864 _equalTruncateStmt(TruncateStmt *a, TruncateStmt *b)
865 {
866         if (!equal(a->relation, b->relation))
867                 return false;
868
869         return true;
870 }
871
872 static bool
873 _equalCommentStmt(CommentStmt *a, CommentStmt *b)
874 {
875         if (a->objtype != b->objtype)
876                 return false;
877         if (!equal(a->objname, b->objname))
878                 return false;
879         if (!equal(a->objargs, b->objargs))
880                 return false;
881         if (!equalstr(a->comment, b->comment))
882                 return false;
883
884         return true;
885 }
886
887 static bool
888 _equalFetchStmt(FetchStmt *a, FetchStmt *b)
889 {
890         if (a->direction != b->direction)
891                 return false;
892         if (a->howMany != b->howMany)
893                 return false;
894         if (!equalstr(a->portalname, b->portalname))
895                 return false;
896         if (a->ismove != b->ismove)
897                 return false;
898
899         return true;
900 }
901
902 static bool
903 _equalIndexStmt(IndexStmt *a, IndexStmt *b)
904 {
905         if (!equalstr(a->idxname, b->idxname))
906                 return false;
907         if (!equal(a->relation, b->relation))
908                 return false;
909         if (!equalstr(a->accessMethod, b->accessMethod))
910                 return false;
911         if (!equal(a->indexParams, b->indexParams))
912                 return false;
913         if (!equal(a->whereClause, b->whereClause))
914                 return false;
915         if (!equal(a->rangetable, b->rangetable))
916                 return false;
917         if (a->unique != b->unique)
918                 return false;
919         if (a->primary != b->primary)
920                 return false;
921
922         return true;
923 }
924
925 static bool
926 _equalCreateFunctionStmt(CreateFunctionStmt *a, CreateFunctionStmt *b)
927 {
928         if (a->replace != b->replace)
929                 return false;
930         if (!equal(a->funcname, b->funcname))
931                 return false;
932         if (!equal(a->argTypes, b->argTypes))
933                 return false;
934         if (!equal(a->returnType, b->returnType))
935                 return false;
936         if (!equal(a->options, b->options))
937                 return false;
938         if (!equal(a->withClause, b->withClause))
939                 return false;
940
941         return true;
942 }
943
944 static bool
945 _equalRemoveAggrStmt(RemoveAggrStmt *a, RemoveAggrStmt *b)
946 {
947         if (!equal(a->aggname, b->aggname))
948                 return false;
949         if (!equal(a->aggtype, b->aggtype))
950                 return false;
951
952         return true;
953 }
954
955 static bool
956 _equalRemoveFuncStmt(RemoveFuncStmt *a, RemoveFuncStmt *b)
957 {
958         if (!equal(a->funcname, b->funcname))
959                 return false;
960         if (!equal(a->args, b->args))
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
974         return true;
975 }
976
977
978 static bool
979 _equalRenameStmt(RenameStmt *a, RenameStmt *b)
980 {
981         if (!equal(a->relation, b->relation))
982                 return false;
983         if (!equalstr(a->oldname, b->oldname))
984                 return false;
985         if (!equalstr(a->newname, b->newname))
986                 return false;
987         if (a->renameType != b->renameType)
988                 return false;
989
990         return true;
991 }
992
993 static bool
994 _equalRuleStmt(RuleStmt *a, RuleStmt *b)
995 {
996         if (!equal(a->relation, b->relation))
997                 return false;
998         if (!equalstr(a->rulename, b->rulename))
999                 return false;
1000         if (!equal(a->whereClause, b->whereClause))
1001                 return false;
1002         if (a->event != b->event)
1003                 return false;
1004         if (a->instead != b->instead)
1005                 return false;
1006         if (!equal(a->actions, b->actions))
1007                 return false;
1008
1009         return true;
1010 }
1011
1012 static bool
1013 _equalNotifyStmt(NotifyStmt *a, NotifyStmt *b)
1014 {
1015         if (!equal(a->relation, b->relation))
1016                 return false;
1017
1018         return true;
1019 }
1020
1021 static bool
1022 _equalListenStmt(ListenStmt *a, ListenStmt *b)
1023 {
1024         if (!equal(a->relation, b->relation))
1025                 return false;
1026
1027         return true;
1028 }
1029
1030 static bool
1031 _equalUnlistenStmt(UnlistenStmt *a, UnlistenStmt *b)
1032 {
1033         if (!equal(a->relation, b->relation))
1034                 return false;
1035
1036         return true;
1037 }
1038
1039 static bool
1040 _equalTransactionStmt(TransactionStmt *a, TransactionStmt *b)
1041 {
1042         if (a->command != b->command)
1043                 return false;
1044
1045         return true;
1046 }
1047
1048 static bool
1049 _equalViewStmt(ViewStmt *a, ViewStmt *b)
1050 {
1051         if (!equal(a->view, b->view))
1052                 return false;
1053         if (!equal(a->aliases, b->aliases))
1054                 return false;
1055         if (!equal(a->query, b->query))
1056                 return false;
1057
1058         return true;
1059 }
1060
1061 static bool
1062 _equalLoadStmt(LoadStmt *a, LoadStmt *b)
1063 {
1064         if (!equalstr(a->filename, b->filename))
1065                 return false;
1066
1067         return true;
1068 }
1069
1070 static bool
1071 _equalCreateDomainStmt(CreateDomainStmt *a, CreateDomainStmt *b)
1072 {
1073         if (!equal(a->domainname, b->domainname))
1074                 return false;
1075         if (!equal(a->typename, b->typename))
1076                 return false;
1077         if (!equal(a->constraints, b->constraints))
1078                 return false;
1079
1080         return true;
1081 }
1082
1083 static bool
1084 _equalCreatedbStmt(CreatedbStmt *a, CreatedbStmt *b)
1085 {
1086         if (!equalstr(a->dbname, b->dbname))
1087                 return false;
1088         if (!equal(a->options, b->options))
1089                 return false;
1090
1091         return true;
1092 }
1093
1094 static bool
1095 _equalAlterDatabaseSetStmt(AlterDatabaseSetStmt *a, AlterDatabaseSetStmt *b)
1096 {
1097         if (!equalstr(a->dbname, b->dbname))
1098                 return false;
1099         if (!equalstr(a->variable, b->variable))
1100                 return false;
1101         if (!equal(a->value, b->value))
1102                 return false;
1103
1104         return true;
1105 }
1106
1107 static bool
1108 _equalDropdbStmt(DropdbStmt *a, DropdbStmt *b)
1109 {
1110         if (!equalstr(a->dbname, b->dbname))
1111                 return false;
1112
1113         return true;
1114 }
1115
1116 static bool
1117 _equalVacuumStmt(VacuumStmt *a, VacuumStmt *b)
1118 {
1119         if (a->vacuum != b->vacuum)
1120                 return false;
1121         if (a->full != b->full)
1122                 return false;
1123         if (a->analyze != b->analyze)
1124                 return false;
1125         if (a->freeze != b->freeze)
1126                 return false;
1127         if (a->verbose != b->verbose)
1128                 return false;
1129         if (!equal(a->relation, b->relation))
1130                 return false;
1131         if (!equal(a->va_cols, b->va_cols))
1132                 return false;
1133
1134         return true;
1135 }
1136
1137 static bool
1138 _equalExplainStmt(ExplainStmt *a, ExplainStmt *b)
1139 {
1140         if (!equal(a->query, b->query))
1141                 return false;
1142         if (a->verbose != b->verbose)
1143                 return false;
1144         if (a->analyze != b->analyze)
1145                 return false;
1146
1147         return true;
1148 }
1149
1150 static bool
1151 _equalCreateSeqStmt(CreateSeqStmt *a, CreateSeqStmt *b)
1152 {
1153         if (!equal(a->sequence, b->sequence))
1154                 return false;
1155         if (!equal(a->options, b->options))
1156                 return false;
1157
1158         return true;
1159 }
1160
1161 static bool
1162 _equalVariableSetStmt(VariableSetStmt *a, VariableSetStmt *b)
1163 {
1164         if (!equalstr(a->name, b->name))
1165                 return false;
1166         if (!equal(a->args, b->args))
1167                 return false;
1168         if (a->is_local != b->is_local)
1169                 return false;
1170
1171         return true;
1172 }
1173
1174 static bool
1175 _equalVariableShowStmt(VariableShowStmt *a, VariableShowStmt *b)
1176 {
1177         if (!equalstr(a->name, b->name))
1178                 return false;
1179
1180         return true;
1181 }
1182
1183 static bool
1184 _equalVariableResetStmt(VariableResetStmt *a, VariableResetStmt *b)
1185 {
1186         if (!equalstr(a->name, b->name))
1187                 return false;
1188
1189         return true;
1190 }
1191
1192 static bool
1193 _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
1194 {
1195         if (!equalstr(a->trigname, b->trigname))
1196                 return false;
1197         if (!equal(a->relation, b->relation))
1198                 return false;
1199         if (!equal(a->funcname, b->funcname))
1200                 return false;
1201         if (!equal(a->args, b->args))
1202                 return false;
1203         if (a->before != b->before)
1204                 return false;
1205         if (a->row != b->row)
1206                 return false;
1207         if (strcmp(a->actions, b->actions) != 0)
1208                 return false;
1209         if (!equalstr(a->lang, b->lang))
1210                 return false;
1211         if (!equalstr(a->text, b->text))
1212                 return false;
1213         if (!equal(a->attr, b->attr))
1214                 return false;
1215         if (!equalstr(a->when, b->when))
1216                 return false;
1217         if (a->isconstraint != b->isconstraint)
1218                 return false;
1219         if (a->deferrable != b->deferrable)
1220                 return false;
1221         if (a->initdeferred != b->initdeferred)
1222                 return false;
1223         if (!equal(a->constrrel, b->constrrel))
1224                 return false;
1225
1226         return true;
1227 }
1228
1229 static bool
1230 _equalDropPropertyStmt(DropPropertyStmt *a, DropPropertyStmt *b)
1231 {
1232         if (!equal(a->relation, b->relation))
1233                 return false;
1234         if (!equalstr(a->property, b->property))
1235                 return false;
1236         if (a->removeType != b->removeType)
1237                 return false;
1238
1239         return true;
1240 }
1241
1242 static bool
1243 _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
1244 {
1245         if (!equalstr(a->plname, b->plname))
1246                 return false;
1247         if (!equal(a->plhandler, b->plhandler))
1248                 return false;
1249         if (!equal(a->plvalidator, b->plvalidator))
1250                 return false;
1251         if (!equalstr(a->plcompiler, b->plcompiler))
1252                 return false;
1253         if (a->pltrusted != b->pltrusted)
1254                 return false;
1255
1256         return true;
1257 }
1258
1259 static bool
1260 _equalDropPLangStmt(DropPLangStmt *a, DropPLangStmt *b)
1261 {
1262         if (!equalstr(a->plname, b->plname))
1263                 return false;
1264
1265         return true;
1266 }
1267
1268 static bool
1269 _equalCreateUserStmt(CreateUserStmt *a, CreateUserStmt *b)
1270 {
1271         if (!equalstr(a->user, b->user))
1272                 return false;
1273         if (!equal(a->options, b->options))
1274                 return false;
1275
1276         return true;
1277 }
1278
1279 static bool
1280 _equalAlterUserStmt(AlterUserStmt *a, AlterUserStmt *b)
1281 {
1282         if (!equalstr(a->user, b->user))
1283                 return false;
1284         if (!equal(a->options, b->options))
1285                 return false;
1286
1287         return true;
1288 }
1289
1290 static bool
1291 _equalAlterUserSetStmt(AlterUserSetStmt *a, AlterUserSetStmt *b)
1292 {
1293         if (!equalstr(a->user, b->user))
1294                 return false;
1295         if (!equalstr(a->variable, b->variable))
1296                 return false;
1297         if (!equal(a->value, b->value))
1298                 return false;
1299
1300         return true;
1301 }
1302
1303 static bool
1304 _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
1305 {
1306         if (!equal(a->users, b->users))
1307                 return false;
1308
1309         return true;
1310 }
1311
1312 static bool
1313 _equalLockStmt(LockStmt *a, LockStmt *b)
1314 {
1315         if (!equal(a->relations, b->relations))
1316                 return false;
1317         if (a->mode != b->mode)
1318                 return false;
1319
1320         return true;
1321 }
1322
1323 static bool
1324 _equalConstraintsSetStmt(ConstraintsSetStmt *a, ConstraintsSetStmt *b)
1325 {
1326         if (!equal(a->constraints, b->constraints))
1327                 return false;
1328         if (a->deferred != b->deferred)
1329                 return false;
1330
1331         return true;
1332 }
1333
1334 static bool
1335 _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
1336 {
1337         if (!equalstr(a->name, b->name))
1338                 return false;
1339         if (!equal(a->options, b->options))
1340                 return false;
1341
1342         return true;
1343 }
1344
1345 static bool
1346 _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
1347 {
1348         if (!equalstr(a->name, b->name))
1349                 return false;
1350         if (a->action != b->action)
1351                 return false;
1352         if (!equal(a->listUsers, b->listUsers))
1353                 return false;
1354
1355         return true;
1356 }
1357
1358 static bool
1359 _equalDropGroupStmt(DropGroupStmt *a, DropGroupStmt *b)
1360 {
1361         if (!equalstr(a->name, b->name))
1362                 return false;
1363
1364         return true;
1365 }
1366
1367 static bool
1368 _equalReindexStmt(ReindexStmt *a, ReindexStmt *b)
1369 {
1370         if (a->reindexType != b->reindexType)
1371                 return false;
1372         if (!equal(a->relation, b->relation))
1373                 return false;
1374         if (!equalstr(a->name, b->name))
1375                 return false;
1376         if (a->force != b->force)
1377                 return false;
1378         if (a->all != b->all)
1379                 return false;
1380
1381         return true;
1382 }
1383
1384 static bool
1385 _equalCreateSchemaStmt(CreateSchemaStmt *a, CreateSchemaStmt *b)
1386 {
1387         if (!equalstr(a->schemaname, b->schemaname))
1388                 return false;
1389         if (!equalstr(a->authid, b->authid))
1390                 return false;
1391         if (!equal(a->schemaElts, b->schemaElts))
1392                 return false;
1393
1394         return true;
1395 }
1396
1397 static bool
1398 _equalAExpr(A_Expr *a, A_Expr *b)
1399 {
1400         if (a->oper != b->oper)
1401                 return false;
1402         if (!equal(a->name, b->name))
1403                 return false;
1404         if (!equal(a->lexpr, b->lexpr))
1405                 return false;
1406         if (!equal(a->rexpr, b->rexpr))
1407                 return false;
1408
1409         return true;
1410 }
1411
1412 static bool
1413 _equalColumnRef(ColumnRef *a, ColumnRef *b)
1414 {
1415         if (!equal(a->fields, b->fields))
1416                 return false;
1417         if (!equal(a->indirection, b->indirection))
1418                 return false;
1419
1420         return true;
1421 }
1422
1423 static bool
1424 _equalParamRef(ParamRef *a, ParamRef *b)
1425 {
1426         if (a->number != b->number)
1427                 return false;
1428         if (!equal(a->fields, b->fields))
1429                 return false;
1430         if (!equal(a->indirection, b->indirection))
1431                 return false;
1432
1433         return true;
1434 }
1435
1436 static bool
1437 _equalAConst(A_Const *a, A_Const *b)
1438 {
1439         if (!equal(&a->val, &b->val))
1440                 return false;
1441         if (!equal(a->typename, b->typename))
1442                 return false;
1443
1444         return true;
1445 }
1446
1447 static bool
1448 _equalIdent(Ident *a, Ident *b)
1449 {
1450         if (!equalstr(a->name, b->name))
1451                 return false;
1452
1453         return true;
1454 }
1455
1456 static bool
1457 _equalFuncCall(FuncCall *a, FuncCall *b)
1458 {
1459         if (!equal(a->funcname, b->funcname))
1460                 return false;
1461         if (!equal(a->args, b->args))
1462                 return false;
1463         if (a->agg_star != b->agg_star)
1464                 return false;
1465         if (a->agg_distinct != b->agg_distinct)
1466                 return false;
1467
1468         return true;
1469 }
1470
1471 static bool
1472 _equalAIndices(A_Indices *a, A_Indices *b)
1473 {
1474         if (!equal(a->lidx, b->lidx))
1475                 return false;
1476         if (!equal(a->uidx, b->uidx))
1477                 return false;
1478
1479         return true;
1480 }
1481
1482 static bool
1483 _equalExprFieldSelect(ExprFieldSelect *a, ExprFieldSelect *b)
1484 {
1485         if (!equal(a->arg, b->arg))
1486                 return false;
1487         if (!equal(a->fields, b->fields))
1488                 return false;
1489         if (!equal(a->indirection, b->indirection))
1490                 return false;
1491
1492         return true;
1493 }
1494
1495 static bool
1496 _equalResTarget(ResTarget *a, ResTarget *b)
1497 {
1498         if (!equalstr(a->name, b->name))
1499                 return false;
1500         if (!equal(a->indirection, b->indirection))
1501                 return false;
1502         if (!equal(a->val, b->val))
1503                 return false;
1504
1505         return true;
1506 }
1507
1508 static bool
1509 _equalTypeCast(TypeCast *a, TypeCast *b)
1510 {
1511         if (!equal(a->arg, b->arg))
1512                 return false;
1513         if (!equal(a->typename, b->typename))
1514                 return false;
1515
1516         return true;
1517 }
1518
1519 static bool
1520 _equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
1521 {
1522         if (!equal(a->useOp, b->useOp))
1523                 return false;
1524         if (!equal(a->node, b->node))
1525                 return false;
1526
1527         return true;
1528 }
1529
1530 static bool
1531 _equalAlias(Alias *a, Alias *b)
1532 {
1533         if (!equalstr(a->aliasname, b->aliasname))
1534                 return false;
1535         if (!equal(a->colnames, b->colnames))
1536                 return false;
1537
1538         return true;
1539 }
1540
1541 static bool
1542 _equalRangeVar(RangeVar *a, RangeVar *b)
1543 {
1544         if (!equalstr(a->catalogname, b->catalogname))
1545                 return false;
1546         if (!equalstr(a->schemaname, b->schemaname))
1547                 return false;
1548         if (!equalstr(a->relname, b->relname))
1549                 return false;
1550         if (a->inhOpt != b->inhOpt)
1551                 return false;
1552         if (a->istemp != b->istemp)
1553                 return false;
1554         if (!equal(a->alias, b->alias))
1555                 return false;
1556
1557         return true;
1558 }
1559
1560 static bool
1561 _equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
1562 {
1563         if (!equal(a->subquery, b->subquery))
1564                 return false;
1565         if (!equal(a->alias, b->alias))
1566                 return false;
1567
1568         return true;
1569 }
1570
1571 static bool
1572 _equalRangeFunction(RangeFunction *a, RangeFunction *b)
1573 {
1574         if (!equal(a->funccallnode, b->funccallnode))
1575                 return false;
1576         if (!equal(a->alias, b->alias))
1577                 return false;
1578
1579         return true;
1580 }
1581
1582 static bool
1583 _equalTypeName(TypeName *a, TypeName *b)
1584 {
1585         if (!equal(a->names, b->names))
1586                 return false;
1587         if (a->typeid != b->typeid)
1588                 return false;
1589         if (a->timezone != b->timezone)
1590                 return false;
1591         if (a->setof != b->setof)
1592                 return false;
1593         if (a->pct_type != b->pct_type)
1594                 return false;
1595         if (a->typmod != b->typmod)
1596                 return false;
1597         if (!equal(a->arrayBounds, b->arrayBounds))
1598                 return false;
1599
1600         return true;
1601 }
1602
1603 static bool
1604 _equalIndexElem(IndexElem *a, IndexElem *b)
1605 {
1606         if (!equalstr(a->name, b->name))
1607                 return false;
1608         if (!equal(a->funcname, b->funcname))
1609                 return false;
1610         if (!equal(a->args, b->args))
1611                 return false;
1612         if (!equal(a->opclass, b->opclass))
1613                 return false;
1614
1615         return true;
1616 }
1617
1618 static bool
1619 _equalColumnDef(ColumnDef *a, ColumnDef *b)
1620 {
1621         if (!equalstr(a->colname, b->colname))
1622                 return false;
1623         if (!equal(a->typename, b->typename))
1624                 return false;
1625         if (a->is_not_null != b->is_not_null)
1626                 return false;
1627         if (!equal(a->raw_default, b->raw_default))
1628                 return false;
1629         if (!equalstr(a->cooked_default, b->cooked_default))
1630                 return false;
1631         if (!equal(a->constraints, b->constraints))
1632                 return false;
1633
1634         return true;
1635 }
1636
1637 static bool
1638 _equalConstraint(Constraint *a, Constraint *b)
1639 {
1640         if (a->contype != b->contype)
1641                 return false;
1642         if (!equalstr(a->name, b->name))
1643                 return false;
1644         if (!equal(a->raw_expr, b->raw_expr))
1645                 return false;
1646         if (!equalstr(a->cooked_expr, b->cooked_expr))
1647                 return false;
1648         if (!equal(a->keys, b->keys))
1649                 return false;
1650
1651         return true;
1652 }
1653
1654 static bool
1655 _equalDefElem(DefElem *a, DefElem *b)
1656 {
1657         if (!equalstr(a->defname, b->defname))
1658                 return false;
1659         if (!equal(a->arg, b->arg))
1660                 return false;
1661
1662         return true;
1663 }
1664
1665 static bool
1666 _equalTargetEntry(TargetEntry *a, TargetEntry *b)
1667 {
1668         if (!equal(a->resdom, b->resdom))
1669                 return false;
1670         if (!equal(a->fjoin, b->fjoin))
1671                 return false;
1672         if (!equal(a->expr, b->expr))
1673                 return false;
1674
1675         return true;
1676 }
1677
1678 static bool
1679 _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
1680 {
1681         if (a->rtekind != b->rtekind)
1682                 return false;
1683         if (a->relid != b->relid)
1684                 return false;
1685         if (!equal(a->subquery, b->subquery))
1686                 return false;
1687         if (!equal(a->funcexpr, b->funcexpr))
1688                 return false;
1689         if (a->jointype != b->jointype)
1690                 return false;
1691         if (!equal(a->joinaliasvars, b->joinaliasvars))
1692                 return false;
1693         if (!equal(a->alias, b->alias))
1694                 return false;
1695         if (!equal(a->eref, b->eref))
1696                 return false;
1697         if (a->inh != b->inh)
1698                 return false;
1699         if (a->inFromCl != b->inFromCl)
1700                 return false;
1701         if (a->checkForRead != b->checkForRead)
1702                 return false;
1703         if (a->checkForWrite != b->checkForWrite)
1704                 return false;
1705         if (a->checkAsUser != b->checkAsUser)
1706                 return false;
1707
1708         return true;
1709 }
1710
1711 static bool
1712 _equalSortClause(SortClause *a, SortClause *b)
1713 {
1714         if (a->tleSortGroupRef != b->tleSortGroupRef)
1715                 return false;
1716         if (a->sortop != b->sortop)
1717                 return false;
1718
1719         return true;
1720 }
1721
1722 static bool
1723 _equalFkConstraint(FkConstraint *a, FkConstraint *b)
1724 {
1725         if (!equalstr(a->constr_name, b->constr_name))
1726                 return false;
1727         if (!equal(a->pktable, b->pktable))
1728                 return false;
1729         if (!equal(a->fk_attrs, b->fk_attrs))
1730                 return false;
1731         if (!equal(a->pk_attrs, b->pk_attrs))
1732                 return false;
1733         if (!equalstr(a->match_type, b->match_type))
1734                 return false;
1735         if (a->actions != b->actions)
1736                 return false;
1737         if (a->deferrable != b->deferrable)
1738                 return false;
1739         if (a->initdeferred != b->initdeferred)
1740                 return false;
1741
1742         return true;
1743 }
1744
1745 static bool
1746 _equalCaseExpr(CaseExpr *a, CaseExpr *b)
1747 {
1748         if (a->casetype != b->casetype)
1749                 return false;
1750         if (!equal(a->arg, b->arg))
1751                 return false;
1752         if (!equal(a->args, b->args))
1753                 return false;
1754         if (!equal(a->defresult, b->defresult))
1755                 return false;
1756
1757         return true;
1758 }
1759
1760 static bool
1761 _equalCaseWhen(CaseWhen *a, CaseWhen *b)
1762 {
1763         if (!equal(a->expr, b->expr))
1764                 return false;
1765         if (!equal(a->result, b->result))
1766                 return false;
1767
1768         return true;
1769 }
1770
1771 static bool
1772 _equalNullTest(NullTest *a, NullTest *b)
1773 {
1774         if (!equal(a->arg, b->arg))
1775                 return false;
1776         if (a->nulltesttype != b->nulltesttype)
1777                 return false;
1778         return true;
1779 }
1780
1781 static bool
1782 _equalBooleanTest(BooleanTest *a, BooleanTest *b)
1783 {
1784         if (!equal(a->arg, b->arg))
1785                 return false;
1786         if (a->booltesttype != b->booltesttype)
1787                 return false;
1788         return true;
1789 }
1790
1791 /*
1792  * Stuff from pg_list.h
1793  */
1794
1795 static bool
1796 _equalValue(Value *a, Value *b)
1797 {
1798         if (a->type != b->type)
1799                 return false;
1800
1801         switch (a->type)
1802         {
1803                 case T_Integer:
1804                         return a->val.ival == b->val.ival;
1805                 case T_Float:
1806                 case T_String:
1807                 case T_BitString:
1808                         return strcmp(a->val.str, b->val.str) == 0;
1809                 default:
1810                         break;
1811         }
1812
1813         return true;
1814 }
1815
1816 /*
1817  * equal
1818  *        returns whether two nodes are equal
1819  */
1820 bool
1821 equal(void *a, void *b)
1822 {
1823         bool            retval = false;
1824
1825         if (a == b)
1826                 return true;
1827
1828         /*
1829          * note that a!=b, so only one of them can be NULL
1830          */
1831         if (a == NULL || b == NULL)
1832                 return false;
1833
1834         /*
1835          * are they the same type of nodes?
1836          */
1837         if (nodeTag(a) != nodeTag(b))
1838                 return false;
1839
1840         switch (nodeTag(a))
1841         {
1842                 case T_SubPlan:
1843                         retval = _equalSubPlan(a, b);
1844                         break;
1845
1846                 case T_Resdom:
1847                         retval = _equalResdom(a, b);
1848                         break;
1849                 case T_Fjoin:
1850                         retval = _equalFjoin(a, b);
1851                         break;
1852                 case T_Expr:
1853                         retval = _equalExpr(a, b);
1854                         break;
1855                 case T_Var:
1856                         retval = _equalVar(a, b);
1857                         break;
1858                 case T_Oper:
1859                         retval = _equalOper(a, b);
1860                         break;
1861                 case T_Const:
1862                         retval = _equalConst(a, b);
1863                         break;
1864                 case T_Param:
1865                         retval = _equalParam(a, b);
1866                         break;
1867                 case T_Aggref:
1868                         retval = _equalAggref(a, b);
1869                         break;
1870                 case T_SubLink:
1871                         retval = _equalSubLink(a, b);
1872                         break;
1873                 case T_Func:
1874                         retval = _equalFunc(a, b);
1875                         break;
1876                 case T_FieldSelect:
1877                         retval = _equalFieldSelect(a, b);
1878                         break;
1879                 case T_ArrayRef:
1880                         retval = _equalArrayRef(a, b);
1881                         break;
1882                 case T_RelabelType:
1883                         retval = _equalRelabelType(a, b);
1884                         break;
1885                 case T_RangeTblRef:
1886                         retval = _equalRangeTblRef(a, b);
1887                         break;
1888                 case T_FromExpr:
1889                         retval = _equalFromExpr(a, b);
1890                         break;
1891                 case T_JoinExpr:
1892                         retval = _equalJoinExpr(a, b);
1893                         break;
1894
1895                 case T_RelOptInfo:
1896                         retval = _equalRelOptInfo(a, b);
1897                         break;
1898                 case T_Path:
1899                         retval = _equalPath(a, b);
1900                         break;
1901                 case T_IndexPath:
1902                         retval = _equalIndexPath(a, b);
1903                         break;
1904                 case T_NestPath:
1905                         retval = _equalNestPath(a, b);
1906                         break;
1907                 case T_MergePath:
1908                         retval = _equalMergePath(a, b);
1909                         break;
1910                 case T_HashPath:
1911                         retval = _equalHashPath(a, b);
1912                         break;
1913                 case T_PathKeyItem:
1914                         retval = _equalPathKeyItem(a, b);
1915                         break;
1916                 case T_RestrictInfo:
1917                         retval = _equalRestrictInfo(a, b);
1918                         break;
1919                 case T_JoinInfo:
1920                         retval = _equalJoinInfo(a, b);
1921                         break;
1922                 case T_Stream:
1923                         retval = _equalStream(a, b);
1924                         break;
1925                 case T_TidPath:
1926                         retval = _equalTidPath(a, b);
1927                         break;
1928                 case T_AppendPath:
1929                         retval = _equalAppendPath(a, b);
1930                         break;
1931                 case T_IndexOptInfo:
1932                         retval = _equalIndexOptInfo(a, b);
1933                         break;
1934
1935                 case T_List:
1936                         {
1937                                 List       *la = (List *) a;
1938                                 List       *lb = (List *) b;
1939                                 List       *l;
1940
1941                                 /*
1942                                  * Try to reject by length check before we grovel through
1943                                  * all the elements...
1944                                  */
1945                                 if (length(la) != length(lb))
1946                                         return false;
1947                                 foreach(l, la)
1948                                 {
1949                                         if (!equal(lfirst(l), lfirst(lb)))
1950                                                 return false;
1951                                         lb = lnext(lb);
1952                                 }
1953                                 retval = true;
1954                         }
1955                         break;
1956                 case T_Integer:
1957                 case T_Float:
1958                 case T_String:
1959                 case T_BitString:
1960                         retval = _equalValue(a, b);
1961                         break;
1962
1963                 case T_Query:
1964                         retval = _equalQuery(a, b);
1965                         break;
1966                 case T_InsertStmt:
1967                         retval = _equalInsertStmt(a, b);
1968                         break;
1969                 case T_DeleteStmt:
1970                         retval = _equalDeleteStmt(a, b);
1971                         break;
1972                 case T_UpdateStmt:
1973                         retval = _equalUpdateStmt(a, b);
1974                         break;
1975                 case T_SelectStmt:
1976                         retval = _equalSelectStmt(a, b);
1977                         break;
1978                 case T_SetOperationStmt:
1979                         retval = _equalSetOperationStmt(a, b);
1980                         break;
1981                 case T_AlterTableStmt:
1982                         retval = _equalAlterTableStmt(a, b);
1983                         break;
1984                 case T_GrantStmt:
1985                         retval = _equalGrantStmt(a, b);
1986                         break;
1987                 case T_ClosePortalStmt:
1988                         retval = _equalClosePortalStmt(a, b);
1989                         break;
1990                 case T_ClusterStmt:
1991                         retval = _equalClusterStmt(a, b);
1992                         break;
1993                 case T_CopyStmt:
1994                         retval = _equalCopyStmt(a, b);
1995                         break;
1996                 case T_CreateStmt:
1997                         retval = _equalCreateStmt(a, b);
1998                         break;
1999                 case T_DefineStmt:
2000                         retval = _equalDefineStmt(a, b);
2001                         break;
2002                 case T_DropStmt:
2003                         retval = _equalDropStmt(a, b);
2004                         break;
2005                 case T_TruncateStmt:
2006                         retval = _equalTruncateStmt(a, b);
2007                         break;
2008                 case T_CommentStmt:
2009                         retval = _equalCommentStmt(a, b);
2010                         break;
2011                 case T_FetchStmt:
2012                         retval = _equalFetchStmt(a, b);
2013                         break;
2014                 case T_IndexStmt:
2015                         retval = _equalIndexStmt(a, b);
2016                         break;
2017                 case T_CreateFunctionStmt:
2018                         retval = _equalCreateFunctionStmt(a, b);
2019                         break;
2020                 case T_RemoveAggrStmt:
2021                         retval = _equalRemoveAggrStmt(a, b);
2022                         break;
2023                 case T_RemoveFuncStmt:
2024                         retval = _equalRemoveFuncStmt(a, b);
2025                         break;
2026                 case T_RemoveOperStmt:
2027                         retval = _equalRemoveOperStmt(a, b);
2028                         break;
2029                 case T_RenameStmt:
2030                         retval = _equalRenameStmt(a, b);
2031                         break;
2032                 case T_RuleStmt:
2033                         retval = _equalRuleStmt(a, b);
2034                         break;
2035                 case T_NotifyStmt:
2036                         retval = _equalNotifyStmt(a, b);
2037                         break;
2038                 case T_ListenStmt:
2039                         retval = _equalListenStmt(a, b);
2040                         break;
2041                 case T_UnlistenStmt:
2042                         retval = _equalUnlistenStmt(a, b);
2043                         break;
2044                 case T_TransactionStmt:
2045                         retval = _equalTransactionStmt(a, b);
2046                         break;
2047                 case T_ViewStmt:
2048                         retval = _equalViewStmt(a, b);
2049                         break;
2050                 case T_LoadStmt:
2051                         retval = _equalLoadStmt(a, b);
2052                         break;
2053                 case T_CreateDomainStmt:
2054                         retval = _equalCreateDomainStmt(a, b);
2055                         break;
2056                 case T_CreatedbStmt:
2057                         retval = _equalCreatedbStmt(a, b);
2058                         break;
2059                 case T_AlterDatabaseSetStmt:
2060                         retval = _equalAlterDatabaseSetStmt(a, b);
2061                         break;
2062                 case T_DropdbStmt:
2063                         retval = _equalDropdbStmt(a, b);
2064                         break;
2065                 case T_VacuumStmt:
2066                         retval = _equalVacuumStmt(a, b);
2067                         break;
2068                 case T_ExplainStmt:
2069                         retval = _equalExplainStmt(a, b);
2070                         break;
2071                 case T_CreateSeqStmt:
2072                         retval = _equalCreateSeqStmt(a, b);
2073                         break;
2074                 case T_VariableSetStmt:
2075                         retval = _equalVariableSetStmt(a, b);
2076                         break;
2077                 case T_VariableShowStmt:
2078                         retval = _equalVariableShowStmt(a, b);
2079                         break;
2080                 case T_VariableResetStmt:
2081                         retval = _equalVariableResetStmt(a, b);
2082                         break;
2083                 case T_CreateTrigStmt:
2084                         retval = _equalCreateTrigStmt(a, b);
2085                         break;
2086                 case T_DropPropertyStmt:
2087                         retval = _equalDropPropertyStmt(a, b);
2088                         break;
2089                 case T_CreatePLangStmt:
2090                         retval = _equalCreatePLangStmt(a, b);
2091                         break;
2092                 case T_DropPLangStmt:
2093                         retval = _equalDropPLangStmt(a, b);
2094                         break;
2095                 case T_CreateUserStmt:
2096                         retval = _equalCreateUserStmt(a, b);
2097                         break;
2098                 case T_AlterUserStmt:
2099                         retval = _equalAlterUserStmt(a, b);
2100                         break;
2101                 case T_AlterUserSetStmt:
2102                         retval = _equalAlterUserSetStmt(a, b);
2103                         break;
2104                 case T_DropUserStmt:
2105                         retval = _equalDropUserStmt(a, b);
2106                         break;
2107                 case T_LockStmt:
2108                         retval = _equalLockStmt(a, b);
2109                         break;
2110                 case T_ConstraintsSetStmt:
2111                         retval = _equalConstraintsSetStmt(a, b);
2112                         break;
2113                 case T_CreateGroupStmt:
2114                         retval = _equalCreateGroupStmt(a, b);
2115                         break;
2116                 case T_AlterGroupStmt:
2117                         retval = _equalAlterGroupStmt(a, b);
2118                         break;
2119                 case T_DropGroupStmt:
2120                         retval = _equalDropGroupStmt(a, b);
2121                         break;
2122                 case T_ReindexStmt:
2123                         retval = _equalReindexStmt(a, b);
2124                         break;
2125                 case T_CheckPointStmt:
2126                         retval = true;
2127                         break;
2128                 case T_CreateSchemaStmt:
2129                         retval = _equalCreateSchemaStmt(a, b);
2130                         break;
2131
2132                 case T_A_Expr:
2133                         retval = _equalAExpr(a, b);
2134                         break;
2135                 case T_ColumnRef:
2136                         retval = _equalColumnRef(a, b);
2137                         break;
2138                 case T_ParamRef:
2139                         retval = _equalParamRef(a, b);
2140                         break;
2141                 case T_A_Const:
2142                         retval = _equalAConst(a, b);
2143                         break;
2144                 case T_Ident:
2145                         retval = _equalIdent(a, b);
2146                         break;
2147                 case T_FuncCall:
2148                         retval = _equalFuncCall(a, b);
2149                         break;
2150                 case T_A_Indices:
2151                         retval = _equalAIndices(a, b);
2152                         break;
2153                 case T_ExprFieldSelect:
2154                         retval = _equalExprFieldSelect(a, b);
2155                         break;
2156                 case T_ResTarget:
2157                         retval = _equalResTarget(a, b);
2158                         break;
2159                 case T_TypeCast:
2160                         retval = _equalTypeCast(a, b);
2161                         break;
2162                 case T_SortGroupBy:
2163                         retval = _equalSortGroupBy(a, b);
2164                         break;
2165                 case T_Alias:
2166                         retval = _equalAlias(a, b);
2167                         break;
2168                 case T_RangeVar:
2169                         retval = _equalRangeVar(a, b);
2170                         break;
2171                 case T_RangeSubselect:
2172                         retval = _equalRangeSubselect(a, b);
2173                         break;
2174                 case T_RangeFunction:
2175                         retval = _equalRangeFunction(a, b);
2176                         break;
2177                 case T_TypeName:
2178                         retval = _equalTypeName(a, b);
2179                         break;
2180                 case T_IndexElem:
2181                         retval = _equalIndexElem(a, b);
2182                         break;
2183                 case T_ColumnDef:
2184                         retval = _equalColumnDef(a, b);
2185                         break;
2186                 case T_Constraint:
2187                         retval = _equalConstraint(a, b);
2188                         break;
2189                 case T_DefElem:
2190                         retval = _equalDefElem(a, b);
2191                         break;
2192                 case T_TargetEntry:
2193                         retval = _equalTargetEntry(a, b);
2194                         break;
2195                 case T_RangeTblEntry:
2196                         retval = _equalRangeTblEntry(a, b);
2197                         break;
2198                 case T_SortClause:
2199                         retval = _equalSortClause(a, b);
2200                         break;
2201                 case T_GroupClause:
2202                         /* GroupClause is equivalent to SortClause */
2203                         retval = _equalSortClause(a, b);
2204                         break;
2205                 case T_CaseExpr:
2206                         retval = _equalCaseExpr(a, b);
2207                         break;
2208                 case T_CaseWhen:
2209                         retval = _equalCaseWhen(a, b);
2210                         break;
2211                 case T_NullTest:
2212                         retval = _equalNullTest(a, b);
2213                         break;
2214                 case T_BooleanTest:
2215                         retval = _equalBooleanTest(a, b);
2216                         break;
2217                 case T_FkConstraint:
2218                         retval = _equalFkConstraint(a, b);
2219                         break;
2220                 case T_PrivGrantee:
2221                         retval = _equalPrivGrantee(a, b);
2222                         break;
2223                 case T_FuncWithArgs:
2224                         retval = _equalFuncWithArgs(a, b);
2225                         break;
2226                 case T_InsertDefault:
2227                         retval = _equalInsertDefault(a, b);
2228                         break;
2229
2230                 default:
2231                         elog(WARNING, "equal: don't know whether nodes of type %d are equal",
2232                                  nodeTag(a));
2233                         break;
2234         }
2235
2236         return retval;
2237 }