1 /*-------------------------------------------------------------------------
4 * Equality functions to compare node trees.
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.
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
19 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
20 * Portions Copyright (c) 1994, Regents of the University of California
23 * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.170 2002/11/30 05:21:01 tgl Exp $
25 *-------------------------------------------------------------------------
30 #include "nodes/plannodes.h"
31 #include "nodes/relation.h"
32 #include "utils/datum.h"
36 * Macros to simplify comparison of different kinds of fields. Use these
37 * wherever possible to reduce the chance for silly typos. Note that these
38 * hard-wire the convention that the local variables in an Equal routine are
42 /* Compare a simple scalar field (int, float, bool, enum, etc) */
43 #define COMPARE_SCALAR_FIELD(fldname) \
45 if (a->fldname != b->fldname) \
49 /* Compare a field that is a pointer to some kind of Node or Node tree */
50 #define COMPARE_NODE_FIELD(fldname) \
52 if (!equal(a->fldname, b->fldname)) \
56 /* Compare a field that is a pointer to a list of integers */
57 #define COMPARE_INTLIST_FIELD(fldname) \
59 if (!equali(a->fldname, b->fldname)) \
63 /* Compare a field that is a pointer to a C string, or perhaps NULL */
64 #define COMPARE_STRING_FIELD(fldname) \
66 if (!equalstr(a->fldname, b->fldname)) \
70 /* Macro for comparing string fields that might be NULL */
71 #define equalstr(a, b) \
72 (((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))
74 /* Compare a field that is a pointer to a simple palloc'd object of size sz */
75 #define COMPARE_POINTER_FIELD(fldname, sz) \
77 if (memcmp(a->fldname, b->fldname, (sz)) != 0) \
83 * Stuff from primnodes.h
87 _equalResdom(Resdom *a, Resdom *b)
89 COMPARE_SCALAR_FIELD(resno);
90 COMPARE_SCALAR_FIELD(restype);
91 COMPARE_SCALAR_FIELD(restypmod);
92 COMPARE_STRING_FIELD(resname);
93 COMPARE_SCALAR_FIELD(ressortgroupref);
94 COMPARE_SCALAR_FIELD(reskey);
95 COMPARE_SCALAR_FIELD(reskeyop);
96 COMPARE_SCALAR_FIELD(resjunk);
102 _equalFjoin(Fjoin *a, Fjoin *b)
104 COMPARE_SCALAR_FIELD(fj_initialized);
105 COMPARE_SCALAR_FIELD(fj_nNodes);
106 COMPARE_NODE_FIELD(fj_innerNode);
107 COMPARE_POINTER_FIELD(fj_results, a->fj_nNodes * sizeof(Datum));
108 COMPARE_POINTER_FIELD(fj_alwaysDone, a->fj_nNodes * sizeof(bool));
114 _equalAlias(Alias *a, Alias *b)
116 COMPARE_STRING_FIELD(aliasname);
117 COMPARE_NODE_FIELD(colnames);
123 _equalRangeVar(RangeVar *a, RangeVar *b)
125 COMPARE_STRING_FIELD(catalogname);
126 COMPARE_STRING_FIELD(schemaname);
127 COMPARE_STRING_FIELD(relname);
128 COMPARE_SCALAR_FIELD(inhOpt);
129 COMPARE_SCALAR_FIELD(istemp);
130 COMPARE_NODE_FIELD(alias);
136 _equalExpr(Expr *a, Expr *b)
139 * We do not examine typeOid, since the optimizer often doesn't bother
140 * to set it in created nodes, and it is logically a derivative of the
143 COMPARE_SCALAR_FIELD(opType);
144 COMPARE_NODE_FIELD(oper);
145 COMPARE_NODE_FIELD(args);
151 _equalVar(Var *a, Var *b)
153 COMPARE_SCALAR_FIELD(varno);
154 COMPARE_SCALAR_FIELD(varattno);
155 COMPARE_SCALAR_FIELD(vartype);
156 COMPARE_SCALAR_FIELD(vartypmod);
157 COMPARE_SCALAR_FIELD(varlevelsup);
158 COMPARE_SCALAR_FIELD(varnoold);
159 COMPARE_SCALAR_FIELD(varoattno);
165 _equalOper(Oper *a, Oper *b)
167 COMPARE_SCALAR_FIELD(opno);
168 COMPARE_SCALAR_FIELD(opresulttype);
169 COMPARE_SCALAR_FIELD(opretset);
172 * We do not examine opid or op_fcache, since these are logically
173 * derived from opno, and they may not be set yet depending on how far
174 * along the node is in the parse/plan pipeline.
176 * (Besides, op_fcache is executor state, which we don't check --- see
177 * notes at head of file.)
179 * It's probably not really necessary to check opresulttype or opretset,
187 _equalConst(Const *a, Const *b)
189 COMPARE_SCALAR_FIELD(consttype);
190 COMPARE_SCALAR_FIELD(constlen);
191 COMPARE_SCALAR_FIELD(constisnull);
192 COMPARE_SCALAR_FIELD(constbyval);
195 * We treat all NULL constants of the same type as equal. Someday this
196 * might need to change? But datumIsEqual doesn't work on nulls,
201 return datumIsEqual(a->constvalue, b->constvalue,
202 a->constbyval, a->constlen);
206 _equalParam(Param *a, Param *b)
208 COMPARE_SCALAR_FIELD(paramkind);
209 COMPARE_SCALAR_FIELD(paramtype);
211 switch (a->paramkind)
214 COMPARE_STRING_FIELD(paramname);
218 COMPARE_SCALAR_FIELD(paramid);
221 elog(ERROR, "_equalParam: Invalid paramkind value: %d",
229 _equalFunc(Func *a, Func *b)
231 COMPARE_SCALAR_FIELD(funcid);
232 COMPARE_SCALAR_FIELD(funcresulttype);
233 COMPARE_SCALAR_FIELD(funcretset);
235 * Special-case COERCE_DONTCARE, so that pathkeys can build coercion
236 * nodes that are equal() to both explicit and implicit coercions.
238 if (a->funcformat != b->funcformat &&
239 a->funcformat != COERCE_DONTCARE &&
240 b->funcformat != COERCE_DONTCARE)
243 /* Note we do not look at func_fcache; see notes for _equalOper */
249 _equalAggref(Aggref *a, Aggref *b)
251 COMPARE_SCALAR_FIELD(aggfnoid);
252 COMPARE_SCALAR_FIELD(aggtype);
253 COMPARE_NODE_FIELD(target);
254 COMPARE_SCALAR_FIELD(aggstar);
255 COMPARE_SCALAR_FIELD(aggdistinct);
256 /* ignore aggno, which is only a private field for the executor */
262 _equalSubLink(SubLink *a, SubLink *b)
264 COMPARE_SCALAR_FIELD(subLinkType);
265 COMPARE_SCALAR_FIELD(useor);
266 COMPARE_NODE_FIELD(lefthand);
267 COMPARE_NODE_FIELD(oper);
268 COMPARE_NODE_FIELD(subselect);
274 _equalFieldSelect(FieldSelect *a, FieldSelect *b)
276 COMPARE_NODE_FIELD(arg);
277 COMPARE_SCALAR_FIELD(fieldnum);
278 COMPARE_SCALAR_FIELD(resulttype);
279 COMPARE_SCALAR_FIELD(resulttypmod);
285 _equalRelabelType(RelabelType *a, RelabelType *b)
287 COMPARE_NODE_FIELD(arg);
288 COMPARE_SCALAR_FIELD(resulttype);
289 COMPARE_SCALAR_FIELD(resulttypmod);
291 * Special-case COERCE_DONTCARE, so that pathkeys can build coercion
292 * nodes that are equal() to both explicit and implicit coercions.
294 if (a->relabelformat != b->relabelformat &&
295 a->relabelformat != COERCE_DONTCARE &&
296 b->relabelformat != COERCE_DONTCARE)
303 _equalRangeTblRef(RangeTblRef *a, RangeTblRef *b)
305 COMPARE_SCALAR_FIELD(rtindex);
311 _equalJoinExpr(JoinExpr *a, JoinExpr *b)
313 COMPARE_SCALAR_FIELD(jointype);
314 COMPARE_SCALAR_FIELD(isNatural);
315 COMPARE_NODE_FIELD(larg);
316 COMPARE_NODE_FIELD(rarg);
317 COMPARE_NODE_FIELD(using);
318 COMPARE_NODE_FIELD(quals);
319 COMPARE_NODE_FIELD(alias);
320 COMPARE_SCALAR_FIELD(rtindex);
326 _equalFromExpr(FromExpr *a, FromExpr *b)
328 COMPARE_NODE_FIELD(fromlist);
329 COMPARE_NODE_FIELD(quals);
335 _equalArrayRef(ArrayRef *a, ArrayRef *b)
337 COMPARE_SCALAR_FIELD(refrestype);
338 COMPARE_SCALAR_FIELD(refattrlength);
339 COMPARE_SCALAR_FIELD(refelemlength);
340 COMPARE_SCALAR_FIELD(refelembyval);
341 COMPARE_SCALAR_FIELD(refelemalign);
342 COMPARE_NODE_FIELD(refupperindexpr);
343 COMPARE_NODE_FIELD(reflowerindexpr);
344 COMPARE_NODE_FIELD(refexpr);
345 COMPARE_NODE_FIELD(refassgnexpr);
352 * Stuff from plannodes.h
356 _equalSubPlan(SubPlan *a, SubPlan *b)
358 /* should compare plans, but have to settle for comparing plan IDs */
359 COMPARE_SCALAR_FIELD(plan_id);
361 COMPARE_NODE_FIELD(rtable);
362 COMPARE_NODE_FIELD(sublink);
369 * Stuff from relation.h
373 _equalRelOptInfo(RelOptInfo *a, RelOptInfo *b)
376 * We treat RelOptInfos as equal if they refer to the same base rels
377 * joined in the same order. Is this appropriate/sufficient?
379 COMPARE_INTLIST_FIELD(relids);
385 _equalIndexOptInfo(IndexOptInfo *a, IndexOptInfo *b)
388 * We treat IndexOptInfos as equal if they refer to the same index. Is
391 COMPARE_SCALAR_FIELD(indexoid);
397 _equalPath(Path *a, Path *b)
399 /* This is safe only because _equalRelOptInfo is incomplete... */
400 COMPARE_NODE_FIELD(parent);
402 * do not check path costs, since they may not be set yet, and being
403 * float values there are roundoff error issues anyway...
405 COMPARE_SCALAR_FIELD(pathtype);
406 COMPARE_NODE_FIELD(pathkeys);
412 _equalIndexPath(IndexPath *a, IndexPath *b)
414 if (!_equalPath((Path *) a, (Path *) b))
416 COMPARE_NODE_FIELD(indexinfo);
417 COMPARE_NODE_FIELD(indexqual);
418 COMPARE_SCALAR_FIELD(indexscandir);
421 * Skip 'rows' because of possibility of floating-point roundoff
422 * error. It should be derivable from the other fields anyway.
428 _equalTidPath(TidPath *a, TidPath *b)
430 if (!_equalPath((Path *) a, (Path *) b))
432 COMPARE_NODE_FIELD(tideval);
433 COMPARE_INTLIST_FIELD(unjoined_relids);
439 _equalAppendPath(AppendPath *a, AppendPath *b)
441 if (!_equalPath((Path *) a, (Path *) b))
443 COMPARE_NODE_FIELD(subpaths);
449 _equalResultPath(ResultPath *a, ResultPath *b)
451 if (!_equalPath((Path *) a, (Path *) b))
453 COMPARE_NODE_FIELD(subpath);
454 COMPARE_NODE_FIELD(constantqual);
460 _equalMaterialPath(MaterialPath *a, MaterialPath *b)
462 if (!_equalPath((Path *) a, (Path *) b))
464 COMPARE_NODE_FIELD(subpath);
470 _equalJoinPath(JoinPath *a, JoinPath *b)
472 if (!_equalPath((Path *) a, (Path *) b))
474 COMPARE_SCALAR_FIELD(jointype);
475 COMPARE_NODE_FIELD(outerjoinpath);
476 COMPARE_NODE_FIELD(innerjoinpath);
477 COMPARE_NODE_FIELD(joinrestrictinfo);
483 _equalNestPath(NestPath *a, NestPath *b)
485 if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
492 _equalMergePath(MergePath *a, MergePath *b)
494 if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
496 COMPARE_NODE_FIELD(path_mergeclauses);
497 COMPARE_NODE_FIELD(outersortkeys);
498 COMPARE_NODE_FIELD(innersortkeys);
504 _equalHashPath(HashPath *a, HashPath *b)
506 if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
508 COMPARE_NODE_FIELD(path_hashclauses);
514 _equalPathKeyItem(PathKeyItem *a, PathKeyItem *b)
516 COMPARE_NODE_FIELD(key);
517 COMPARE_SCALAR_FIELD(sortop);
523 _equalRestrictInfo(RestrictInfo *a, RestrictInfo *b)
525 COMPARE_NODE_FIELD(clause);
526 COMPARE_SCALAR_FIELD(ispusheddown);
528 * We ignore subclauseindices, eval_cost, this_selec, left/right_pathkey,
529 * and left/right_bucketsize, since they may not be set yet, and should be
530 * derivable from the clause anyway. Probably it's not really necessary
531 * to compare any of these remaining fields ...
533 COMPARE_SCALAR_FIELD(mergejoinoperator);
534 COMPARE_SCALAR_FIELD(left_sortop);
535 COMPARE_SCALAR_FIELD(right_sortop);
536 COMPARE_SCALAR_FIELD(hashjoinoperator);
542 _equalJoinInfo(JoinInfo *a, JoinInfo *b)
544 COMPARE_INTLIST_FIELD(unjoined_relids);
545 COMPARE_NODE_FIELD(jinfo_restrictinfo);
551 _equalInnerIndexscanInfo(InnerIndexscanInfo *a, InnerIndexscanInfo *b)
553 COMPARE_INTLIST_FIELD(other_relids);
554 COMPARE_SCALAR_FIELD(isouterjoin);
555 COMPARE_NODE_FIELD(best_innerpath);
562 * Stuff from parsenodes.h
566 _equalQuery(Query *a, Query *b)
568 COMPARE_SCALAR_FIELD(commandType);
569 COMPARE_SCALAR_FIELD(querySource);
570 COMPARE_NODE_FIELD(utilityStmt);
571 COMPARE_SCALAR_FIELD(resultRelation);
572 COMPARE_NODE_FIELD(into);
573 COMPARE_SCALAR_FIELD(isPortal);
574 COMPARE_SCALAR_FIELD(isBinary);
575 COMPARE_SCALAR_FIELD(hasAggs);
576 COMPARE_SCALAR_FIELD(hasSubLinks);
577 COMPARE_NODE_FIELD(rtable);
578 COMPARE_NODE_FIELD(jointree);
579 COMPARE_INTLIST_FIELD(rowMarks);
580 COMPARE_NODE_FIELD(targetList);
581 COMPARE_NODE_FIELD(groupClause);
582 COMPARE_NODE_FIELD(havingQual);
583 COMPARE_NODE_FIELD(distinctClause);
584 COMPARE_NODE_FIELD(sortClause);
585 COMPARE_NODE_FIELD(limitOffset);
586 COMPARE_NODE_FIELD(limitCount);
587 COMPARE_NODE_FIELD(setOperations);
588 COMPARE_INTLIST_FIELD(resultRelations);
591 * We do not check the internal-to-the-planner fields: base_rel_list,
592 * other_rel_list, join_rel_list, equi_key_list, query_pathkeys,
593 * hasJoinRTEs. They might not be set yet, and in any case they should
594 * be derivable from the other fields.
600 _equalInsertStmt(InsertStmt *a, InsertStmt *b)
602 COMPARE_NODE_FIELD(relation);
603 COMPARE_NODE_FIELD(cols);
604 COMPARE_NODE_FIELD(targetList);
605 COMPARE_NODE_FIELD(selectStmt);
611 _equalDeleteStmt(DeleteStmt *a, DeleteStmt *b)
613 COMPARE_NODE_FIELD(relation);
614 COMPARE_NODE_FIELD(whereClause);
620 _equalUpdateStmt(UpdateStmt *a, UpdateStmt *b)
622 COMPARE_NODE_FIELD(relation);
623 COMPARE_NODE_FIELD(targetList);
624 COMPARE_NODE_FIELD(whereClause);
625 COMPARE_NODE_FIELD(fromClause);
631 _equalSelectStmt(SelectStmt *a, SelectStmt *b)
633 COMPARE_NODE_FIELD(distinctClause);
634 COMPARE_NODE_FIELD(into);
635 COMPARE_NODE_FIELD(intoColNames);
636 COMPARE_NODE_FIELD(targetList);
637 COMPARE_NODE_FIELD(fromClause);
638 COMPARE_NODE_FIELD(whereClause);
639 COMPARE_NODE_FIELD(groupClause);
640 COMPARE_NODE_FIELD(havingClause);
641 COMPARE_NODE_FIELD(sortClause);
642 COMPARE_STRING_FIELD(portalname);
643 COMPARE_SCALAR_FIELD(binary);
644 COMPARE_NODE_FIELD(limitOffset);
645 COMPARE_NODE_FIELD(limitCount);
646 COMPARE_NODE_FIELD(forUpdate);
647 COMPARE_SCALAR_FIELD(op);
648 COMPARE_SCALAR_FIELD(all);
649 COMPARE_NODE_FIELD(larg);
650 COMPARE_NODE_FIELD(rarg);
656 _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
658 COMPARE_SCALAR_FIELD(op);
659 COMPARE_SCALAR_FIELD(all);
660 COMPARE_NODE_FIELD(larg);
661 COMPARE_NODE_FIELD(rarg);
662 COMPARE_INTLIST_FIELD(colTypes);
668 _equalAlterTableStmt(AlterTableStmt *a, AlterTableStmt *b)
670 COMPARE_SCALAR_FIELD(subtype);
671 COMPARE_NODE_FIELD(relation);
672 COMPARE_STRING_FIELD(name);
673 COMPARE_NODE_FIELD(def);
674 COMPARE_SCALAR_FIELD(behavior);
680 _equalGrantStmt(GrantStmt *a, GrantStmt *b)
682 COMPARE_SCALAR_FIELD(is_grant);
683 COMPARE_SCALAR_FIELD(objtype);
684 COMPARE_NODE_FIELD(objects);
685 COMPARE_INTLIST_FIELD(privileges);
686 COMPARE_NODE_FIELD(grantees);
692 _equalPrivGrantee(PrivGrantee *a, PrivGrantee *b)
694 COMPARE_STRING_FIELD(username);
695 COMPARE_STRING_FIELD(groupname);
701 _equalFuncWithArgs(FuncWithArgs *a, FuncWithArgs *b)
703 COMPARE_NODE_FIELD(funcname);
704 COMPARE_NODE_FIELD(funcargs);
710 _equalInsertDefault(InsertDefault *a, InsertDefault *b)
716 _equalClosePortalStmt(ClosePortalStmt *a, ClosePortalStmt *b)
718 COMPARE_STRING_FIELD(portalname);
724 _equalClusterStmt(ClusterStmt *a, ClusterStmt *b)
726 COMPARE_NODE_FIELD(relation);
727 COMPARE_STRING_FIELD(indexname);
733 _equalCopyStmt(CopyStmt *a, CopyStmt *b)
735 COMPARE_NODE_FIELD(relation);
736 COMPARE_NODE_FIELD(attlist);
737 COMPARE_SCALAR_FIELD(is_from);
738 COMPARE_STRING_FIELD(filename);
739 COMPARE_NODE_FIELD(options);
745 _equalCreateStmt(CreateStmt *a, CreateStmt *b)
747 COMPARE_NODE_FIELD(relation);
748 COMPARE_NODE_FIELD(tableElts);
749 COMPARE_NODE_FIELD(inhRelations);
750 COMPARE_NODE_FIELD(constraints);
751 COMPARE_SCALAR_FIELD(hasoids);
752 COMPARE_SCALAR_FIELD(oncommit);
758 _equalDefineStmt(DefineStmt *a, DefineStmt *b)
760 COMPARE_SCALAR_FIELD(defType);
761 COMPARE_NODE_FIELD(defnames);
762 COMPARE_NODE_FIELD(definition);
768 _equalDropStmt(DropStmt *a, DropStmt *b)
770 COMPARE_NODE_FIELD(objects);
771 COMPARE_SCALAR_FIELD(removeType);
772 COMPARE_SCALAR_FIELD(behavior);
778 _equalTruncateStmt(TruncateStmt *a, TruncateStmt *b)
780 COMPARE_NODE_FIELD(relation);
786 _equalCommentStmt(CommentStmt *a, CommentStmt *b)
788 COMPARE_SCALAR_FIELD(objtype);
789 COMPARE_NODE_FIELD(objname);
790 COMPARE_NODE_FIELD(objargs);
791 COMPARE_STRING_FIELD(comment);
797 _equalFetchStmt(FetchStmt *a, FetchStmt *b)
799 COMPARE_SCALAR_FIELD(direction);
800 COMPARE_SCALAR_FIELD(howMany);
801 COMPARE_STRING_FIELD(portalname);
802 COMPARE_SCALAR_FIELD(ismove);
808 _equalIndexStmt(IndexStmt *a, IndexStmt *b)
810 COMPARE_STRING_FIELD(idxname);
811 COMPARE_NODE_FIELD(relation);
812 COMPARE_STRING_FIELD(accessMethod);
813 COMPARE_NODE_FIELD(indexParams);
814 COMPARE_NODE_FIELD(whereClause);
815 COMPARE_NODE_FIELD(rangetable);
816 COMPARE_SCALAR_FIELD(unique);
817 COMPARE_SCALAR_FIELD(primary);
818 COMPARE_SCALAR_FIELD(isconstraint);
824 _equalCreateFunctionStmt(CreateFunctionStmt *a, CreateFunctionStmt *b)
826 COMPARE_SCALAR_FIELD(replace);
827 COMPARE_NODE_FIELD(funcname);
828 COMPARE_NODE_FIELD(argTypes);
829 COMPARE_NODE_FIELD(returnType);
830 COMPARE_NODE_FIELD(options);
831 COMPARE_NODE_FIELD(withClause);
837 _equalRemoveAggrStmt(RemoveAggrStmt *a, RemoveAggrStmt *b)
839 COMPARE_NODE_FIELD(aggname);
840 COMPARE_NODE_FIELD(aggtype);
841 COMPARE_SCALAR_FIELD(behavior);
847 _equalRemoveFuncStmt(RemoveFuncStmt *a, RemoveFuncStmt *b)
849 COMPARE_NODE_FIELD(funcname);
850 COMPARE_NODE_FIELD(args);
851 COMPARE_SCALAR_FIELD(behavior);
857 _equalRemoveOperStmt(RemoveOperStmt *a, RemoveOperStmt *b)
859 COMPARE_NODE_FIELD(opname);
860 COMPARE_NODE_FIELD(args);
861 COMPARE_SCALAR_FIELD(behavior);
867 _equalRemoveOpClassStmt(RemoveOpClassStmt *a, RemoveOpClassStmt *b)
869 COMPARE_NODE_FIELD(opclassname);
870 COMPARE_STRING_FIELD(amname);
871 COMPARE_SCALAR_FIELD(behavior);
877 _equalRenameStmt(RenameStmt *a, RenameStmt *b)
879 COMPARE_NODE_FIELD(relation);
880 COMPARE_STRING_FIELD(oldname);
881 COMPARE_STRING_FIELD(newname);
882 COMPARE_SCALAR_FIELD(renameType);
888 _equalRuleStmt(RuleStmt *a, RuleStmt *b)
890 COMPARE_NODE_FIELD(relation);
891 COMPARE_STRING_FIELD(rulename);
892 COMPARE_NODE_FIELD(whereClause);
893 COMPARE_SCALAR_FIELD(event);
894 COMPARE_SCALAR_FIELD(instead);
895 COMPARE_NODE_FIELD(actions);
896 COMPARE_SCALAR_FIELD(replace);
902 _equalNotifyStmt(NotifyStmt *a, NotifyStmt *b)
904 COMPARE_NODE_FIELD(relation);
910 _equalListenStmt(ListenStmt *a, ListenStmt *b)
912 COMPARE_NODE_FIELD(relation);
918 _equalUnlistenStmt(UnlistenStmt *a, UnlistenStmt *b)
920 COMPARE_NODE_FIELD(relation);
926 _equalTransactionStmt(TransactionStmt *a, TransactionStmt *b)
928 COMPARE_SCALAR_FIELD(command);
929 COMPARE_NODE_FIELD(options);
935 _equalCompositeTypeStmt(CompositeTypeStmt *a, CompositeTypeStmt *b)
937 COMPARE_NODE_FIELD(typevar);
938 COMPARE_NODE_FIELD(coldeflist);
944 _equalViewStmt(ViewStmt *a, ViewStmt *b)
946 COMPARE_NODE_FIELD(view);
947 COMPARE_NODE_FIELD(aliases);
948 COMPARE_NODE_FIELD(query);
949 COMPARE_SCALAR_FIELD(replace);
955 _equalLoadStmt(LoadStmt *a, LoadStmt *b)
957 COMPARE_STRING_FIELD(filename);
963 _equalCreateDomainStmt(CreateDomainStmt *a, CreateDomainStmt *b)
965 COMPARE_NODE_FIELD(domainname);
966 COMPARE_NODE_FIELD(typename);
967 COMPARE_NODE_FIELD(constraints);
973 _equalCreateOpClassStmt(CreateOpClassStmt *a, CreateOpClassStmt *b)
975 COMPARE_NODE_FIELD(opclassname);
976 COMPARE_STRING_FIELD(amname);
977 COMPARE_NODE_FIELD(datatype);
978 COMPARE_NODE_FIELD(items);
979 COMPARE_SCALAR_FIELD(isDefault);
985 _equalCreateOpClassItem(CreateOpClassItem *a, CreateOpClassItem *b)
987 COMPARE_SCALAR_FIELD(itemtype);
988 COMPARE_NODE_FIELD(name);
989 COMPARE_NODE_FIELD(args);
990 COMPARE_SCALAR_FIELD(number);
991 COMPARE_SCALAR_FIELD(recheck);
992 COMPARE_NODE_FIELD(storedtype);
998 _equalCreatedbStmt(CreatedbStmt *a, CreatedbStmt *b)
1000 COMPARE_STRING_FIELD(dbname);
1001 COMPARE_NODE_FIELD(options);
1007 _equalAlterDatabaseSetStmt(AlterDatabaseSetStmt *a, AlterDatabaseSetStmt *b)
1009 COMPARE_STRING_FIELD(dbname);
1010 COMPARE_STRING_FIELD(variable);
1011 COMPARE_NODE_FIELD(value);
1017 _equalDropdbStmt(DropdbStmt *a, DropdbStmt *b)
1019 COMPARE_STRING_FIELD(dbname);
1025 _equalVacuumStmt(VacuumStmt *a, VacuumStmt *b)
1027 COMPARE_SCALAR_FIELD(vacuum);
1028 COMPARE_SCALAR_FIELD(full);
1029 COMPARE_SCALAR_FIELD(analyze);
1030 COMPARE_SCALAR_FIELD(freeze);
1031 COMPARE_SCALAR_FIELD(verbose);
1032 COMPARE_NODE_FIELD(relation);
1033 COMPARE_NODE_FIELD(va_cols);
1039 _equalExplainStmt(ExplainStmt *a, ExplainStmt *b)
1041 COMPARE_NODE_FIELD(query);
1042 COMPARE_SCALAR_FIELD(verbose);
1043 COMPARE_SCALAR_FIELD(analyze);
1049 _equalCreateSeqStmt(CreateSeqStmt *a, CreateSeqStmt *b)
1051 COMPARE_NODE_FIELD(sequence);
1052 COMPARE_NODE_FIELD(options);
1058 _equalVariableSetStmt(VariableSetStmt *a, VariableSetStmt *b)
1060 COMPARE_STRING_FIELD(name);
1061 COMPARE_NODE_FIELD(args);
1062 COMPARE_SCALAR_FIELD(is_local);
1068 _equalVariableShowStmt(VariableShowStmt *a, VariableShowStmt *b)
1070 COMPARE_STRING_FIELD(name);
1076 _equalVariableResetStmt(VariableResetStmt *a, VariableResetStmt *b)
1078 COMPARE_STRING_FIELD(name);
1084 _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
1086 COMPARE_STRING_FIELD(trigname);
1087 COMPARE_NODE_FIELD(relation);
1088 COMPARE_NODE_FIELD(funcname);
1089 COMPARE_NODE_FIELD(args);
1090 COMPARE_SCALAR_FIELD(before);
1091 COMPARE_SCALAR_FIELD(row);
1092 if (strcmp(a->actions, b->actions) != 0) /* in-line string field */
1094 COMPARE_SCALAR_FIELD(isconstraint);
1095 COMPARE_SCALAR_FIELD(deferrable);
1096 COMPARE_SCALAR_FIELD(initdeferred);
1097 COMPARE_NODE_FIELD(constrrel);
1103 _equalDropPropertyStmt(DropPropertyStmt *a, DropPropertyStmt *b)
1105 COMPARE_NODE_FIELD(relation);
1106 COMPARE_STRING_FIELD(property);
1107 COMPARE_SCALAR_FIELD(removeType);
1108 COMPARE_SCALAR_FIELD(behavior);
1114 _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
1116 COMPARE_STRING_FIELD(plname);
1117 COMPARE_NODE_FIELD(plhandler);
1118 COMPARE_NODE_FIELD(plvalidator);
1119 COMPARE_SCALAR_FIELD(pltrusted);
1125 _equalDropPLangStmt(DropPLangStmt *a, DropPLangStmt *b)
1127 COMPARE_STRING_FIELD(plname);
1128 COMPARE_SCALAR_FIELD(behavior);
1134 _equalCreateUserStmt(CreateUserStmt *a, CreateUserStmt *b)
1136 COMPARE_STRING_FIELD(user);
1137 COMPARE_NODE_FIELD(options);
1143 _equalAlterUserStmt(AlterUserStmt *a, AlterUserStmt *b)
1145 COMPARE_STRING_FIELD(user);
1146 COMPARE_NODE_FIELD(options);
1152 _equalAlterUserSetStmt(AlterUserSetStmt *a, AlterUserSetStmt *b)
1154 COMPARE_STRING_FIELD(user);
1155 COMPARE_STRING_FIELD(variable);
1156 COMPARE_NODE_FIELD(value);
1162 _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
1164 COMPARE_NODE_FIELD(users);
1170 _equalLockStmt(LockStmt *a, LockStmt *b)
1172 COMPARE_NODE_FIELD(relations);
1173 COMPARE_SCALAR_FIELD(mode);
1179 _equalConstraintsSetStmt(ConstraintsSetStmt *a, ConstraintsSetStmt *b)
1181 COMPARE_NODE_FIELD(constraints);
1182 COMPARE_SCALAR_FIELD(deferred);
1188 _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
1190 COMPARE_STRING_FIELD(name);
1191 COMPARE_NODE_FIELD(options);
1197 _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
1199 COMPARE_STRING_FIELD(name);
1200 COMPARE_SCALAR_FIELD(action);
1201 COMPARE_NODE_FIELD(listUsers);
1207 _equalDropGroupStmt(DropGroupStmt *a, DropGroupStmt *b)
1209 COMPARE_STRING_FIELD(name);
1215 _equalReindexStmt(ReindexStmt *a, ReindexStmt *b)
1217 COMPARE_SCALAR_FIELD(reindexType);
1218 COMPARE_NODE_FIELD(relation);
1219 COMPARE_STRING_FIELD(name);
1220 COMPARE_SCALAR_FIELD(force);
1221 COMPARE_SCALAR_FIELD(all);
1227 _equalCreateSchemaStmt(CreateSchemaStmt *a, CreateSchemaStmt *b)
1229 COMPARE_STRING_FIELD(schemaname);
1230 COMPARE_STRING_FIELD(authid);
1231 COMPARE_NODE_FIELD(schemaElts);
1237 _equalCreateConversionStmt(CreateConversionStmt *a, CreateConversionStmt *b)
1239 COMPARE_NODE_FIELD(conversion_name);
1240 COMPARE_STRING_FIELD(for_encoding_name);
1241 COMPARE_STRING_FIELD(to_encoding_name);
1242 COMPARE_NODE_FIELD(func_name);
1243 COMPARE_SCALAR_FIELD(def);
1249 _equalCreateCastStmt(CreateCastStmt *a, CreateCastStmt *b)
1251 COMPARE_NODE_FIELD(sourcetype);
1252 COMPARE_NODE_FIELD(targettype);
1253 COMPARE_NODE_FIELD(func);
1254 COMPARE_SCALAR_FIELD(context);
1260 _equalDropCastStmt(DropCastStmt *a, DropCastStmt *b)
1262 COMPARE_NODE_FIELD(sourcetype);
1263 COMPARE_NODE_FIELD(targettype);
1264 COMPARE_SCALAR_FIELD(behavior);
1270 _equalPrepareStmt(PrepareStmt *a, PrepareStmt *b)
1272 COMPARE_STRING_FIELD(name);
1273 COMPARE_NODE_FIELD(argtypes);
1274 COMPARE_INTLIST_FIELD(argtype_oids);
1275 COMPARE_NODE_FIELD(query);
1281 _equalExecuteStmt(ExecuteStmt *a, ExecuteStmt *b)
1283 COMPARE_STRING_FIELD(name);
1284 COMPARE_NODE_FIELD(into);
1285 COMPARE_NODE_FIELD(params);
1291 _equalDeallocateStmt(DeallocateStmt *a, DeallocateStmt *b)
1293 COMPARE_STRING_FIELD(name);
1300 * stuff from parsenodes.h
1304 _equalAExpr(A_Expr *a, A_Expr *b)
1306 COMPARE_SCALAR_FIELD(oper);
1307 COMPARE_NODE_FIELD(name);
1308 COMPARE_NODE_FIELD(lexpr);
1309 COMPARE_NODE_FIELD(rexpr);
1315 _equalColumnRef(ColumnRef *a, ColumnRef *b)
1317 COMPARE_NODE_FIELD(fields);
1318 COMPARE_NODE_FIELD(indirection);
1324 _equalParamRef(ParamRef *a, ParamRef *b)
1326 COMPARE_SCALAR_FIELD(number);
1327 COMPARE_NODE_FIELD(fields);
1328 COMPARE_NODE_FIELD(indirection);
1334 _equalAConst(A_Const *a, A_Const *b)
1336 if (!equal(&a->val, &b->val)) /* hack for in-line Value field */
1338 COMPARE_NODE_FIELD(typename);
1344 _equalFuncCall(FuncCall *a, FuncCall *b)
1346 COMPARE_NODE_FIELD(funcname);
1347 COMPARE_NODE_FIELD(args);
1348 COMPARE_SCALAR_FIELD(agg_star);
1349 COMPARE_SCALAR_FIELD(agg_distinct);
1355 _equalAIndices(A_Indices *a, A_Indices *b)
1357 COMPARE_NODE_FIELD(lidx);
1358 COMPARE_NODE_FIELD(uidx);
1364 _equalExprFieldSelect(ExprFieldSelect *a, ExprFieldSelect *b)
1366 COMPARE_NODE_FIELD(arg);
1367 COMPARE_NODE_FIELD(fields);
1368 COMPARE_NODE_FIELD(indirection);
1374 _equalResTarget(ResTarget *a, ResTarget *b)
1376 COMPARE_STRING_FIELD(name);
1377 COMPARE_NODE_FIELD(indirection);
1378 COMPARE_NODE_FIELD(val);
1384 _equalTypeName(TypeName *a, TypeName *b)
1386 COMPARE_NODE_FIELD(names);
1387 COMPARE_SCALAR_FIELD(typeid);
1388 COMPARE_SCALAR_FIELD(timezone);
1389 COMPARE_SCALAR_FIELD(setof);
1390 COMPARE_SCALAR_FIELD(pct_type);
1391 COMPARE_SCALAR_FIELD(typmod);
1392 COMPARE_NODE_FIELD(arrayBounds);
1398 _equalTypeCast(TypeCast *a, TypeCast *b)
1400 COMPARE_NODE_FIELD(arg);
1401 COMPARE_NODE_FIELD(typename);
1407 _equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
1409 COMPARE_NODE_FIELD(useOp);
1410 COMPARE_NODE_FIELD(node);
1416 _equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
1418 COMPARE_NODE_FIELD(subquery);
1419 COMPARE_NODE_FIELD(alias);
1425 _equalRangeFunction(RangeFunction *a, RangeFunction *b)
1427 COMPARE_NODE_FIELD(funccallnode);
1428 COMPARE_NODE_FIELD(alias);
1429 COMPARE_NODE_FIELD(coldeflist);
1435 _equalIndexElem(IndexElem *a, IndexElem *b)
1437 COMPARE_STRING_FIELD(name);
1438 COMPARE_NODE_FIELD(funcname);
1439 COMPARE_NODE_FIELD(args);
1440 COMPARE_NODE_FIELD(opclass);
1446 _equalColumnDef(ColumnDef *a, ColumnDef *b)
1448 COMPARE_STRING_FIELD(colname);
1449 COMPARE_NODE_FIELD(typename);
1450 COMPARE_SCALAR_FIELD(inhcount);
1451 COMPARE_SCALAR_FIELD(is_local);
1452 COMPARE_SCALAR_FIELD(is_not_null);
1453 COMPARE_NODE_FIELD(raw_default);
1454 COMPARE_STRING_FIELD(cooked_default);
1455 COMPARE_NODE_FIELD(constraints);
1456 COMPARE_NODE_FIELD(support);
1462 _equalConstraint(Constraint *a, Constraint *b)
1464 COMPARE_SCALAR_FIELD(contype);
1465 COMPARE_STRING_FIELD(name);
1466 COMPARE_NODE_FIELD(raw_expr);
1467 COMPARE_STRING_FIELD(cooked_expr);
1468 COMPARE_NODE_FIELD(keys);
1474 _equalDefElem(DefElem *a, DefElem *b)
1476 COMPARE_STRING_FIELD(defname);
1477 COMPARE_NODE_FIELD(arg);
1483 _equalTargetEntry(TargetEntry *a, TargetEntry *b)
1485 COMPARE_NODE_FIELD(resdom);
1486 COMPARE_NODE_FIELD(fjoin);
1487 COMPARE_NODE_FIELD(expr);
1493 _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
1495 COMPARE_SCALAR_FIELD(rtekind);
1496 COMPARE_SCALAR_FIELD(relid);
1497 COMPARE_NODE_FIELD(subquery);
1498 COMPARE_NODE_FIELD(funcexpr);
1499 COMPARE_NODE_FIELD(coldeflist);
1500 COMPARE_SCALAR_FIELD(jointype);
1501 COMPARE_NODE_FIELD(joinaliasvars);
1502 COMPARE_NODE_FIELD(alias);
1503 COMPARE_NODE_FIELD(eref);
1504 COMPARE_SCALAR_FIELD(inh);
1505 COMPARE_SCALAR_FIELD(inFromCl);
1506 COMPARE_SCALAR_FIELD(checkForRead);
1507 COMPARE_SCALAR_FIELD(checkForWrite);
1508 COMPARE_SCALAR_FIELD(checkAsUser);
1514 _equalSortClause(SortClause *a, SortClause *b)
1516 COMPARE_SCALAR_FIELD(tleSortGroupRef);
1517 COMPARE_SCALAR_FIELD(sortop);
1523 _equalFkConstraint(FkConstraint *a, FkConstraint *b)
1525 COMPARE_STRING_FIELD(constr_name);
1526 COMPARE_NODE_FIELD(pktable);
1527 COMPARE_NODE_FIELD(fk_attrs);
1528 COMPARE_NODE_FIELD(pk_attrs);
1529 COMPARE_SCALAR_FIELD(fk_matchtype);
1530 COMPARE_SCALAR_FIELD(fk_upd_action);
1531 COMPARE_SCALAR_FIELD(fk_del_action);
1532 COMPARE_SCALAR_FIELD(deferrable);
1533 COMPARE_SCALAR_FIELD(initdeferred);
1534 COMPARE_SCALAR_FIELD(skip_validation);
1540 _equalCaseExpr(CaseExpr *a, CaseExpr *b)
1542 COMPARE_SCALAR_FIELD(casetype);
1543 COMPARE_NODE_FIELD(arg);
1544 COMPARE_NODE_FIELD(args);
1545 COMPARE_NODE_FIELD(defresult);
1551 _equalCaseWhen(CaseWhen *a, CaseWhen *b)
1553 COMPARE_NODE_FIELD(expr);
1554 COMPARE_NODE_FIELD(result);
1560 _equalNullTest(NullTest *a, NullTest *b)
1562 COMPARE_NODE_FIELD(arg);
1563 COMPARE_SCALAR_FIELD(nulltesttype);
1569 _equalBooleanTest(BooleanTest *a, BooleanTest *b)
1571 COMPARE_NODE_FIELD(arg);
1572 COMPARE_SCALAR_FIELD(booltesttype);
1578 _equalConstraintTest(ConstraintTest *a, ConstraintTest *b)
1580 COMPARE_NODE_FIELD(arg);
1581 COMPARE_SCALAR_FIELD(testtype);
1582 COMPARE_STRING_FIELD(name);
1583 COMPARE_STRING_FIELD(domname);
1584 COMPARE_NODE_FIELD(check_expr);
1590 _equalDomainConstraintValue(DomainConstraintValue *a, DomainConstraintValue *b)
1596 _equalConstraintTestValue(ConstraintTestValue *a, ConstraintTestValue *b)
1598 COMPARE_SCALAR_FIELD(typeId);
1599 COMPARE_SCALAR_FIELD(typeMod);
1606 * Stuff from pg_list.h
1610 _equalValue(Value *a, Value *b)
1612 COMPARE_SCALAR_FIELD(type);
1617 COMPARE_SCALAR_FIELD(val.ival);
1622 COMPARE_STRING_FIELD(val.str);
1628 elog(ERROR, "_equalValue: unknown node type %d", a->type);
1637 * returns whether two nodes are equal
1640 equal(void *a, void *b)
1642 bool retval = false;
1648 * note that a!=b, so only one of them can be NULL
1650 if (a == NULL || b == NULL)
1654 * are they the same type of nodes?
1656 if (nodeTag(a) != nodeTag(b))
1662 retval = _equalSubPlan(a, b);
1666 retval = _equalResdom(a, b);
1669 retval = _equalFjoin(a, b);
1672 retval = _equalExpr(a, b);
1675 retval = _equalVar(a, b);
1678 retval = _equalOper(a, b);
1681 retval = _equalConst(a, b);
1684 retval = _equalParam(a, b);
1687 retval = _equalAggref(a, b);
1690 retval = _equalSubLink(a, b);
1693 retval = _equalFunc(a, b);
1696 retval = _equalFieldSelect(a, b);
1699 retval = _equalArrayRef(a, b);
1702 retval = _equalRelabelType(a, b);
1705 retval = _equalRangeTblRef(a, b);
1708 retval = _equalFromExpr(a, b);
1711 retval = _equalJoinExpr(a, b);
1715 retval = _equalRelOptInfo(a, b);
1717 case T_IndexOptInfo:
1718 retval = _equalIndexOptInfo(a, b);
1721 retval = _equalPath(a, b);
1724 retval = _equalIndexPath(a, b);
1727 retval = _equalTidPath(a, b);
1730 retval = _equalAppendPath(a, b);
1733 retval = _equalResultPath(a, b);
1735 case T_MaterialPath:
1736 retval = _equalMaterialPath(a, b);
1739 retval = _equalNestPath(a, b);
1742 retval = _equalMergePath(a, b);
1745 retval = _equalHashPath(a, b);
1748 retval = _equalPathKeyItem(a, b);
1750 case T_RestrictInfo:
1751 retval = _equalRestrictInfo(a, b);
1754 retval = _equalJoinInfo(a, b);
1756 case T_InnerIndexscanInfo:
1757 retval = _equalInnerIndexscanInfo(a, b);
1762 List *la = (List *) a;
1763 List *lb = (List *) b;
1767 * Try to reject by length check before we grovel through
1768 * all the elements...
1770 if (length(la) != length(lb))
1774 if (!equal(lfirst(l), lfirst(lb)))
1787 retval = _equalValue(a, b);
1791 retval = _equalQuery(a, b);
1794 retval = _equalInsertStmt(a, b);
1797 retval = _equalDeleteStmt(a, b);
1800 retval = _equalUpdateStmt(a, b);
1803 retval = _equalSelectStmt(a, b);
1805 case T_SetOperationStmt:
1806 retval = _equalSetOperationStmt(a, b);
1808 case T_AlterTableStmt:
1809 retval = _equalAlterTableStmt(a, b);
1812 retval = _equalGrantStmt(a, b);
1814 case T_ClosePortalStmt:
1815 retval = _equalClosePortalStmt(a, b);
1818 retval = _equalClusterStmt(a, b);
1821 retval = _equalCopyStmt(a, b);
1824 retval = _equalCreateStmt(a, b);
1827 retval = _equalDefineStmt(a, b);
1830 retval = _equalDropStmt(a, b);
1832 case T_TruncateStmt:
1833 retval = _equalTruncateStmt(a, b);
1836 retval = _equalCommentStmt(a, b);
1839 retval = _equalFetchStmt(a, b);
1842 retval = _equalIndexStmt(a, b);
1844 case T_CreateFunctionStmt:
1845 retval = _equalCreateFunctionStmt(a, b);
1847 case T_RemoveAggrStmt:
1848 retval = _equalRemoveAggrStmt(a, b);
1850 case T_RemoveFuncStmt:
1851 retval = _equalRemoveFuncStmt(a, b);
1853 case T_RemoveOperStmt:
1854 retval = _equalRemoveOperStmt(a, b);
1856 case T_RemoveOpClassStmt:
1857 retval = _equalRemoveOpClassStmt(a, b);
1860 retval = _equalRenameStmt(a, b);
1863 retval = _equalRuleStmt(a, b);
1866 retval = _equalNotifyStmt(a, b);
1869 retval = _equalListenStmt(a, b);
1871 case T_UnlistenStmt:
1872 retval = _equalUnlistenStmt(a, b);
1874 case T_TransactionStmt:
1875 retval = _equalTransactionStmt(a, b);
1877 case T_CompositeTypeStmt:
1878 retval = _equalCompositeTypeStmt(a, b);
1881 retval = _equalViewStmt(a, b);
1884 retval = _equalLoadStmt(a, b);
1886 case T_CreateDomainStmt:
1887 retval = _equalCreateDomainStmt(a, b);
1889 case T_CreateOpClassStmt:
1890 retval = _equalCreateOpClassStmt(a, b);
1892 case T_CreateOpClassItem:
1893 retval = _equalCreateOpClassItem(a, b);
1895 case T_CreatedbStmt:
1896 retval = _equalCreatedbStmt(a, b);
1898 case T_AlterDatabaseSetStmt:
1899 retval = _equalAlterDatabaseSetStmt(a, b);
1902 retval = _equalDropdbStmt(a, b);
1905 retval = _equalVacuumStmt(a, b);
1908 retval = _equalExplainStmt(a, b);
1910 case T_CreateSeqStmt:
1911 retval = _equalCreateSeqStmt(a, b);
1913 case T_VariableSetStmt:
1914 retval = _equalVariableSetStmt(a, b);
1916 case T_VariableShowStmt:
1917 retval = _equalVariableShowStmt(a, b);
1919 case T_VariableResetStmt:
1920 retval = _equalVariableResetStmt(a, b);
1922 case T_CreateTrigStmt:
1923 retval = _equalCreateTrigStmt(a, b);
1925 case T_DropPropertyStmt:
1926 retval = _equalDropPropertyStmt(a, b);
1928 case T_CreatePLangStmt:
1929 retval = _equalCreatePLangStmt(a, b);
1931 case T_DropPLangStmt:
1932 retval = _equalDropPLangStmt(a, b);
1934 case T_CreateUserStmt:
1935 retval = _equalCreateUserStmt(a, b);
1937 case T_AlterUserStmt:
1938 retval = _equalAlterUserStmt(a, b);
1940 case T_AlterUserSetStmt:
1941 retval = _equalAlterUserSetStmt(a, b);
1943 case T_DropUserStmt:
1944 retval = _equalDropUserStmt(a, b);
1947 retval = _equalLockStmt(a, b);
1949 case T_ConstraintsSetStmt:
1950 retval = _equalConstraintsSetStmt(a, b);
1952 case T_CreateGroupStmt:
1953 retval = _equalCreateGroupStmt(a, b);
1955 case T_AlterGroupStmt:
1956 retval = _equalAlterGroupStmt(a, b);
1958 case T_DropGroupStmt:
1959 retval = _equalDropGroupStmt(a, b);
1962 retval = _equalReindexStmt(a, b);
1964 case T_CheckPointStmt:
1967 case T_CreateSchemaStmt:
1968 retval = _equalCreateSchemaStmt(a, b);
1970 case T_CreateConversionStmt:
1971 retval = _equalCreateConversionStmt(a, b);
1973 case T_CreateCastStmt:
1974 retval = _equalCreateCastStmt(a, b);
1976 case T_DropCastStmt:
1977 retval = _equalDropCastStmt(a, b);
1980 retval = _equalPrepareStmt(a, b);
1983 retval = _equalExecuteStmt(a, b);
1985 case T_DeallocateStmt:
1986 retval = _equalDeallocateStmt(a, b);
1990 retval = _equalAExpr(a, b);
1993 retval = _equalColumnRef(a, b);
1996 retval = _equalParamRef(a, b);
1999 retval = _equalAConst(a, b);
2002 retval = _equalFuncCall(a, b);
2005 retval = _equalAIndices(a, b);
2007 case T_ExprFieldSelect:
2008 retval = _equalExprFieldSelect(a, b);
2011 retval = _equalResTarget(a, b);
2014 retval = _equalTypeCast(a, b);
2017 retval = _equalSortGroupBy(a, b);
2020 retval = _equalAlias(a, b);
2023 retval = _equalRangeVar(a, b);
2025 case T_RangeSubselect:
2026 retval = _equalRangeSubselect(a, b);
2028 case T_RangeFunction:
2029 retval = _equalRangeFunction(a, b);
2032 retval = _equalTypeName(a, b);
2035 retval = _equalIndexElem(a, b);
2038 retval = _equalColumnDef(a, b);
2041 retval = _equalConstraint(a, b);
2044 retval = _equalDefElem(a, b);
2047 retval = _equalTargetEntry(a, b);
2049 case T_RangeTblEntry:
2050 retval = _equalRangeTblEntry(a, b);
2053 retval = _equalSortClause(a, b);
2056 /* GroupClause is equivalent to SortClause */
2057 retval = _equalSortClause(a, b);
2060 retval = _equalCaseExpr(a, b);
2063 retval = _equalCaseWhen(a, b);
2066 retval = _equalNullTest(a, b);
2069 retval = _equalBooleanTest(a, b);
2071 case T_ConstraintTest:
2072 retval = _equalConstraintTest(a, b);
2074 case T_ConstraintTestValue:
2075 retval = _equalConstraintTestValue(a, b);
2077 case T_FkConstraint:
2078 retval = _equalFkConstraint(a, b);
2081 retval = _equalPrivGrantee(a, b);
2083 case T_FuncWithArgs:
2084 retval = _equalFuncWithArgs(a, b);
2086 case T_InsertDefault:
2087 retval = _equalInsertDefault(a, b);
2089 case T_DomainConstraintValue:
2090 retval = _equalDomainConstraintValue(a, b);
2094 elog(WARNING, "equal: don't know whether nodes of type %d are equal",