7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.24 1999/02/06 17:29:25 momjian Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.25 1999/02/07 00:52:12 tgl Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -559,6 +559,105 @@ _equalEState(EState *a, EState *b)
559
559
return true;
560
560
}
561
561
562
+ /*
563
+ * Stuff from parsenodes.h
564
+ */
565
+
566
+ static bool
567
+ _equalQuery (Query * a , Query * b )
568
+ {
569
+ if (a -> commandType != b -> commandType )
570
+ return false;
571
+ if (!equal (a -> utilityStmt , b -> utilityStmt ))
572
+ return false;
573
+ if (a -> resultRelation != b -> resultRelation )
574
+ return false;
575
+ if (a -> into && b -> into ) {
576
+ if (strcmp (a -> into , b -> into ) != 0 )
577
+ return false;
578
+ } else {
579
+ if (a -> into != b -> into )
580
+ return false;
581
+ }
582
+ if (a -> isPortal != b -> isPortal )
583
+ return false;
584
+ if (a -> isBinary != b -> isBinary )
585
+ return false;
586
+ if (a -> isTemp != b -> isTemp )
587
+ return false;
588
+ if (a -> unionall != b -> unionall )
589
+ return false;
590
+ if (a -> hasAggs != b -> hasAggs )
591
+ return false;
592
+ if (a -> hasSubLinks != b -> hasSubLinks )
593
+ return false;
594
+ if (a -> uniqueFlag && b -> uniqueFlag ) {
595
+ if (strcmp (a -> uniqueFlag , b -> uniqueFlag ) != 0 )
596
+ return false;
597
+ } else {
598
+ if (a -> uniqueFlag != b -> uniqueFlag )
599
+ return false;
600
+ }
601
+ if (!equal (a -> sortClause , b -> sortClause ))
602
+ return false;
603
+ if (!equal (a -> rtable , b -> rtable ))
604
+ return false;
605
+ if (!equal (a -> targetList , b -> targetList ))
606
+ return false;
607
+ if (!equal (a -> qual , b -> qual ))
608
+ return false;
609
+ if (!equal (a -> rowMark , b -> rowMark ))
610
+ return false;
611
+ if (!equal (a -> groupClause , b -> groupClause ))
612
+ return false;
613
+ if (!equal (a -> havingQual , b -> havingQual ))
614
+ return false;
615
+ if (!equal (a -> intersectClause , b -> intersectClause ))
616
+ return false;
617
+ if (!equal (a -> unionClause , b -> unionClause ))
618
+ return false;
619
+ if (!equal (a -> limitOffset , b -> limitOffset ))
620
+ return false;
621
+ if (!equal (a -> limitCount , b -> limitCount ))
622
+ return false;
623
+
624
+ /* We do not check the internal-to-the-planner fields
625
+ * base_rel_list and join_rel_list. They might not be
626
+ * set yet, and in any case they should be derivable
627
+ * from the other fields.
628
+ */
629
+ return true;
630
+ }
631
+
632
+ static bool
633
+ _equalRangeTblEntry (RangeTblEntry * a , RangeTblEntry * b )
634
+ {
635
+ if (a -> relname && b -> relname ) {
636
+ if (strcmp (a -> relname , b -> relname ) != 0 )
637
+ return false;
638
+ } else {
639
+ if (a -> relname != b -> relname )
640
+ return false;
641
+ }
642
+ if (a -> refname && b -> refname ) {
643
+ if (strcmp (a -> refname , b -> refname ) != 0 )
644
+ return false;
645
+ } else {
646
+ if (a -> refname != b -> refname )
647
+ return false;
648
+ }
649
+ if (a -> relid != b -> relid )
650
+ return false;
651
+ if (a -> inh != b -> inh )
652
+ return false;
653
+ if (a -> inFromCl != b -> inFromCl )
654
+ return false;
655
+ if (a -> skipAcl != b -> skipAcl )
656
+ return false;
657
+
658
+ return true;
659
+ }
660
+
562
661
static bool
563
662
_equalTargetEntry (TargetEntry * a , TargetEntry * b )
564
663
{
@@ -572,13 +671,10 @@ _equalTargetEntry(TargetEntry *a, TargetEntry *b)
572
671
return true;
573
672
}
574
673
575
-
576
674
/*
577
- * equal -- are two lists equal?
578
- *
579
- * This is a comparison by value. It would be simpler to write it
580
- * to be recursive, but it should run faster if we iterate.
675
+ * Stuff from pg_list.h
581
676
*/
677
+
582
678
static bool
583
679
_equalValue (Value * a , Value * b )
584
680
{
@@ -635,9 +731,6 @@ equal(void *a, void *b)
635
731
case T_Expr :
636
732
retval = _equalExpr (a , b );
637
733
break ;
638
- case T_TargetEntry :
639
- retval = _equalTargetEntry (a , b );
640
- break ;
641
734
case T_Iter :
642
735
retval = _equalIter (a , b );
643
736
break ;
@@ -734,6 +827,15 @@ equal(void *a, void *b)
734
827
retval = true;
735
828
}
736
829
break ;
830
+ case T_Query :
831
+ retval = _equalQuery (a , b );
832
+ break ;
833
+ case T_RangeTblEntry :
834
+ retval = _equalRangeTblEntry (a , b );
835
+ break ;
836
+ case T_TargetEntry :
837
+ retval = _equalTargetEntry (a , b );
838
+ break ;
737
839
default :
738
840
elog (NOTICE , "equal: don't know whether nodes of type %d are equal" ,
739
841
nodeTag (a ));
0 commit comments