1 /*-------------------------------------------------------------------------
4 * Equality functions to compare node trees.
6 * NOTE: we currently support comparing all node types found in parse
7 * trees. We do not support comparing executor state trees; there
8 * is no need for that, and no point in maintaining all the code that
9 * would be needed. We also do not support comparing Path trees, mainly
10 * because the circular linkages between RelOptInfo and Path nodes can't
11 * be handled easily in a simple depth-first traversal.
13 * Currently, in fact, equal() doesn't know how to compare Plan trees
14 * either. This might need to be fixed someday.
17 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
18 * Portions Copyright (c) 1994, Regents of the University of California
21 * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.176 2002/12/12 20:35:12 tgl Exp $
23 *-------------------------------------------------------------------------
28 #include "nodes/params.h"
29 #include "nodes/parsenodes.h"
30 #include "nodes/relation.h"
31 #include "utils/datum.h"
35 * Macros to simplify comparison of different kinds of fields. Use these
36 * wherever possible to reduce the chance for silly typos. Note that these
37 * hard-wire the convention that the local variables in an Equal routine are
41 /* Compare a simple scalar field (int, float, bool, enum, etc) */
42 #define COMPARE_SCALAR_FIELD(fldname) \
44 if (a->fldname != b->fldname) \
48 /* Compare a field that is a pointer to some kind of Node or Node tree */
49 #define COMPARE_NODE_FIELD(fldname) \
51 if (!equal(a->fldname, b->fldname)) \
55 /* Compare a field that is a pointer to a list of integers */
56 #define COMPARE_INTLIST_FIELD(fldname) \
58 if (!equali(a->fldname, b->fldname)) \
62 /* Compare a field that is a pointer to a C string, or perhaps NULL */
63 #define COMPARE_STRING_FIELD(fldname) \
65 if (!equalstr(a->fldname, b->fldname)) \
69 /* Macro for comparing string fields that might be NULL */
70 #define equalstr(a, b) \
71 (((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))
73 /* Compare a field that is a pointer to a simple palloc'd object of size sz */
74 #define COMPARE_POINTER_FIELD(fldname, sz) \
76 if (memcmp(a->fldname, b->fldname, (sz)) != 0) \
82 * Stuff from primnodes.h
86 _equalResdom(Resdom *a, Resdom *b)
88 COMPARE_SCALAR_FIELD(resno);
89 COMPARE_SCALAR_FIELD(restype);
90 COMPARE_SCALAR_FIELD(restypmod);
91 COMPARE_STRING_FIELD(resname);
92 COMPARE_SCALAR_FIELD(ressortgroupref);
93 COMPARE_SCALAR_FIELD(reskey);
94 COMPARE_SCALAR_FIELD(reskeyop);
95 COMPARE_SCALAR_FIELD(resjunk);
101 _equalAlias(Alias *a, Alias *b)
103 COMPARE_STRING_FIELD(aliasname);
104 COMPARE_NODE_FIELD(colnames);
110 _equalRangeVar(RangeVar *a, RangeVar *b)
112 COMPARE_STRING_FIELD(catalogname);
113 COMPARE_STRING_FIELD(schemaname);
114 COMPARE_STRING_FIELD(relname);
115 COMPARE_SCALAR_FIELD(inhOpt);
116 COMPARE_SCALAR_FIELD(istemp);
117 COMPARE_NODE_FIELD(alias);
123 * We don't need an _equalExpr because Expr is an abstract supertype which
124 * should never actually get instantiated. Also, since it has no common
125 * fields except NodeTag, there's no need for a helper routine to factor
126 * out comparing the common fields...
130 _equalVar(Var *a, Var *b)
132 COMPARE_SCALAR_FIELD(varno);
133 COMPARE_SCALAR_FIELD(varattno);
134 COMPARE_SCALAR_FIELD(vartype);
135 COMPARE_SCALAR_FIELD(vartypmod);
136 COMPARE_SCALAR_FIELD(varlevelsup);
137 COMPARE_SCALAR_FIELD(varnoold);
138 COMPARE_SCALAR_FIELD(varoattno);
144 _equalConst(Const *a, Const *b)
146 COMPARE_SCALAR_FIELD(consttype);
147 COMPARE_SCALAR_FIELD(constlen);
148 COMPARE_SCALAR_FIELD(constisnull);
149 COMPARE_SCALAR_FIELD(constbyval);
152 * We treat all NULL constants of the same type as equal. Someday this
153 * might need to change? But datumIsEqual doesn't work on nulls,
158 return datumIsEqual(a->constvalue, b->constvalue,
159 a->constbyval, a->constlen);
163 _equalParam(Param *a, Param *b)
165 COMPARE_SCALAR_FIELD(paramkind);
166 COMPARE_SCALAR_FIELD(paramtype);
168 switch (a->paramkind)
171 COMPARE_STRING_FIELD(paramname);
175 COMPARE_SCALAR_FIELD(paramid);
178 elog(ERROR, "_equalParam: Invalid paramkind value: %d",
186 _equalAggref(Aggref *a, Aggref *b)
188 COMPARE_SCALAR_FIELD(aggfnoid);
189 COMPARE_SCALAR_FIELD(aggtype);
190 COMPARE_NODE_FIELD(target);
191 COMPARE_SCALAR_FIELD(aggstar);
192 COMPARE_SCALAR_FIELD(aggdistinct);
198 _equalArrayRef(ArrayRef *a, ArrayRef *b)
200 COMPARE_SCALAR_FIELD(refrestype);
201 COMPARE_SCALAR_FIELD(refattrlength);
202 COMPARE_SCALAR_FIELD(refelemlength);
203 COMPARE_SCALAR_FIELD(refelembyval);
204 COMPARE_SCALAR_FIELD(refelemalign);
205 COMPARE_NODE_FIELD(refupperindexpr);
206 COMPARE_NODE_FIELD(reflowerindexpr);
207 COMPARE_NODE_FIELD(refexpr);
208 COMPARE_NODE_FIELD(refassgnexpr);
214 _equalFuncExpr(FuncExpr *a, FuncExpr *b)
216 COMPARE_SCALAR_FIELD(funcid);
217 COMPARE_SCALAR_FIELD(funcresulttype);
218 COMPARE_SCALAR_FIELD(funcretset);
220 * Special-case COERCE_DONTCARE, so that pathkeys can build coercion
221 * nodes that are equal() to both explicit and implicit coercions.
223 if (a->funcformat != b->funcformat &&
224 a->funcformat != COERCE_DONTCARE &&
225 b->funcformat != COERCE_DONTCARE)
228 COMPARE_NODE_FIELD(args);
234 _equalOpExpr(OpExpr *a, OpExpr *b)
236 COMPARE_SCALAR_FIELD(opno);
238 * Special-case opfuncid: it is allowable for it to differ if one
239 * node contains zero and the other doesn't. This just means that the
240 * one node isn't as far along in the parse/plan pipeline and hasn't
241 * had the opfuncid cache filled yet.
243 if (a->opfuncid != b->opfuncid &&
248 COMPARE_SCALAR_FIELD(opresulttype);
249 COMPARE_SCALAR_FIELD(opretset);
250 COMPARE_NODE_FIELD(args);
256 _equalDistinctExpr(DistinctExpr *a, DistinctExpr *b)
258 COMPARE_SCALAR_FIELD(opno);
260 * Special-case opfuncid: it is allowable for it to differ if one
261 * node contains zero and the other doesn't. This just means that the
262 * one node isn't as far along in the parse/plan pipeline and hasn't
263 * had the opfuncid cache filled yet.
265 if (a->opfuncid != b->opfuncid &&
270 COMPARE_SCALAR_FIELD(opresulttype);
271 COMPARE_SCALAR_FIELD(opretset);
272 COMPARE_NODE_FIELD(args);
278 _equalBoolExpr(BoolExpr *a, BoolExpr *b)
280 COMPARE_SCALAR_FIELD(boolop);
281 COMPARE_NODE_FIELD(args);
287 _equalSubLink(SubLink *a, SubLink *b)
289 COMPARE_SCALAR_FIELD(subLinkType);
290 COMPARE_SCALAR_FIELD(useor);
291 COMPARE_NODE_FIELD(lefthand);
292 COMPARE_NODE_FIELD(oper);
293 COMPARE_NODE_FIELD(subselect);
299 _equalSubPlanExpr(SubPlanExpr *a, SubPlanExpr *b)
301 COMPARE_SCALAR_FIELD(typeOid);
302 /* should compare plans, but have to settle for comparing plan IDs */
303 COMPARE_SCALAR_FIELD(plan_id);
304 COMPARE_NODE_FIELD(rtable);
305 COMPARE_INTLIST_FIELD(setParam);
306 COMPARE_INTLIST_FIELD(parParam);
307 COMPARE_NODE_FIELD(args);
308 COMPARE_NODE_FIELD(sublink);
314 _equalFieldSelect(FieldSelect *a, FieldSelect *b)
316 COMPARE_NODE_FIELD(arg);
317 COMPARE_SCALAR_FIELD(fieldnum);
318 COMPARE_SCALAR_FIELD(resulttype);
319 COMPARE_SCALAR_FIELD(resulttypmod);
325 _equalRelabelType(RelabelType *a, RelabelType *b)
327 COMPARE_NODE_FIELD(arg);
328 COMPARE_SCALAR_FIELD(resulttype);
329 COMPARE_SCALAR_FIELD(resulttypmod);
331 * Special-case COERCE_DONTCARE, so that pathkeys can build coercion
332 * nodes that are equal() to both explicit and implicit coercions.
334 if (a->relabelformat != b->relabelformat &&
335 a->relabelformat != COERCE_DONTCARE &&
336 b->relabelformat != COERCE_DONTCARE)
343 _equalCaseExpr(CaseExpr *a, CaseExpr *b)
345 COMPARE_SCALAR_FIELD(casetype);
346 COMPARE_NODE_FIELD(arg);
347 COMPARE_NODE_FIELD(args);
348 COMPARE_NODE_FIELD(defresult);
354 _equalCaseWhen(CaseWhen *a, CaseWhen *b)
356 COMPARE_NODE_FIELD(expr);
357 COMPARE_NODE_FIELD(result);
363 _equalNullTest(NullTest *a, NullTest *b)
365 COMPARE_NODE_FIELD(arg);
366 COMPARE_SCALAR_FIELD(nulltesttype);
372 _equalBooleanTest(BooleanTest *a, BooleanTest *b)
374 COMPARE_NODE_FIELD(arg);
375 COMPARE_SCALAR_FIELD(booltesttype);
381 _equalConstraintTest(ConstraintTest *a, ConstraintTest *b)
383 COMPARE_NODE_FIELD(arg);
384 COMPARE_SCALAR_FIELD(testtype);
385 COMPARE_STRING_FIELD(name);
386 COMPARE_STRING_FIELD(domname);
387 COMPARE_NODE_FIELD(check_expr);
393 _equalConstraintTestValue(ConstraintTestValue *a, ConstraintTestValue *b)
395 COMPARE_SCALAR_FIELD(typeId);
396 COMPARE_SCALAR_FIELD(typeMod);
402 _equalTargetEntry(TargetEntry *a, TargetEntry *b)
404 COMPARE_NODE_FIELD(resdom);
405 COMPARE_NODE_FIELD(expr);
411 _equalRangeTblRef(RangeTblRef *a, RangeTblRef *b)
413 COMPARE_SCALAR_FIELD(rtindex);
419 _equalJoinExpr(JoinExpr *a, JoinExpr *b)
421 COMPARE_SCALAR_FIELD(jointype);
422 COMPARE_SCALAR_FIELD(isNatural);
423 COMPARE_NODE_FIELD(larg);
424 COMPARE_NODE_FIELD(rarg);
425 COMPARE_NODE_FIELD(using);
426 COMPARE_NODE_FIELD(quals);
427 COMPARE_NODE_FIELD(alias);
428 COMPARE_SCALAR_FIELD(rtindex);
434 _equalFromExpr(FromExpr *a, FromExpr *b)
436 COMPARE_NODE_FIELD(fromlist);
437 COMPARE_NODE_FIELD(quals);
444 * Stuff from relation.h
448 _equalPathKeyItem(PathKeyItem *a, PathKeyItem *b)
450 COMPARE_NODE_FIELD(key);
451 COMPARE_SCALAR_FIELD(sortop);
457 _equalRestrictInfo(RestrictInfo *a, RestrictInfo *b)
459 COMPARE_NODE_FIELD(clause);
460 COMPARE_SCALAR_FIELD(ispusheddown);
462 * We ignore subclauseindices, eval_cost, this_selec, left/right_pathkey,
463 * and left/right_bucketsize, since they may not be set yet, and should be
464 * derivable from the clause anyway. Probably it's not really necessary
465 * to compare any of these remaining fields ...
467 COMPARE_SCALAR_FIELD(mergejoinoperator);
468 COMPARE_SCALAR_FIELD(left_sortop);
469 COMPARE_SCALAR_FIELD(right_sortop);
470 COMPARE_SCALAR_FIELD(hashjoinoperator);
476 _equalJoinInfo(JoinInfo *a, JoinInfo *b)
478 COMPARE_INTLIST_FIELD(unjoined_relids);
479 COMPARE_NODE_FIELD(jinfo_restrictinfo);
486 * Stuff from parsenodes.h
490 _equalQuery(Query *a, Query *b)
492 COMPARE_SCALAR_FIELD(commandType);
493 COMPARE_SCALAR_FIELD(querySource);
494 COMPARE_NODE_FIELD(utilityStmt);
495 COMPARE_SCALAR_FIELD(resultRelation);
496 COMPARE_NODE_FIELD(into);
497 COMPARE_SCALAR_FIELD(isPortal);
498 COMPARE_SCALAR_FIELD(isBinary);
499 COMPARE_SCALAR_FIELD(hasAggs);
500 COMPARE_SCALAR_FIELD(hasSubLinks);
501 COMPARE_NODE_FIELD(rtable);
502 COMPARE_NODE_FIELD(jointree);
503 COMPARE_INTLIST_FIELD(rowMarks);
504 COMPARE_NODE_FIELD(targetList);
505 COMPARE_NODE_FIELD(groupClause);
506 COMPARE_NODE_FIELD(havingQual);
507 COMPARE_NODE_FIELD(distinctClause);
508 COMPARE_NODE_FIELD(sortClause);
509 COMPARE_NODE_FIELD(limitOffset);
510 COMPARE_NODE_FIELD(limitCount);
511 COMPARE_NODE_FIELD(setOperations);
512 COMPARE_INTLIST_FIELD(resultRelations);
515 * We do not check the internal-to-the-planner fields: base_rel_list,
516 * other_rel_list, join_rel_list, equi_key_list, query_pathkeys,
517 * hasJoinRTEs. They might not be set yet, and in any case they should
518 * be derivable from the other fields.
524 _equalInsertStmt(InsertStmt *a, InsertStmt *b)
526 COMPARE_NODE_FIELD(relation);
527 COMPARE_NODE_FIELD(cols);
528 COMPARE_NODE_FIELD(targetList);
529 COMPARE_NODE_FIELD(selectStmt);
535 _equalDeleteStmt(DeleteStmt *a, DeleteStmt *b)
537 COMPARE_NODE_FIELD(relation);
538 COMPARE_NODE_FIELD(whereClause);
544 _equalUpdateStmt(UpdateStmt *a, UpdateStmt *b)
546 COMPARE_NODE_FIELD(relation);
547 COMPARE_NODE_FIELD(targetList);
548 COMPARE_NODE_FIELD(whereClause);
549 COMPARE_NODE_FIELD(fromClause);
555 _equalSelectStmt(SelectStmt *a, SelectStmt *b)
557 COMPARE_NODE_FIELD(distinctClause);
558 COMPARE_NODE_FIELD(into);
559 COMPARE_NODE_FIELD(intoColNames);
560 COMPARE_NODE_FIELD(targetList);
561 COMPARE_NODE_FIELD(fromClause);
562 COMPARE_NODE_FIELD(whereClause);
563 COMPARE_NODE_FIELD(groupClause);
564 COMPARE_NODE_FIELD(havingClause);
565 COMPARE_NODE_FIELD(sortClause);
566 COMPARE_STRING_FIELD(portalname);
567 COMPARE_SCALAR_FIELD(binary);
568 COMPARE_NODE_FIELD(limitOffset);
569 COMPARE_NODE_FIELD(limitCount);
570 COMPARE_NODE_FIELD(forUpdate);
571 COMPARE_SCALAR_FIELD(op);
572 COMPARE_SCALAR_FIELD(all);
573 COMPARE_NODE_FIELD(larg);
574 COMPARE_NODE_FIELD(rarg);
580 _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
582 COMPARE_SCALAR_FIELD(op);
583 COMPARE_SCALAR_FIELD(all);
584 COMPARE_NODE_FIELD(larg);
585 COMPARE_NODE_FIELD(rarg);
586 COMPARE_INTLIST_FIELD(colTypes);
592 _equalAlterTableStmt(AlterTableStmt *a, AlterTableStmt *b)
594 COMPARE_SCALAR_FIELD(subtype);
595 COMPARE_NODE_FIELD(relation);
596 COMPARE_STRING_FIELD(name);
597 COMPARE_NODE_FIELD(def);
598 COMPARE_SCALAR_FIELD(behavior);
604 _equalAlterDomainStmt(AlterDomainStmt *a, AlterDomainStmt *b)
606 COMPARE_SCALAR_FIELD(subtype);
607 COMPARE_NODE_FIELD(typename);
608 COMPARE_STRING_FIELD(name);
609 COMPARE_NODE_FIELD(def);
610 COMPARE_SCALAR_FIELD(behavior);
616 _equalGrantStmt(GrantStmt *a, GrantStmt *b)
618 COMPARE_SCALAR_FIELD(is_grant);
619 COMPARE_SCALAR_FIELD(objtype);
620 COMPARE_NODE_FIELD(objects);
621 COMPARE_INTLIST_FIELD(privileges);
622 COMPARE_NODE_FIELD(grantees);
628 _equalPrivGrantee(PrivGrantee *a, PrivGrantee *b)
630 COMPARE_STRING_FIELD(username);
631 COMPARE_STRING_FIELD(groupname);
637 _equalFuncWithArgs(FuncWithArgs *a, FuncWithArgs *b)
639 COMPARE_NODE_FIELD(funcname);
640 COMPARE_NODE_FIELD(funcargs);
646 _equalInsertDefault(InsertDefault *a, InsertDefault *b)
652 _equalClosePortalStmt(ClosePortalStmt *a, ClosePortalStmt *b)
654 COMPARE_STRING_FIELD(portalname);
660 _equalClusterStmt(ClusterStmt *a, ClusterStmt *b)
662 COMPARE_NODE_FIELD(relation);
663 COMPARE_STRING_FIELD(indexname);
669 _equalCopyStmt(CopyStmt *a, CopyStmt *b)
671 COMPARE_NODE_FIELD(relation);
672 COMPARE_NODE_FIELD(attlist);
673 COMPARE_SCALAR_FIELD(is_from);
674 COMPARE_STRING_FIELD(filename);
675 COMPARE_NODE_FIELD(options);
681 _equalCreateStmt(CreateStmt *a, CreateStmt *b)
683 COMPARE_NODE_FIELD(relation);
684 COMPARE_NODE_FIELD(tableElts);
685 COMPARE_NODE_FIELD(inhRelations);
686 COMPARE_NODE_FIELD(constraints);
687 COMPARE_SCALAR_FIELD(hasoids);
688 COMPARE_SCALAR_FIELD(oncommit);
694 _equalDefineStmt(DefineStmt *a, DefineStmt *b)
696 COMPARE_SCALAR_FIELD(defType);
697 COMPARE_NODE_FIELD(defnames);
698 COMPARE_NODE_FIELD(definition);
704 _equalDropStmt(DropStmt *a, DropStmt *b)
706 COMPARE_NODE_FIELD(objects);
707 COMPARE_SCALAR_FIELD(removeType);
708 COMPARE_SCALAR_FIELD(behavior);
714 _equalTruncateStmt(TruncateStmt *a, TruncateStmt *b)
716 COMPARE_NODE_FIELD(relation);
722 _equalCommentStmt(CommentStmt *a, CommentStmt *b)
724 COMPARE_SCALAR_FIELD(objtype);
725 COMPARE_NODE_FIELD(objname);
726 COMPARE_NODE_FIELD(objargs);
727 COMPARE_STRING_FIELD(comment);
733 _equalFetchStmt(FetchStmt *a, FetchStmt *b)
735 COMPARE_SCALAR_FIELD(direction);
736 COMPARE_SCALAR_FIELD(howMany);
737 COMPARE_STRING_FIELD(portalname);
738 COMPARE_SCALAR_FIELD(ismove);
744 _equalIndexStmt(IndexStmt *a, IndexStmt *b)
746 COMPARE_STRING_FIELD(idxname);
747 COMPARE_NODE_FIELD(relation);
748 COMPARE_STRING_FIELD(accessMethod);
749 COMPARE_NODE_FIELD(indexParams);
750 COMPARE_NODE_FIELD(whereClause);
751 COMPARE_NODE_FIELD(rangetable);
752 COMPARE_SCALAR_FIELD(unique);
753 COMPARE_SCALAR_FIELD(primary);
754 COMPARE_SCALAR_FIELD(isconstraint);
760 _equalCreateFunctionStmt(CreateFunctionStmt *a, CreateFunctionStmt *b)
762 COMPARE_SCALAR_FIELD(replace);
763 COMPARE_NODE_FIELD(funcname);
764 COMPARE_NODE_FIELD(argTypes);
765 COMPARE_NODE_FIELD(returnType);
766 COMPARE_NODE_FIELD(options);
767 COMPARE_NODE_FIELD(withClause);
773 _equalRemoveAggrStmt(RemoveAggrStmt *a, RemoveAggrStmt *b)
775 COMPARE_NODE_FIELD(aggname);
776 COMPARE_NODE_FIELD(aggtype);
777 COMPARE_SCALAR_FIELD(behavior);
783 _equalRemoveFuncStmt(RemoveFuncStmt *a, RemoveFuncStmt *b)
785 COMPARE_NODE_FIELD(funcname);
786 COMPARE_NODE_FIELD(args);
787 COMPARE_SCALAR_FIELD(behavior);
793 _equalRemoveOperStmt(RemoveOperStmt *a, RemoveOperStmt *b)
795 COMPARE_NODE_FIELD(opname);
796 COMPARE_NODE_FIELD(args);
797 COMPARE_SCALAR_FIELD(behavior);
803 _equalRemoveOpClassStmt(RemoveOpClassStmt *a, RemoveOpClassStmt *b)
805 COMPARE_NODE_FIELD(opclassname);
806 COMPARE_STRING_FIELD(amname);
807 COMPARE_SCALAR_FIELD(behavior);
813 _equalRenameStmt(RenameStmt *a, RenameStmt *b)
815 COMPARE_NODE_FIELD(relation);
816 COMPARE_STRING_FIELD(oldname);
817 COMPARE_STRING_FIELD(newname);
818 COMPARE_SCALAR_FIELD(renameType);
824 _equalRuleStmt(RuleStmt *a, RuleStmt *b)
826 COMPARE_NODE_FIELD(relation);
827 COMPARE_STRING_FIELD(rulename);
828 COMPARE_NODE_FIELD(whereClause);
829 COMPARE_SCALAR_FIELD(event);
830 COMPARE_SCALAR_FIELD(instead);
831 COMPARE_NODE_FIELD(actions);
832 COMPARE_SCALAR_FIELD(replace);
838 _equalNotifyStmt(NotifyStmt *a, NotifyStmt *b)
840 COMPARE_NODE_FIELD(relation);
846 _equalListenStmt(ListenStmt *a, ListenStmt *b)
848 COMPARE_NODE_FIELD(relation);
854 _equalUnlistenStmt(UnlistenStmt *a, UnlistenStmt *b)
856 COMPARE_NODE_FIELD(relation);
862 _equalTransactionStmt(TransactionStmt *a, TransactionStmt *b)
864 COMPARE_SCALAR_FIELD(command);
865 COMPARE_NODE_FIELD(options);
871 _equalCompositeTypeStmt(CompositeTypeStmt *a, CompositeTypeStmt *b)
873 COMPARE_NODE_FIELD(typevar);
874 COMPARE_NODE_FIELD(coldeflist);
880 _equalViewStmt(ViewStmt *a, ViewStmt *b)
882 COMPARE_NODE_FIELD(view);
883 COMPARE_NODE_FIELD(aliases);
884 COMPARE_NODE_FIELD(query);
885 COMPARE_SCALAR_FIELD(replace);
891 _equalLoadStmt(LoadStmt *a, LoadStmt *b)
893 COMPARE_STRING_FIELD(filename);
899 _equalCreateDomainStmt(CreateDomainStmt *a, CreateDomainStmt *b)
901 COMPARE_NODE_FIELD(domainname);
902 COMPARE_NODE_FIELD(typename);
903 COMPARE_NODE_FIELD(constraints);
909 _equalCreateOpClassStmt(CreateOpClassStmt *a, CreateOpClassStmt *b)
911 COMPARE_NODE_FIELD(opclassname);
912 COMPARE_STRING_FIELD(amname);
913 COMPARE_NODE_FIELD(datatype);
914 COMPARE_NODE_FIELD(items);
915 COMPARE_SCALAR_FIELD(isDefault);
921 _equalCreateOpClassItem(CreateOpClassItem *a, CreateOpClassItem *b)
923 COMPARE_SCALAR_FIELD(itemtype);
924 COMPARE_NODE_FIELD(name);
925 COMPARE_NODE_FIELD(args);
926 COMPARE_SCALAR_FIELD(number);
927 COMPARE_SCALAR_FIELD(recheck);
928 COMPARE_NODE_FIELD(storedtype);
934 _equalCreatedbStmt(CreatedbStmt *a, CreatedbStmt *b)
936 COMPARE_STRING_FIELD(dbname);
937 COMPARE_NODE_FIELD(options);
943 _equalAlterDatabaseSetStmt(AlterDatabaseSetStmt *a, AlterDatabaseSetStmt *b)
945 COMPARE_STRING_FIELD(dbname);
946 COMPARE_STRING_FIELD(variable);
947 COMPARE_NODE_FIELD(value);
953 _equalDropdbStmt(DropdbStmt *a, DropdbStmt *b)
955 COMPARE_STRING_FIELD(dbname);
961 _equalVacuumStmt(VacuumStmt *a, VacuumStmt *b)
963 COMPARE_SCALAR_FIELD(vacuum);
964 COMPARE_SCALAR_FIELD(full);
965 COMPARE_SCALAR_FIELD(analyze);
966 COMPARE_SCALAR_FIELD(freeze);
967 COMPARE_SCALAR_FIELD(verbose);
968 COMPARE_NODE_FIELD(relation);
969 COMPARE_NODE_FIELD(va_cols);
975 _equalExplainStmt(ExplainStmt *a, ExplainStmt *b)
977 COMPARE_NODE_FIELD(query);
978 COMPARE_SCALAR_FIELD(verbose);
979 COMPARE_SCALAR_FIELD(analyze);
985 _equalCreateSeqStmt(CreateSeqStmt *a, CreateSeqStmt *b)
987 COMPARE_NODE_FIELD(sequence);
988 COMPARE_NODE_FIELD(options);
994 _equalVariableSetStmt(VariableSetStmt *a, VariableSetStmt *b)
996 COMPARE_STRING_FIELD(name);
997 COMPARE_NODE_FIELD(args);
998 COMPARE_SCALAR_FIELD(is_local);
1004 _equalVariableShowStmt(VariableShowStmt *a, VariableShowStmt *b)
1006 COMPARE_STRING_FIELD(name);
1012 _equalVariableResetStmt(VariableResetStmt *a, VariableResetStmt *b)
1014 COMPARE_STRING_FIELD(name);
1020 _equalCreateTrigStmt(CreateTrigStmt *a, CreateTrigStmt *b)
1022 COMPARE_STRING_FIELD(trigname);
1023 COMPARE_NODE_FIELD(relation);
1024 COMPARE_NODE_FIELD(funcname);
1025 COMPARE_NODE_FIELD(args);
1026 COMPARE_SCALAR_FIELD(before);
1027 COMPARE_SCALAR_FIELD(row);
1028 if (strcmp(a->actions, b->actions) != 0) /* in-line string field */
1030 COMPARE_SCALAR_FIELD(isconstraint);
1031 COMPARE_SCALAR_FIELD(deferrable);
1032 COMPARE_SCALAR_FIELD(initdeferred);
1033 COMPARE_NODE_FIELD(constrrel);
1039 _equalDropPropertyStmt(DropPropertyStmt *a, DropPropertyStmt *b)
1041 COMPARE_NODE_FIELD(relation);
1042 COMPARE_STRING_FIELD(property);
1043 COMPARE_SCALAR_FIELD(removeType);
1044 COMPARE_SCALAR_FIELD(behavior);
1050 _equalCreatePLangStmt(CreatePLangStmt *a, CreatePLangStmt *b)
1052 COMPARE_STRING_FIELD(plname);
1053 COMPARE_NODE_FIELD(plhandler);
1054 COMPARE_NODE_FIELD(plvalidator);
1055 COMPARE_SCALAR_FIELD(pltrusted);
1061 _equalDropPLangStmt(DropPLangStmt *a, DropPLangStmt *b)
1063 COMPARE_STRING_FIELD(plname);
1064 COMPARE_SCALAR_FIELD(behavior);
1070 _equalCreateUserStmt(CreateUserStmt *a, CreateUserStmt *b)
1072 COMPARE_STRING_FIELD(user);
1073 COMPARE_NODE_FIELD(options);
1079 _equalAlterUserStmt(AlterUserStmt *a, AlterUserStmt *b)
1081 COMPARE_STRING_FIELD(user);
1082 COMPARE_NODE_FIELD(options);
1088 _equalAlterUserSetStmt(AlterUserSetStmt *a, AlterUserSetStmt *b)
1090 COMPARE_STRING_FIELD(user);
1091 COMPARE_STRING_FIELD(variable);
1092 COMPARE_NODE_FIELD(value);
1098 _equalDropUserStmt(DropUserStmt *a, DropUserStmt *b)
1100 COMPARE_NODE_FIELD(users);
1106 _equalLockStmt(LockStmt *a, LockStmt *b)
1108 COMPARE_NODE_FIELD(relations);
1109 COMPARE_SCALAR_FIELD(mode);
1115 _equalConstraintsSetStmt(ConstraintsSetStmt *a, ConstraintsSetStmt *b)
1117 COMPARE_NODE_FIELD(constraints);
1118 COMPARE_SCALAR_FIELD(deferred);
1124 _equalCreateGroupStmt(CreateGroupStmt *a, CreateGroupStmt *b)
1126 COMPARE_STRING_FIELD(name);
1127 COMPARE_NODE_FIELD(options);
1133 _equalAlterGroupStmt(AlterGroupStmt *a, AlterGroupStmt *b)
1135 COMPARE_STRING_FIELD(name);
1136 COMPARE_SCALAR_FIELD(action);
1137 COMPARE_NODE_FIELD(listUsers);
1143 _equalDropGroupStmt(DropGroupStmt *a, DropGroupStmt *b)
1145 COMPARE_STRING_FIELD(name);
1151 _equalReindexStmt(ReindexStmt *a, ReindexStmt *b)
1153 COMPARE_SCALAR_FIELD(reindexType);
1154 COMPARE_NODE_FIELD(relation);
1155 COMPARE_STRING_FIELD(name);
1156 COMPARE_SCALAR_FIELD(force);
1157 COMPARE_SCALAR_FIELD(all);
1163 _equalCreateSchemaStmt(CreateSchemaStmt *a, CreateSchemaStmt *b)
1165 COMPARE_STRING_FIELD(schemaname);
1166 COMPARE_STRING_FIELD(authid);
1167 COMPARE_NODE_FIELD(schemaElts);
1173 _equalCreateConversionStmt(CreateConversionStmt *a, CreateConversionStmt *b)
1175 COMPARE_NODE_FIELD(conversion_name);
1176 COMPARE_STRING_FIELD(for_encoding_name);
1177 COMPARE_STRING_FIELD(to_encoding_name);
1178 COMPARE_NODE_FIELD(func_name);
1179 COMPARE_SCALAR_FIELD(def);
1185 _equalCreateCastStmt(CreateCastStmt *a, CreateCastStmt *b)
1187 COMPARE_NODE_FIELD(sourcetype);
1188 COMPARE_NODE_FIELD(targettype);
1189 COMPARE_NODE_FIELD(func);
1190 COMPARE_SCALAR_FIELD(context);
1196 _equalDropCastStmt(DropCastStmt *a, DropCastStmt *b)
1198 COMPARE_NODE_FIELD(sourcetype);
1199 COMPARE_NODE_FIELD(targettype);
1200 COMPARE_SCALAR_FIELD(behavior);
1206 _equalPrepareStmt(PrepareStmt *a, PrepareStmt *b)
1208 COMPARE_STRING_FIELD(name);
1209 COMPARE_NODE_FIELD(argtypes);
1210 COMPARE_INTLIST_FIELD(argtype_oids);
1211 COMPARE_NODE_FIELD(query);
1217 _equalExecuteStmt(ExecuteStmt *a, ExecuteStmt *b)
1219 COMPARE_STRING_FIELD(name);
1220 COMPARE_NODE_FIELD(into);
1221 COMPARE_NODE_FIELD(params);
1227 _equalDeallocateStmt(DeallocateStmt *a, DeallocateStmt *b)
1229 COMPARE_STRING_FIELD(name);
1236 * stuff from parsenodes.h
1240 _equalAExpr(A_Expr *a, A_Expr *b)
1242 COMPARE_SCALAR_FIELD(oper);
1243 COMPARE_NODE_FIELD(name);
1244 COMPARE_NODE_FIELD(lexpr);
1245 COMPARE_NODE_FIELD(rexpr);
1251 _equalColumnRef(ColumnRef *a, ColumnRef *b)
1253 COMPARE_NODE_FIELD(fields);
1254 COMPARE_NODE_FIELD(indirection);
1260 _equalParamRef(ParamRef *a, ParamRef *b)
1262 COMPARE_SCALAR_FIELD(number);
1263 COMPARE_NODE_FIELD(fields);
1264 COMPARE_NODE_FIELD(indirection);
1270 _equalAConst(A_Const *a, A_Const *b)
1272 if (!equal(&a->val, &b->val)) /* hack for in-line Value field */
1274 COMPARE_NODE_FIELD(typename);
1280 _equalFuncCall(FuncCall *a, FuncCall *b)
1282 COMPARE_NODE_FIELD(funcname);
1283 COMPARE_NODE_FIELD(args);
1284 COMPARE_SCALAR_FIELD(agg_star);
1285 COMPARE_SCALAR_FIELD(agg_distinct);
1291 _equalAIndices(A_Indices *a, A_Indices *b)
1293 COMPARE_NODE_FIELD(lidx);
1294 COMPARE_NODE_FIELD(uidx);
1300 _equalExprFieldSelect(ExprFieldSelect *a, ExprFieldSelect *b)
1302 COMPARE_NODE_FIELD(arg);
1303 COMPARE_NODE_FIELD(fields);
1304 COMPARE_NODE_FIELD(indirection);
1310 _equalResTarget(ResTarget *a, ResTarget *b)
1312 COMPARE_STRING_FIELD(name);
1313 COMPARE_NODE_FIELD(indirection);
1314 COMPARE_NODE_FIELD(val);
1320 _equalTypeName(TypeName *a, TypeName *b)
1322 COMPARE_NODE_FIELD(names);
1323 COMPARE_SCALAR_FIELD(typeid);
1324 COMPARE_SCALAR_FIELD(timezone);
1325 COMPARE_SCALAR_FIELD(setof);
1326 COMPARE_SCALAR_FIELD(pct_type);
1327 COMPARE_SCALAR_FIELD(typmod);
1328 COMPARE_NODE_FIELD(arrayBounds);
1334 _equalTypeCast(TypeCast *a, TypeCast *b)
1336 COMPARE_NODE_FIELD(arg);
1337 COMPARE_NODE_FIELD(typename);
1343 _equalSortGroupBy(SortGroupBy *a, SortGroupBy *b)
1345 COMPARE_NODE_FIELD(useOp);
1346 COMPARE_NODE_FIELD(node);
1352 _equalRangeSubselect(RangeSubselect *a, RangeSubselect *b)
1354 COMPARE_NODE_FIELD(subquery);
1355 COMPARE_NODE_FIELD(alias);
1361 _equalRangeFunction(RangeFunction *a, RangeFunction *b)
1363 COMPARE_NODE_FIELD(funccallnode);
1364 COMPARE_NODE_FIELD(alias);
1365 COMPARE_NODE_FIELD(coldeflist);
1371 _equalIndexElem(IndexElem *a, IndexElem *b)
1373 COMPARE_STRING_FIELD(name);
1374 COMPARE_NODE_FIELD(funcname);
1375 COMPARE_NODE_FIELD(args);
1376 COMPARE_NODE_FIELD(opclass);
1382 _equalColumnDef(ColumnDef *a, ColumnDef *b)
1384 COMPARE_STRING_FIELD(colname);
1385 COMPARE_NODE_FIELD(typename);
1386 COMPARE_SCALAR_FIELD(inhcount);
1387 COMPARE_SCALAR_FIELD(is_local);
1388 COMPARE_SCALAR_FIELD(is_not_null);
1389 COMPARE_NODE_FIELD(raw_default);
1390 COMPARE_STRING_FIELD(cooked_default);
1391 COMPARE_NODE_FIELD(constraints);
1392 COMPARE_NODE_FIELD(support);
1398 _equalConstraint(Constraint *a, Constraint *b)
1400 COMPARE_SCALAR_FIELD(contype);
1401 COMPARE_STRING_FIELD(name);
1402 COMPARE_NODE_FIELD(raw_expr);
1403 COMPARE_STRING_FIELD(cooked_expr);
1404 COMPARE_NODE_FIELD(keys);
1410 _equalDefElem(DefElem *a, DefElem *b)
1412 COMPARE_STRING_FIELD(defname);
1413 COMPARE_NODE_FIELD(arg);
1419 _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
1421 COMPARE_SCALAR_FIELD(rtekind);
1422 COMPARE_SCALAR_FIELD(relid);
1423 COMPARE_NODE_FIELD(subquery);
1424 COMPARE_NODE_FIELD(funcexpr);
1425 COMPARE_NODE_FIELD(coldeflist);
1426 COMPARE_SCALAR_FIELD(jointype);
1427 COMPARE_NODE_FIELD(joinaliasvars);
1428 COMPARE_NODE_FIELD(alias);
1429 COMPARE_NODE_FIELD(eref);
1430 COMPARE_SCALAR_FIELD(inh);
1431 COMPARE_SCALAR_FIELD(inFromCl);
1432 COMPARE_SCALAR_FIELD(checkForRead);
1433 COMPARE_SCALAR_FIELD(checkForWrite);
1434 COMPARE_SCALAR_FIELD(checkAsUser);
1440 _equalSortClause(SortClause *a, SortClause *b)
1442 COMPARE_SCALAR_FIELD(tleSortGroupRef);
1443 COMPARE_SCALAR_FIELD(sortop);
1449 _equalFkConstraint(FkConstraint *a, FkConstraint *b)
1451 COMPARE_STRING_FIELD(constr_name);
1452 COMPARE_NODE_FIELD(pktable);
1453 COMPARE_NODE_FIELD(fk_attrs);
1454 COMPARE_NODE_FIELD(pk_attrs);
1455 COMPARE_SCALAR_FIELD(fk_matchtype);
1456 COMPARE_SCALAR_FIELD(fk_upd_action);
1457 COMPARE_SCALAR_FIELD(fk_del_action);
1458 COMPARE_SCALAR_FIELD(deferrable);
1459 COMPARE_SCALAR_FIELD(initdeferred);
1460 COMPARE_SCALAR_FIELD(skip_validation);
1467 * Stuff from pg_list.h
1471 _equalValue(Value *a, Value *b)
1473 COMPARE_SCALAR_FIELD(type);
1478 COMPARE_SCALAR_FIELD(val.ival);
1483 COMPARE_STRING_FIELD(val.str);
1489 elog(ERROR, "_equalValue: unknown node type %d", a->type);
1498 * returns whether two nodes are equal
1501 equal(void *a, void *b)
1503 bool retval = false;
1509 * note that a!=b, so only one of them can be NULL
1511 if (a == NULL || b == NULL)
1515 * are they the same type of nodes?
1517 if (nodeTag(a) != nodeTag(b))
1526 retval = _equalResdom(a, b);
1529 retval = _equalAlias(a, b);
1532 retval = _equalRangeVar(a, b);
1535 retval = _equalVar(a, b);
1538 retval = _equalConst(a, b);
1541 retval = _equalParam(a, b);
1544 retval = _equalAggref(a, b);
1547 retval = _equalArrayRef(a, b);
1550 retval = _equalFuncExpr(a, b);
1553 retval = _equalOpExpr(a, b);
1555 case T_DistinctExpr:
1556 retval = _equalDistinctExpr(a, b);
1559 retval = _equalBoolExpr(a, b);
1562 retval = _equalSubLink(a, b);
1565 retval = _equalSubPlanExpr(a, b);
1568 retval = _equalFieldSelect(a, b);
1571 retval = _equalRelabelType(a, b);
1574 retval = _equalCaseExpr(a, b);
1577 retval = _equalCaseWhen(a, b);
1580 retval = _equalNullTest(a, b);
1583 retval = _equalBooleanTest(a, b);
1585 case T_ConstraintTest:
1586 retval = _equalConstraintTest(a, b);
1588 case T_ConstraintTestValue:
1589 retval = _equalConstraintTestValue(a, b);
1592 retval = _equalTargetEntry(a, b);
1595 retval = _equalRangeTblRef(a, b);
1598 retval = _equalFromExpr(a, b);
1601 retval = _equalJoinExpr(a, b);
1608 retval = _equalPathKeyItem(a, b);
1610 case T_RestrictInfo:
1611 retval = _equalRestrictInfo(a, b);
1614 retval = _equalJoinInfo(a, b);
1622 List *la = (List *) a;
1623 List *lb = (List *) b;
1627 * Try to reject by length check before we grovel through
1628 * all the elements...
1630 if (length(la) != length(lb))
1634 if (!equal(lfirst(l), lfirst(lb)))
1647 retval = _equalValue(a, b);
1654 retval = _equalQuery(a, b);
1657 retval = _equalInsertStmt(a, b);
1660 retval = _equalDeleteStmt(a, b);
1663 retval = _equalUpdateStmt(a, b);
1666 retval = _equalSelectStmt(a, b);
1668 case T_SetOperationStmt:
1669 retval = _equalSetOperationStmt(a, b);
1671 case T_AlterTableStmt:
1672 retval = _equalAlterTableStmt(a, b);
1674 case T_AlterDomainStmt:
1675 retval = _equalAlterDomainStmt(a, b);
1678 retval = _equalGrantStmt(a, b);
1680 case T_ClosePortalStmt:
1681 retval = _equalClosePortalStmt(a, b);
1684 retval = _equalClusterStmt(a, b);
1687 retval = _equalCopyStmt(a, b);
1690 retval = _equalCreateStmt(a, b);
1693 retval = _equalDefineStmt(a, b);
1696 retval = _equalDropStmt(a, b);
1698 case T_TruncateStmt:
1699 retval = _equalTruncateStmt(a, b);
1702 retval = _equalCommentStmt(a, b);
1705 retval = _equalFetchStmt(a, b);
1708 retval = _equalIndexStmt(a, b);
1710 case T_CreateFunctionStmt:
1711 retval = _equalCreateFunctionStmt(a, b);
1713 case T_RemoveAggrStmt:
1714 retval = _equalRemoveAggrStmt(a, b);
1716 case T_RemoveFuncStmt:
1717 retval = _equalRemoveFuncStmt(a, b);
1719 case T_RemoveOperStmt:
1720 retval = _equalRemoveOperStmt(a, b);
1722 case T_RemoveOpClassStmt:
1723 retval = _equalRemoveOpClassStmt(a, b);
1726 retval = _equalRenameStmt(a, b);
1729 retval = _equalRuleStmt(a, b);
1732 retval = _equalNotifyStmt(a, b);
1735 retval = _equalListenStmt(a, b);
1737 case T_UnlistenStmt:
1738 retval = _equalUnlistenStmt(a, b);
1740 case T_TransactionStmt:
1741 retval = _equalTransactionStmt(a, b);
1743 case T_CompositeTypeStmt:
1744 retval = _equalCompositeTypeStmt(a, b);
1747 retval = _equalViewStmt(a, b);
1750 retval = _equalLoadStmt(a, b);
1752 case T_CreateDomainStmt:
1753 retval = _equalCreateDomainStmt(a, b);
1755 case T_CreateOpClassStmt:
1756 retval = _equalCreateOpClassStmt(a, b);
1758 case T_CreateOpClassItem:
1759 retval = _equalCreateOpClassItem(a, b);
1761 case T_CreatedbStmt:
1762 retval = _equalCreatedbStmt(a, b);
1764 case T_AlterDatabaseSetStmt:
1765 retval = _equalAlterDatabaseSetStmt(a, b);
1768 retval = _equalDropdbStmt(a, b);
1771 retval = _equalVacuumStmt(a, b);
1774 retval = _equalExplainStmt(a, b);
1776 case T_CreateSeqStmt:
1777 retval = _equalCreateSeqStmt(a, b);
1779 case T_VariableSetStmt:
1780 retval = _equalVariableSetStmt(a, b);
1782 case T_VariableShowStmt:
1783 retval = _equalVariableShowStmt(a, b);
1785 case T_VariableResetStmt:
1786 retval = _equalVariableResetStmt(a, b);
1788 case T_CreateTrigStmt:
1789 retval = _equalCreateTrigStmt(a, b);
1791 case T_DropPropertyStmt:
1792 retval = _equalDropPropertyStmt(a, b);
1794 case T_CreatePLangStmt:
1795 retval = _equalCreatePLangStmt(a, b);
1797 case T_DropPLangStmt:
1798 retval = _equalDropPLangStmt(a, b);
1800 case T_CreateUserStmt:
1801 retval = _equalCreateUserStmt(a, b);
1803 case T_AlterUserStmt:
1804 retval = _equalAlterUserStmt(a, b);
1806 case T_AlterUserSetStmt:
1807 retval = _equalAlterUserSetStmt(a, b);
1809 case T_DropUserStmt:
1810 retval = _equalDropUserStmt(a, b);
1813 retval = _equalLockStmt(a, b);
1815 case T_ConstraintsSetStmt:
1816 retval = _equalConstraintsSetStmt(a, b);
1818 case T_CreateGroupStmt:
1819 retval = _equalCreateGroupStmt(a, b);
1821 case T_AlterGroupStmt:
1822 retval = _equalAlterGroupStmt(a, b);
1824 case T_DropGroupStmt:
1825 retval = _equalDropGroupStmt(a, b);
1828 retval = _equalReindexStmt(a, b);
1830 case T_CheckPointStmt:
1833 case T_CreateSchemaStmt:
1834 retval = _equalCreateSchemaStmt(a, b);
1836 case T_CreateConversionStmt:
1837 retval = _equalCreateConversionStmt(a, b);
1839 case T_CreateCastStmt:
1840 retval = _equalCreateCastStmt(a, b);
1842 case T_DropCastStmt:
1843 retval = _equalDropCastStmt(a, b);
1846 retval = _equalPrepareStmt(a, b);
1849 retval = _equalExecuteStmt(a, b);
1851 case T_DeallocateStmt:
1852 retval = _equalDeallocateStmt(a, b);
1856 retval = _equalAExpr(a, b);
1859 retval = _equalColumnRef(a, b);
1862 retval = _equalParamRef(a, b);
1865 retval = _equalAConst(a, b);
1868 retval = _equalFuncCall(a, b);
1871 retval = _equalAIndices(a, b);
1873 case T_ExprFieldSelect:
1874 retval = _equalExprFieldSelect(a, b);
1877 retval = _equalResTarget(a, b);
1880 retval = _equalTypeCast(a, b);
1883 retval = _equalSortGroupBy(a, b);
1885 case T_RangeSubselect:
1886 retval = _equalRangeSubselect(a, b);
1888 case T_RangeFunction:
1889 retval = _equalRangeFunction(a, b);
1892 retval = _equalTypeName(a, b);
1895 retval = _equalIndexElem(a, b);
1898 retval = _equalColumnDef(a, b);
1901 retval = _equalConstraint(a, b);
1904 retval = _equalDefElem(a, b);
1906 case T_RangeTblEntry:
1907 retval = _equalRangeTblEntry(a, b);
1910 retval = _equalSortClause(a, b);
1913 /* GroupClause is equivalent to SortClause */
1914 retval = _equalSortClause(a, b);
1916 case T_FkConstraint:
1917 retval = _equalFkConstraint(a, b);
1920 retval = _equalPrivGrantee(a, b);
1922 case T_FuncWithArgs:
1923 retval = _equalFuncWithArgs(a, b);
1925 case T_InsertDefault:
1926 retval = _equalInsertDefault(a, b);
1930 elog(WARNING, "equal: don't know whether nodes of type %d are equal",