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.168 2002/11/25 03:33:27 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);
193 /* XXX What about constisset and constiscast? */
196 * We treat all NULL constants of the same type as equal. Someday this
197 * might need to change? But datumIsEqual doesn't work on nulls,
202 return datumIsEqual(a->constvalue, b->constvalue,
203 a->constbyval, a->constlen);
207 _equalParam(Param *a, Param *b)
209 COMPARE_SCALAR_FIELD(paramkind);
210 COMPARE_SCALAR_FIELD(paramtype);
212 switch (a->paramkind)
217 COMPARE_STRING_FIELD(paramname);
221 COMPARE_SCALAR_FIELD(paramid);
225 * XXX: Hmmm... What are we supposed to return in this case ??
229 elog(ERROR, "_equalParam: Invalid paramkind value: %d",
237 _equalFunc(Func *a, Func *b)
239 COMPARE_SCALAR_FIELD(funcid);
240 COMPARE_SCALAR_FIELD(funcresulttype);
241 COMPARE_SCALAR_FIELD(funcretset);
243 * Special-case COERCE_DONTCARE, so that pathkeys can build coercion
244 * nodes that are equal() to both explicit and implicit coercions.
246 if (a->funcformat != b->funcformat &&
247 a->funcformat != COERCE_DONTCARE &&
248 b->funcformat != COERCE_DONTCARE)
251 /* Note we do not look at func_fcache; see notes for _equalOper */
257 _equalAggref(Aggref *a, Aggref *b)
259 COMPARE_SCALAR_FIELD(aggfnoid);
260 COMPARE_SCALAR_FIELD(aggtype);
261 COMPARE_NODE_FIELD(target);
262 COMPARE_SCALAR_FIELD(aggstar);
263 COMPARE_SCALAR_FIELD(aggdistinct);
264 /* ignore aggno, which is only a private field for the executor */
270 _equalSubLink(SubLink *a, SubLink *b)
272 COMPARE_SCALAR_FIELD(subLinkType);
273 COMPARE_SCALAR_FIELD(useor);
274 COMPARE_NODE_FIELD(lefthand);
275 COMPARE_NODE_FIELD(oper);
276 COMPARE_NODE_FIELD(subselect);
282 _equalFieldSelect(FieldSelect *a, FieldSelect *b)
284 COMPARE_NODE_FIELD(arg);
285 COMPARE_SCALAR_FIELD(fieldnum);
286 COMPARE_SCALAR_FIELD(resulttype);
287 COMPARE_SCALAR_FIELD(resulttypmod);
293 _equalRelabelType(RelabelType *a, RelabelType *b)
295 COMPARE_NODE_FIELD(arg);
296 COMPARE_SCALAR_FIELD(resulttype);
297 COMPARE_SCALAR_FIELD(resulttypmod);
299 * Special-case COERCE_DONTCARE, so that pathkeys can build coercion
300 * nodes that are equal() to both explicit and implicit coercions.
302 if (a->relabelformat != b->relabelformat &&
303 a->relabelformat != COERCE_DONTCARE &&
304 b->relabelformat != COERCE_DONTCARE)
311 _equalRangeTblRef(RangeTblRef *a, RangeTblRef *b)
313 COMPARE_SCALAR_FIELD(rtindex);
319 _equalJoinExpr(JoinExpr *a, JoinExpr *b)
321 COMPARE_SCALAR_FIELD(jointype);
322 COMPARE_SCALAR_FIELD(isNatural);
323 COMPARE_NODE_FIELD(larg);
324 COMPARE_NODE_FIELD(rarg);
325 COMPARE_NODE_FIELD(using);
326 COMPARE_NODE_FIELD(quals);
327 COMPARE_NODE_FIELD(alias);
328 COMPARE_SCALAR_FIELD(rtindex);
334 _equalFromExpr(FromExpr *a, FromExpr *b)
336 COMPARE_NODE_FIELD(fromlist);
337 COMPARE_NODE_FIELD(quals);
343 _equalArrayRef(ArrayRef *a, ArrayRef *b)
345 COMPARE_SCALAR_FIELD(refrestype);
346 COMPARE_SCALAR_FIELD(refattrlength);
347 COMPARE_SCALAR_FIELD(refelemlength);
348 COMPARE_SCALAR_FIELD(refelembyval);
349 COMPARE_SCALAR_FIELD(refelemalign);
350 COMPARE_NODE_FIELD(refupperindexpr);
351 COMPARE_NODE_FIELD(reflowerindexpr);
352 COMPARE_NODE_FIELD(refexpr);
353 COMPARE_NODE_FIELD(refassgnexpr);
360 * Stuff from plannodes.h
364 _equalSubPlan(SubPlan *a, SubPlan *b)
366 /* should compare plans, but have to settle for comparing plan IDs */
367 COMPARE_SCALAR_FIELD(plan_id);
369 COMPARE_NODE_FIELD(rtable);
370 COMPARE_NODE_FIELD(sublink);
377 * Stuff from relation.h
381 _equalRelOptInfo(RelOptInfo *a, RelOptInfo *b)
384 * We treat RelOptInfos as equal if they refer to the same base rels
385 * joined in the same order. Is this appropriate/sufficient?
387 COMPARE_INTLIST_FIELD(relids);
393 _equalIndexOptInfo(IndexOptInfo *a, IndexOptInfo *b)
396 * We treat IndexOptInfos as equal if they refer to the same index. Is
399 COMPARE_SCALAR_FIELD(indexoid);
405 _equalPath(Path *a, Path *b)
407 /* This is safe only because _equalRelOptInfo is incomplete... */
408 COMPARE_NODE_FIELD(parent);
410 * do not check path costs, since they may not be set yet, and being
411 * float values there are roundoff error issues anyway...
413 COMPARE_SCALAR_FIELD(pathtype);
414 COMPARE_NODE_FIELD(pathkeys);
420 _equalIndexPath(IndexPath *a, IndexPath *b)
422 if (!_equalPath((Path *) a, (Path *) b))
424 COMPARE_NODE_FIELD(indexinfo);
425 COMPARE_NODE_FIELD(indexqual);
426 COMPARE_SCALAR_FIELD(indexscandir);
429 * Skip 'rows' because of possibility of floating-point roundoff
430 * error. It should be derivable from the other fields anyway.
436 _equalTidPath(TidPath *a, TidPath *b)
438 if (!_equalPath((Path *) a, (Path *) b))
440 COMPARE_NODE_FIELD(tideval);
441 COMPARE_INTLIST_FIELD(unjoined_relids);
447 _equalAppendPath(AppendPath *a, AppendPath *b)
449 if (!_equalPath((Path *) a, (Path *) b))
451 COMPARE_NODE_FIELD(subpaths);
457 _equalResultPath(ResultPath *a, ResultPath *b)
459 if (!_equalPath((Path *) a, (Path *) b))
461 COMPARE_NODE_FIELD(subpath);
462 COMPARE_NODE_FIELD(constantqual);
468 _equalJoinPath(JoinPath *a, JoinPath *b)
470 if (!_equalPath((Path *) a, (Path *) b))
472 COMPARE_SCALAR_FIELD(jointype);
473 COMPARE_NODE_FIELD(outerjoinpath);
474 COMPARE_NODE_FIELD(innerjoinpath);
475 COMPARE_NODE_FIELD(joinrestrictinfo);
481 _equalNestPath(NestPath *a, NestPath *b)
483 if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
490 _equalMergePath(MergePath *a, MergePath *b)
492 if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
494 COMPARE_NODE_FIELD(path_mergeclauses);
495 COMPARE_NODE_FIELD(outersortkeys);
496 COMPARE_NODE_FIELD(innersortkeys);
502 _equalHashPath(HashPath *a, HashPath *b)
504 if (!_equalJoinPath((JoinPath *) a, (JoinPath *) b))
506 COMPARE_NODE_FIELD(path_hashclauses);
512 _equalPathKeyItem(PathKeyItem *a, PathKeyItem *b)
514 COMPARE_NODE_FIELD(key);
515 COMPARE_SCALAR_FIELD(sortop);
521 _equalRestrictInfo(RestrictInfo *a, RestrictInfo *b)
523 COMPARE_NODE_FIELD(clause);
524 COMPARE_SCALAR_FIELD(ispusheddown);
526 * We ignore subclauseindices, eval_cost, this_selec, left/right_pathkey,
527 * and left/right_bucketsize, since they may not be set yet, and should be
528 * derivable from the clause anyway. Probably it's not really necessary
529 * to compare any of these remaining fields ...
531 COMPARE_SCALAR_FIELD(mergejoinoperator);
532 COMPARE_SCALAR_FIELD(left_sortop);
533 COMPARE_SCALAR_FIELD(right_sortop);
534 COMPARE_SCALAR_FIELD(hashjoinoperator);
540 _equalJoinInfo(JoinInfo *a, JoinInfo *b)
542 COMPARE_INTLIST_FIELD(unjoined_relids);
543 COMPARE_NODE_FIELD(jinfo_restrictinfo);
549 _equalInnerIndexscanInfo(InnerIndexscanInfo *a, InnerIndexscanInfo *b)
551 COMPARE_INTLIST_FIELD(other_relids);
552 COMPARE_SCALAR_FIELD(isouterjoin);
553 COMPARE_NODE_FIELD(best_innerpath);
560 * Stuff from parsenodes.h
564 _equalQuery(Query *a, Query *b)
566 COMPARE_SCALAR_FIELD(commandType);
567 COMPARE_SCALAR_FIELD(querySource);
568 COMPARE_NODE_FIELD(utilityStmt);
569 COMPARE_SCALAR_FIELD(resultRelation);
570 COMPARE_NODE_FIELD(into);
571 COMPARE_SCALAR_FIELD(isPortal);
572 COMPARE_SCALAR_FIELD(isBinary);
573 COMPARE_SCALAR_FIELD(hasAggs);
574 COMPARE_SCALAR_FIELD(hasSubLinks);
575 COMPARE_NODE_FIELD(rtable);
576 COMPARE_NODE_FIELD(jointree);
577 COMPARE_INTLIST_FIELD(rowMarks);
578 COMPARE_NODE_FIELD(targetList);
579 COMPARE_NODE_FIELD(groupClause);
580 COMPARE_NODE_FIELD(havingQual);
581 COMPARE_NODE_FIELD(distinctClause);
582 COMPARE_NODE_FIELD(sortClause);
583 COMPARE_NODE_FIELD(limitOffset);
584 COMPARE_NODE_FIELD(limitCount);
585 COMPARE_NODE_FIELD(setOperations);
586 COMPARE_INTLIST_FIELD(resultRelations);
589 * We do not check the internal-to-the-planner fields: base_rel_list,
590 * other_rel_list, join_rel_list, equi_key_list, query_pathkeys,
591 * hasJoinRTEs. They might not be set yet, and in any case they should
592 * be derivable from the other fields.
598 _equalInsertStmt(InsertStmt *a, InsertStmt *b)
600 COMPARE_NODE_FIELD(relation);
601 COMPARE_NODE_FIELD(cols);
602 COMPARE_NODE_FIELD(targetList);
603 COMPARE_NODE_FIELD(selectStmt);
609 _equalDeleteStmt(DeleteStmt *a, DeleteStmt *b)
611 COMPARE_NODE_FIELD(relation);
612 COMPARE_NODE_FIELD(whereClause);
618 _equalUpdateStmt(UpdateStmt *a, UpdateStmt *b)
620 COMPARE_NODE_FIELD(relation);
621 COMPARE_NODE_FIELD(targetList);
622 COMPARE_NODE_FIELD(whereClause);
623 COMPARE_NODE_FIELD(fromClause);
629 _equalSelectStmt(SelectStmt *a, SelectStmt *b)
631 COMPARE_NODE_FIELD(distinctClause);
632 COMPARE_NODE_FIELD(into);
633 COMPARE_NODE_FIELD(intoColNames);
634 COMPARE_NODE_FIELD(targetList);
635 COMPARE_NODE_FIELD(fromClause);
636 COMPARE_NODE_FIELD(whereClause);
637 COMPARE_NODE_FIELD(groupClause);
638 COMPARE_NODE_FIELD(havingClause);
639 COMPARE_NODE_FIELD(sortClause);
640 COMPARE_STRING_FIELD(portalname);
641 COMPARE_SCALAR_FIELD(binary);
642 COMPARE_NODE_FIELD(limitOffset);
643 COMPARE_NODE_FIELD(limitCount);
644 COMPARE_NODE_FIELD(forUpdate);
645 COMPARE_SCALAR_FIELD(op);
646 COMPARE_SCALAR_FIELD(all);
647 COMPARE_NODE_FIELD(larg);
648 COMPARE_NODE_FIELD(rarg);
654 _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
656 COMPARE_SCALAR_FIELD(op);
657 COMPARE_SCALAR_FIELD(all);
658 COMPARE_NODE_FIELD(larg);
659 COMPARE_NODE_FIELD(rarg);
660 COMPARE_INTLIST_FIELD(colTypes);
666 _equalAlterTableStmt(AlterTableStmt *a, AlterTableStmt *b)
668 COMPARE_SCALAR_FIELD(subtype);
669 COMPARE_NODE_FIELD(relation);
670 COMPARE_STRING_FIELD(name);
671 COMPARE_NODE_FIELD(def);
672 COMPARE_SCALAR_FIELD(behavior);
678 _equalGrantStmt(GrantStmt *a, GrantStmt *b)
680 COMPARE_SCALAR_FIELD(is_grant);
681 COMPARE_SCALAR_FIELD(objtype);
682 COMPARE_NODE_FIELD(objects);
683 COMPARE_INTLIST_FIELD(privileges);
684 COMPARE_NODE_FIELD(grantees);
690 _equalPrivGrantee(PrivGrantee *a, PrivGrantee *b)
692 COMPARE_STRING_FIELD(username);
693 COMPARE_STRING_FIELD(groupname);
699 _equalFuncWithArgs(FuncWithArgs *a, FuncWithArgs *b)
701 COMPARE_NODE_FIELD(funcname);
702 COMPARE_NODE_FIELD(funcargs);
708 _equalInsertDefault(InsertDefault *a, InsertDefault *b)
714 _equalClosePortalStmt(ClosePortalStmt *a, ClosePortalStmt *b)
716 COMPARE_STRING_FIELD(portalname);
722 _equalClusterStmt(ClusterStmt *a, ClusterStmt *b)
724 COMPARE_NODE_FIELD(relation);
725 COMPARE_STRING_FIELD(indexname);
731 _equalCopyStmt(CopyStmt *a, CopyStmt *b)
733 COMPARE_NODE_FIELD(relation);
734 COMPARE_NODE_FIELD(attlist);
735 COMPARE_SCALAR_FIELD(is_from);
736 COMPARE_STRING_FIELD(filename);
737 COMPARE_NODE_FIELD(options);
743 _equalCreateStmt(CreateStmt *a, CreateStmt *b)
745 COMPARE_NODE_FIELD(relation);
746 COMPARE_NODE_FIELD(tableElts);
747 COMPARE_NODE_FIELD(inhRelations);
748 COMPARE_NODE_FIELD(constraints);
749 COMPARE_SCALAR_FIELD(hasoids);
750 COMPARE_SCALAR_FIELD(oncommit);
756 _equalDefineStmt(DefineStmt *a, DefineStmt *b)
758 COMPARE_SCALAR_FIELD(defType);
759 COMPARE_NODE_FIELD(defnames);
760 COMPARE_NODE_FIELD(definition);
766 _equalDropStmt(DropStmt *a, DropStmt *b)
768 COMPARE_NODE_FIELD(objects);
769 COMPARE_SCALAR_FIELD(removeType);
770 COMPARE_SCALAR_FIELD(behavior);
776 _equalTruncateStmt(TruncateStmt *a, TruncateStmt *b)
778 COMPARE_NODE_FIELD(relation);
784 _equalCommentStmt(CommentStmt *a, CommentStmt *b)
786 COMPARE_SCALAR_FIELD(objtype);
787 COMPARE_NODE_FIELD(objname);
788 COMPARE_NODE_FIELD(objargs);
789 COMPARE_STRING_FIELD(comment);
795 _equalFetchStmt(FetchStmt *a, FetchStmt *b)
797 COMPARE_SCALAR_FIELD(direction);
798 COMPARE_SCALAR_FIELD(howMany);
799 COMPARE_STRING_FIELD(portalname);
800 COMPARE_SCALAR_FIELD(ismove);
806 _equalIndexStmt(IndexStmt *a, IndexStmt *b)
808 COMPARE_STRING_FIELD(idxname);
809 COMPARE_NODE_FIELD(relation);
810 COMPARE_STRING_FIELD(accessMethod);
811 COMPARE_NODE_FIELD(indexParams);
812 COMPARE_NODE_FIELD(whereClause);
813 COMPARE_NODE_FIELD(rangetable);
814 COMPARE_SCALAR_FIELD(unique);
815 COMPARE_SCALAR_FIELD(primary);
816 COMPARE_SCALAR_FIELD(isconstraint);
822 _equalCreateFunctionStmt(CreateFunctionStmt *a, CreateFunctionStmt *b)
824 COMPARE_SCALAR_FIELD(replace);
825 COMPARE_NODE_FIELD(funcname);
826 COMPARE_NODE_FIELD(argTypes);
827 COMPARE_NODE_FIELD(returnType);
828 COMPARE_NODE_FIELD(options);
829 COMPARE_NODE_FIELD(withClause);
835 _equalRemoveAggrStmt(RemoveAggrStmt *a, RemoveAggrStmt *b)
837 COMPARE_NODE_FIELD(aggname);
838 COMPARE_NODE_FIELD(aggtype);
839 COMPARE_SCALAR_FIELD(behavior);
845 _equalRemoveFuncStmt(RemoveFuncStmt *a, RemoveFuncStmt *b)
847 COMPARE_NODE_FIELD(funcname);
848 COMPARE_NODE_FIELD(args);
849 COMPARE_SCALAR_FIELD(behavior);
855 _equalRemoveOperStmt(RemoveOperStmt *a, RemoveOperStmt *b)
857 COMPARE_NODE_FIELD(opname);
858 COMPARE_NODE_FIELD(args);
859 COMPARE_SCALAR_FIELD(behavior);
865 _equalRemoveOpClassStmt(RemoveOpClassStmt *a, RemoveOpClassStmt *b)
867 COMPARE_NODE_FIELD(opclassname);
868 COMPARE_STRING_FIELD(amname);
869 COMPARE_SCALAR_FIELD(behavior);
875 _equalRenameStmt(RenameStmt *a, RenameStmt *b)
877 COMPARE_NODE_FIELD(relation);
878 COMPARE_STRING_FIELD(oldname);
879 COMPARE_STRING_FIELD(newname);
880 COMPARE_SCALAR_FIELD(renameType);
886 _equalRuleStmt(RuleStmt *a, RuleStmt *b)
888 COMPARE_NODE_FIELD(relation);
889 COMPARE_STRING_FIELD(rulename);
890 COMPARE_NODE_FIELD(whereClause);
891 COMPARE_SCALAR_FIELD(event);
892 COMPARE_SCALAR_FIELD(instead);
893 COMPARE_NODE_FIELD(actions);
894 COMPARE_SCALAR_FIELD(replace);
900 _equalNotifyStmt(NotifyStmt *a, NotifyStmt *b)
902 COMPARE_NODE_FIELD(relation);
908 _equalListenStmt(ListenStmt *a, ListenStmt *b)
910 COMPARE_NODE_FIELD(relation);
916 _equalUnlistenStmt(UnlistenStmt *a, UnlistenStmt *b)
918 COMPARE_NODE_FIELD(relation);
924 _equalTransactionStmt(TransactionStmt *a, TransactionStmt *b)
926 COMPARE_SCALAR_FIELD(command);
927 COMPARE_NODE_FIELD(options);
933 _equalCompositeTypeStmt(CompositeTypeStmt *a, CompositeTypeStmt *b)
935 COMPARE_NODE_FIELD(typevar);
936 COMPARE_NODE_FIELD(coldeflist);
942 _equalViewStmt(ViewStmt *a, ViewStmt *b)
944 COMPARE_NODE_FIELD(view);
945 COMPARE_NODE_FIELD(aliases);
946 COMPARE_NODE_FIELD(query);
947 COMPARE_SCALAR_FIELD(replace);
953 _equalLoadStmt(LoadStmt *a, LoadStmt *b)
955 COMPARE_STRING_FIELD(filename);
961 _equalCreateDomainStmt(CreateDomainStmt *a, CreateDomainStmt *b)
963 COMPARE_NODE_FIELD(domainname);
964 COMPARE_NODE_FIELD(typename);
965 COMPARE_NODE_FIELD(constraints);
971 _equalCreateOpClassStmt(CreateOpClassStmt *a, CreateOpClassStmt *b)
973 COMPARE_NODE_FIELD(opclassname);
974 COMPARE_STRING_FIELD(amname);
975 COMPARE_NODE_FIELD(datatype);
976 COMPARE_NODE_FIELD(items);
977 COMPARE_SCALAR_FIELD(isDefault);
983 _equalCreateOpClassItem(CreateOpClassItem *a, CreateOpClassItem *b)
985 COMPARE_SCALAR_FIELD(itemtype);
986 COMPARE_NODE_FIELD(name);
987 COMPARE_NODE_FIELD(args);
988 COMPARE_SCALAR_FIELD(number);
989 COMPARE_SCALAR_FIELD(recheck);
990 COMPARE_NODE_FIELD(storedtype);
996 _equalCreatedbStmt(CreatedbStmt *a, CreatedbStmt *b)
998 COMPARE_STRING_FIELD(dbname);
999 COMPARE_NODE_FIELD(options);
1005 _equalAlterDatabaseSetStmt(AlterDatabaseSetStmt *a, AlterDatabaseSetStmt *b)
1007 COMPARE_STRING_FIELD(dbname);
1008 COMPARE_STRING_FIELD(variable);
1009 COMPARE_NODE_FIELD(value);
1015 _equalDropdbStmt(DropdbStmt *a, DropdbStmt *b)
1017 COMPARE_STRING_FIELD(dbname);
1023 _equalVacuumStmt(VacuumStmt *a, VacuumStmt *b)
1025 COMPARE_SCALAR_FIELD(vacuum);
1026 COMPARE_SCALAR_FIELD(full);
1027 COMPARE_SCALAR_FIELD(analyze);
1028 COMPARE_SCALAR_FIELD(freeze);
1029 COMPARE_SCALAR_FIELD(verbose);
1030 COMPARE_NODE_FIELD(relation);
1031 COMPARE_NODE_FIELD(va_cols);
1037 _equalExplainStmt(ExplainStmt *a, ExplainStmt *b)
1039 COMPARE_NODE_FIELD(query);
1040 COMPARE_SCALAR_FIELD(verbose);
1041 COMPARE_SCALAR_FIELD(analyze);
1047 _equalCreateSeqStmt(CreateSeqStmt *a, CreateSeqStmt *b)
1049 COMPARE_NODE_FIELD(sequence);
1050 COMPARE_NODE_FIELD(options);
1056 _equalVariableSetStmt(VariableSetStmt *a, VariableSetStmt *b)
1058 COMPARE_STRING_FIELD(name);
1059 COMPARE_NODE_FIELD(args);
1060 COMPARE_SCALAR_FIELD(is_local);
1066 _equalVariableShowStmt(VariableShowStmt *a, VariableShowStmt *b)
1068 COMPARE_STRING_FIELD(name);
1074 _equalVariableResetStmt(VariableResetStmt *a, VariableResetStmt *b)
1076 COMPARE_STRING_FIELD(name);
1082 _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
1084 COMPARE_STRING_FIELD(trigname);
1085 COMPARE_NODE_FIELD(relation);
1086 COMPARE_NODE_FIELD(funcname);
1087 COMPARE_NODE_FIELD(args);
1088 COMPARE_SCALAR_FIELD(before);
1089 COMPARE_SCALAR_FIELD(row);
1090 if (strcmp(a->actions, b->actions) != 0) /* in-line string field */
1092 COMPARE_SCALAR_FIELD(isconstraint);
1093 COMPARE_SCALAR_FIELD(deferrable);
1094 COMPARE_SCALAR_FIELD(initdeferred);
1095 COMPARE_NODE_FIELD(constrrel);
1101 _equalDropPropertyStmt(DropPropertyStmt *a, DropPropertyStmt *b)
1103 COMPARE_NODE_FIELD(relation);
1104 COMPARE_STRING_FIELD(property);
1105 COMPARE_SCALAR_FIELD(removeType);
1106 COMPARE_SCALAR_FIELD(behavior);
1112 _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
1114 COMPARE_STRING_FIELD(plname);
1115 COMPARE_NODE_FIELD(plhandler);
1116 COMPARE_NODE_FIELD(plvalidator);
1117 COMPARE_SCALAR_FIELD(pltrusted);
1123 _equalDropPLangStmt(DropPLangStmt *a, DropPLangStmt *b)
1125 COMPARE_STRING_FIELD(plname);
1126 COMPARE_SCALAR_FIELD(behavior);
1132 _equalCreateUserStmt(CreateUserStmt *a, CreateUserStmt *b)
1134 COMPARE_STRING_FIELD(user);
1135 COMPARE_NODE_FIELD(options);
1141 _equalAlterUserStmt(AlterUserStmt *a, AlterUserStmt *b)
1143 COMPARE_STRING_FIELD(user);
1144 COMPARE_NODE_FIELD(options);
1150 _equalAlterUserSetStmt(AlterUserSetStmt *a, AlterUserSetStmt *b)
1152 COMPARE_STRING_FIELD(user);
1153 COMPARE_STRING_FIELD(variable);
1154 COMPARE_NODE_FIELD(value);
1160 _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
1162 COMPARE_NODE_FIELD(users);
1168 _equalLockStmt(LockStmt *a, LockStmt *b)
1170 COMPARE_NODE_FIELD(relations);
1171 COMPARE_SCALAR_FIELD(mode);
1177 _equalConstraintsSetStmt(ConstraintsSetStmt *a, ConstraintsSetStmt *b)
1179 COMPARE_NODE_FIELD(constraints);
1180 COMPARE_SCALAR_FIELD(deferred);
1186 _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
1188 COMPARE_STRING_FIELD(name);
1189 COMPARE_NODE_FIELD(options);
1195 _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
1197 COMPARE_STRING_FIELD(name);
1198 COMPARE_SCALAR_FIELD(action);
1199 COMPARE_NODE_FIELD(listUsers);
1205 _equalDropGroupStmt(DropGroupStmt *a, DropGroupStmt *b)
1207 COMPARE_STRING_FIELD(name);
1213 _equalReindexStmt(ReindexStmt *a, ReindexStmt *b)
1215 COMPARE_SCALAR_FIELD(reindexType);
1216 COMPARE_NODE_FIELD(relation);
1217 COMPARE_STRING_FIELD(name);
1218 COMPARE_SCALAR_FIELD(force);
1219 COMPARE_SCALAR_FIELD(all);
1225 _equalCreateSchemaStmt(CreateSchemaStmt *a, CreateSchemaStmt *b)
1227 COMPARE_STRING_FIELD(schemaname);
1228 COMPARE_STRING_FIELD(authid);
1229 COMPARE_NODE_FIELD(schemaElts);
1235 _equalCreateConversionStmt(CreateConversionStmt *a, CreateConversionStmt *b)
1237 COMPARE_NODE_FIELD(conversion_name);
1238 COMPARE_STRING_FIELD(for_encoding_name);
1239 COMPARE_STRING_FIELD(to_encoding_name);
1240 COMPARE_NODE_FIELD(func_name);
1241 COMPARE_SCALAR_FIELD(def);
1247 _equalCreateCastStmt(CreateCastStmt *a, CreateCastStmt *b)
1249 COMPARE_NODE_FIELD(sourcetype);
1250 COMPARE_NODE_FIELD(targettype);
1251 COMPARE_NODE_FIELD(func);
1252 COMPARE_SCALAR_FIELD(context);
1258 _equalDropCastStmt(DropCastStmt *a, DropCastStmt *b)
1260 COMPARE_NODE_FIELD(sourcetype);
1261 COMPARE_NODE_FIELD(targettype);
1262 COMPARE_SCALAR_FIELD(behavior);
1268 _equalPrepareStmt(PrepareStmt *a, PrepareStmt *b)
1270 COMPARE_STRING_FIELD(name);
1271 COMPARE_NODE_FIELD(argtypes);
1272 COMPARE_INTLIST_FIELD(argtype_oids);
1273 COMPARE_NODE_FIELD(query);
1279 _equalExecuteStmt(ExecuteStmt *a, ExecuteStmt *b)
1281 COMPARE_STRING_FIELD(name);
1282 COMPARE_NODE_FIELD(into);
1283 COMPARE_NODE_FIELD(params);
1289 _equalDeallocateStmt(DeallocateStmt *a, DeallocateStmt *b)
1291 COMPARE_STRING_FIELD(name);
1298 * stuff from parsenodes.h
1302 _equalAExpr(A_Expr *a, A_Expr *b)
1304 COMPARE_SCALAR_FIELD(oper);
1305 COMPARE_NODE_FIELD(name);
1306 COMPARE_NODE_FIELD(lexpr);
1307 COMPARE_NODE_FIELD(rexpr);
1313 _equalColumnRef(ColumnRef *a, ColumnRef *b)
1315 COMPARE_NODE_FIELD(fields);
1316 COMPARE_NODE_FIELD(indirection);
1322 _equalParamRef(ParamRef *a, ParamRef *b)
1324 COMPARE_SCALAR_FIELD(number);
1325 COMPARE_NODE_FIELD(fields);
1326 COMPARE_NODE_FIELD(indirection);
1332 _equalAConst(A_Const *a, A_Const *b)
1334 if (!equal(&a->val, &b->val)) /* hack for in-line Value field */
1336 COMPARE_NODE_FIELD(typename);
1342 _equalFuncCall(FuncCall *a, FuncCall *b)
1344 COMPARE_NODE_FIELD(funcname);
1345 COMPARE_NODE_FIELD(args);
1346 COMPARE_SCALAR_FIELD(agg_star);
1347 COMPARE_SCALAR_FIELD(agg_distinct);
1353 _equalAIndices(A_Indices *a, A_Indices *b)
1355 COMPARE_NODE_FIELD(lidx);
1356 COMPARE_NODE_FIELD(uidx);
1362 _equalExprFieldSelect(ExprFieldSelect *a, ExprFieldSelect *b)
1364 COMPARE_NODE_FIELD(arg);
1365 COMPARE_NODE_FIELD(fields);
1366 COMPARE_NODE_FIELD(indirection);
1372 _equalResTarget(ResTarget *a, ResTarget *b)
1374 COMPARE_STRING_FIELD(name);
1375 COMPARE_NODE_FIELD(indirection);
1376 COMPARE_NODE_FIELD(val);
1382 _equalTypeName(TypeName *a, TypeName *b)
1384 COMPARE_NODE_FIELD(names);
1385 COMPARE_SCALAR_FIELD(typeid);
1386 COMPARE_SCALAR_FIELD(timezone);
1387 COMPARE_SCALAR_FIELD(setof);
1388 COMPARE_SCALAR_FIELD(pct_type);
1389 COMPARE_SCALAR_FIELD(typmod);
1390 COMPARE_NODE_FIELD(arrayBounds);
1396 _equalTypeCast(TypeCast *a, TypeCast *b)
1398 COMPARE_NODE_FIELD(arg);
1399 COMPARE_NODE_FIELD(typename);
1405 _equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
1407 COMPARE_NODE_FIELD(useOp);
1408 COMPARE_NODE_FIELD(node);
1414 _equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
1416 COMPARE_NODE_FIELD(subquery);
1417 COMPARE_NODE_FIELD(alias);
1423 _equalRangeFunction(RangeFunction *a, RangeFunction *b)
1425 COMPARE_NODE_FIELD(funccallnode);
1426 COMPARE_NODE_FIELD(alias);
1427 COMPARE_NODE_FIELD(coldeflist);
1433 _equalIndexElem(IndexElem *a, IndexElem *b)
1435 COMPARE_STRING_FIELD(name);
1436 COMPARE_NODE_FIELD(funcname);
1437 COMPARE_NODE_FIELD(args);
1438 COMPARE_NODE_FIELD(opclass);
1444 _equalColumnDef(ColumnDef *a, ColumnDef *b)
1446 COMPARE_STRING_FIELD(colname);
1447 COMPARE_NODE_FIELD(typename);
1448 COMPARE_SCALAR_FIELD(inhcount);
1449 COMPARE_SCALAR_FIELD(is_local);
1450 COMPARE_SCALAR_FIELD(is_not_null);
1451 COMPARE_NODE_FIELD(raw_default);
1452 COMPARE_STRING_FIELD(cooked_default);
1453 COMPARE_NODE_FIELD(constraints);
1454 COMPARE_NODE_FIELD(support);
1460 _equalConstraint(Constraint *a, Constraint *b)
1462 COMPARE_SCALAR_FIELD(contype);
1463 COMPARE_STRING_FIELD(name);
1464 COMPARE_NODE_FIELD(raw_expr);
1465 COMPARE_STRING_FIELD(cooked_expr);
1466 COMPARE_NODE_FIELD(keys);
1472 _equalDefElem(DefElem *a, DefElem *b)
1474 COMPARE_STRING_FIELD(defname);
1475 COMPARE_NODE_FIELD(arg);
1481 _equalTargetEntry(TargetEntry *a, TargetEntry *b)
1483 COMPARE_NODE_FIELD(resdom);
1484 COMPARE_NODE_FIELD(fjoin);
1485 COMPARE_NODE_FIELD(expr);
1491 _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
1493 COMPARE_SCALAR_FIELD(rtekind);
1494 COMPARE_SCALAR_FIELD(relid);
1495 COMPARE_NODE_FIELD(subquery);
1496 COMPARE_NODE_FIELD(funcexpr);
1497 COMPARE_NODE_FIELD(coldeflist);
1498 COMPARE_SCALAR_FIELD(jointype);
1499 COMPARE_NODE_FIELD(joinaliasvars);
1500 COMPARE_NODE_FIELD(alias);
1501 COMPARE_NODE_FIELD(eref);
1502 COMPARE_SCALAR_FIELD(inh);
1503 COMPARE_SCALAR_FIELD(inFromCl);
1504 COMPARE_SCALAR_FIELD(checkForRead);
1505 COMPARE_SCALAR_FIELD(checkForWrite);
1506 COMPARE_SCALAR_FIELD(checkAsUser);
1512 _equalSortClause(SortClause *a, SortClause *b)
1514 COMPARE_SCALAR_FIELD(tleSortGroupRef);
1515 COMPARE_SCALAR_FIELD(sortop);
1521 _equalFkConstraint(FkConstraint *a, FkConstraint *b)
1523 COMPARE_STRING_FIELD(constr_name);
1524 COMPARE_NODE_FIELD(pktable);
1525 COMPARE_NODE_FIELD(fk_attrs);
1526 COMPARE_NODE_FIELD(pk_attrs);
1527 COMPARE_SCALAR_FIELD(fk_matchtype);
1528 COMPARE_SCALAR_FIELD(fk_upd_action);
1529 COMPARE_SCALAR_FIELD(fk_del_action);
1530 COMPARE_SCALAR_FIELD(deferrable);
1531 COMPARE_SCALAR_FIELD(initdeferred);
1532 COMPARE_SCALAR_FIELD(skip_validation);
1538 _equalCaseExpr(CaseExpr *a, CaseExpr *b)
1540 COMPARE_SCALAR_FIELD(casetype);
1541 COMPARE_NODE_FIELD(arg);
1542 COMPARE_NODE_FIELD(args);
1543 COMPARE_NODE_FIELD(defresult);
1549 _equalCaseWhen(CaseWhen *a, CaseWhen *b)
1551 COMPARE_NODE_FIELD(expr);
1552 COMPARE_NODE_FIELD(result);
1558 _equalNullTest(NullTest *a, NullTest *b)
1560 COMPARE_NODE_FIELD(arg);
1561 COMPARE_SCALAR_FIELD(nulltesttype);
1567 _equalBooleanTest(BooleanTest *a, BooleanTest *b)
1569 COMPARE_NODE_FIELD(arg);
1570 COMPARE_SCALAR_FIELD(booltesttype);
1576 _equalConstraintTest(ConstraintTest *a, ConstraintTest *b)
1578 COMPARE_NODE_FIELD(arg);
1579 COMPARE_SCALAR_FIELD(testtype);
1580 COMPARE_STRING_FIELD(name);
1581 COMPARE_STRING_FIELD(domname);
1582 COMPARE_NODE_FIELD(check_expr);
1588 _equalDomainConstraintValue(DomainConstraintValue *a, DomainConstraintValue *b)
1594 _equalConstraintTestValue(ConstraintTestValue *a, ConstraintTestValue *b)
1596 COMPARE_SCALAR_FIELD(typeId);
1597 COMPARE_SCALAR_FIELD(typeMod);
1604 * Stuff from pg_list.h
1608 _equalValue(Value *a, Value *b)
1610 COMPARE_SCALAR_FIELD(type);
1615 COMPARE_SCALAR_FIELD(val.ival);
1620 COMPARE_STRING_FIELD(val.str);
1626 elog(ERROR, "_equalValue: unknown node type %d", a->type);
1635 * returns whether two nodes are equal
1638 equal(void *a, void *b)
1640 bool retval = false;
1646 * note that a!=b, so only one of them can be NULL
1648 if (a == NULL || b == NULL)
1652 * are they the same type of nodes?
1654 if (nodeTag(a) != nodeTag(b))
1660 retval = _equalSubPlan(a, b);
1664 retval = _equalResdom(a, b);
1667 retval = _equalFjoin(a, b);
1670 retval = _equalExpr(a, b);
1673 retval = _equalVar(a, b);
1676 retval = _equalOper(a, b);
1679 retval = _equalConst(a, b);
1682 retval = _equalParam(a, b);
1685 retval = _equalAggref(a, b);
1688 retval = _equalSubLink(a, b);
1691 retval = _equalFunc(a, b);
1694 retval = _equalFieldSelect(a, b);
1697 retval = _equalArrayRef(a, b);
1700 retval = _equalRelabelType(a, b);
1703 retval = _equalRangeTblRef(a, b);
1706 retval = _equalFromExpr(a, b);
1709 retval = _equalJoinExpr(a, b);
1713 retval = _equalRelOptInfo(a, b);
1716 retval = _equalPath(a, b);
1719 retval = _equalIndexPath(a, b);
1722 retval = _equalNestPath(a, b);
1725 retval = _equalMergePath(a, b);
1728 retval = _equalHashPath(a, b);
1731 retval = _equalPathKeyItem(a, b);
1733 case T_RestrictInfo:
1734 retval = _equalRestrictInfo(a, b);
1737 retval = _equalJoinInfo(a, b);
1739 case T_InnerIndexscanInfo:
1740 retval = _equalInnerIndexscanInfo(a, b);
1743 retval = _equalTidPath(a, b);
1746 retval = _equalAppendPath(a, b);
1749 retval = _equalResultPath(a, b);
1751 case T_IndexOptInfo:
1752 retval = _equalIndexOptInfo(a, b);
1757 List *la = (List *) a;
1758 List *lb = (List *) b;
1762 * Try to reject by length check before we grovel through
1763 * all the elements...
1765 if (length(la) != length(lb))
1769 if (!equal(lfirst(l), lfirst(lb)))
1782 retval = _equalValue(a, b);
1786 retval = _equalQuery(a, b);
1789 retval = _equalInsertStmt(a, b);
1792 retval = _equalDeleteStmt(a, b);
1795 retval = _equalUpdateStmt(a, b);
1798 retval = _equalSelectStmt(a, b);
1800 case T_SetOperationStmt:
1801 retval = _equalSetOperationStmt(a, b);
1803 case T_AlterTableStmt:
1804 retval = _equalAlterTableStmt(a, b);
1807 retval = _equalGrantStmt(a, b);
1809 case T_ClosePortalStmt:
1810 retval = _equalClosePortalStmt(a, b);
1813 retval = _equalClusterStmt(a, b);
1816 retval = _equalCopyStmt(a, b);
1819 retval = _equalCreateStmt(a, b);
1822 retval = _equalDefineStmt(a, b);
1825 retval = _equalDropStmt(a, b);
1827 case T_TruncateStmt:
1828 retval = _equalTruncateStmt(a, b);
1831 retval = _equalCommentStmt(a, b);
1834 retval = _equalFetchStmt(a, b);
1837 retval = _equalIndexStmt(a, b);
1839 case T_CreateFunctionStmt:
1840 retval = _equalCreateFunctionStmt(a, b);
1842 case T_RemoveAggrStmt:
1843 retval = _equalRemoveAggrStmt(a, b);
1845 case T_RemoveFuncStmt:
1846 retval = _equalRemoveFuncStmt(a, b);
1848 case T_RemoveOperStmt:
1849 retval = _equalRemoveOperStmt(a, b);
1851 case T_RemoveOpClassStmt:
1852 retval = _equalRemoveOpClassStmt(a, b);
1855 retval = _equalRenameStmt(a, b);
1858 retval = _equalRuleStmt(a, b);
1861 retval = _equalNotifyStmt(a, b);
1864 retval = _equalListenStmt(a, b);
1866 case T_UnlistenStmt:
1867 retval = _equalUnlistenStmt(a, b);
1869 case T_TransactionStmt:
1870 retval = _equalTransactionStmt(a, b);
1872 case T_CompositeTypeStmt:
1873 retval = _equalCompositeTypeStmt(a, b);
1876 retval = _equalViewStmt(a, b);
1879 retval = _equalLoadStmt(a, b);
1881 case T_CreateDomainStmt:
1882 retval = _equalCreateDomainStmt(a, b);
1884 case T_CreateOpClassStmt:
1885 retval = _equalCreateOpClassStmt(a, b);
1887 case T_CreateOpClassItem:
1888 retval = _equalCreateOpClassItem(a, b);
1890 case T_CreatedbStmt:
1891 retval = _equalCreatedbStmt(a, b);
1893 case T_AlterDatabaseSetStmt:
1894 retval = _equalAlterDatabaseSetStmt(a, b);
1897 retval = _equalDropdbStmt(a, b);
1900 retval = _equalVacuumStmt(a, b);
1903 retval = _equalExplainStmt(a, b);
1905 case T_CreateSeqStmt:
1906 retval = _equalCreateSeqStmt(a, b);
1908 case T_VariableSetStmt:
1909 retval = _equalVariableSetStmt(a, b);
1911 case T_VariableShowStmt:
1912 retval = _equalVariableShowStmt(a, b);
1914 case T_VariableResetStmt:
1915 retval = _equalVariableResetStmt(a, b);
1917 case T_CreateTrigStmt:
1918 retval = _equalCreateTrigStmt(a, b);
1920 case T_DropPropertyStmt:
1921 retval = _equalDropPropertyStmt(a, b);
1923 case T_CreatePLangStmt:
1924 retval = _equalCreatePLangStmt(a, b);
1926 case T_DropPLangStmt:
1927 retval = _equalDropPLangStmt(a, b);
1929 case T_CreateUserStmt:
1930 retval = _equalCreateUserStmt(a, b);
1932 case T_AlterUserStmt:
1933 retval = _equalAlterUserStmt(a, b);
1935 case T_AlterUserSetStmt:
1936 retval = _equalAlterUserSetStmt(a, b);
1938 case T_DropUserStmt:
1939 retval = _equalDropUserStmt(a, b);
1942 retval = _equalLockStmt(a, b);
1944 case T_ConstraintsSetStmt:
1945 retval = _equalConstraintsSetStmt(a, b);
1947 case T_CreateGroupStmt:
1948 retval = _equalCreateGroupStmt(a, b);
1950 case T_AlterGroupStmt:
1951 retval = _equalAlterGroupStmt(a, b);
1953 case T_DropGroupStmt:
1954 retval = _equalDropGroupStmt(a, b);
1957 retval = _equalReindexStmt(a, b);
1959 case T_CheckPointStmt:
1962 case T_CreateSchemaStmt:
1963 retval = _equalCreateSchemaStmt(a, b);
1965 case T_CreateConversionStmt:
1966 retval = _equalCreateConversionStmt(a, b);
1968 case T_CreateCastStmt:
1969 retval = _equalCreateCastStmt(a, b);
1971 case T_DropCastStmt:
1972 retval = _equalDropCastStmt(a, b);
1975 retval = _equalPrepareStmt(a, b);
1978 retval = _equalExecuteStmt(a, b);
1980 case T_DeallocateStmt:
1981 retval = _equalDeallocateStmt(a, b);
1985 retval = _equalAExpr(a, b);
1988 retval = _equalColumnRef(a, b);
1991 retval = _equalParamRef(a, b);
1994 retval = _equalAConst(a, b);
1997 retval = _equalFuncCall(a, b);
2000 retval = _equalAIndices(a, b);
2002 case T_ExprFieldSelect:
2003 retval = _equalExprFieldSelect(a, b);
2006 retval = _equalResTarget(a, b);
2009 retval = _equalTypeCast(a, b);
2012 retval = _equalSortGroupBy(a, b);
2015 retval = _equalAlias(a, b);
2018 retval = _equalRangeVar(a, b);
2020 case T_RangeSubselect:
2021 retval = _equalRangeSubselect(a, b);
2023 case T_RangeFunction:
2024 retval = _equalRangeFunction(a, b);
2027 retval = _equalTypeName(a, b);
2030 retval = _equalIndexElem(a, b);
2033 retval = _equalColumnDef(a, b);
2036 retval = _equalConstraint(a, b);
2039 retval = _equalDefElem(a, b);
2042 retval = _equalTargetEntry(a, b);
2044 case T_RangeTblEntry:
2045 retval = _equalRangeTblEntry(a, b);
2048 retval = _equalSortClause(a, b);
2051 /* GroupClause is equivalent to SortClause */
2052 retval = _equalSortClause(a, b);
2055 retval = _equalCaseExpr(a, b);
2058 retval = _equalCaseWhen(a, b);
2061 retval = _equalNullTest(a, b);
2064 retval = _equalBooleanTest(a, b);
2066 case T_ConstraintTest:
2067 retval = _equalConstraintTest(a, b);
2069 case T_ConstraintTestValue:
2070 retval = _equalConstraintTestValue(a, b);
2072 case T_FkConstraint:
2073 retval = _equalFkConstraint(a, b);
2076 retval = _equalPrivGrantee(a, b);
2078 case T_FuncWithArgs:
2079 retval = _equalFuncWithArgs(a, b);
2081 case T_InsertDefault:
2082 retval = _equalInsertDefault(a, b);
2084 case T_DomainConstraintValue:
2085 retval = _equalDomainConstraintValue(a, b);
2089 elog(WARNING, "equal: don't know whether nodes of type %d are equal",