Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 48fd9a2

Browse files
committed
Add equality checking for T_Query so that we don't get
complaints in UNION regress test. Probably still need some more node types to be handled here, but I'm done for the day...
1 parent 3fd3d02 commit 48fd9a2

File tree

1 file changed

+111
-9
lines changed

1 file changed

+111
-9
lines changed

src/backend/nodes/equalfuncs.c

Lines changed: 111 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* 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 $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -559,6 +559,105 @@ _equalEState(EState *a, EState *b)
559559
return true;
560560
}
561561

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+
562661
static bool
563662
_equalTargetEntry(TargetEntry *a, TargetEntry *b)
564663
{
@@ -572,13 +671,10 @@ _equalTargetEntry(TargetEntry *a, TargetEntry *b)
572671
return true;
573672
}
574673

575-
576674
/*
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
581676
*/
677+
582678
static bool
583679
_equalValue(Value *a, Value *b)
584680
{
@@ -635,9 +731,6 @@ equal(void *a, void *b)
635731
case T_Expr:
636732
retval = _equalExpr(a, b);
637733
break;
638-
case T_TargetEntry:
639-
retval = _equalTargetEntry(a, b);
640-
break;
641734
case T_Iter:
642735
retval = _equalIter(a, b);
643736
break;
@@ -734,6 +827,15 @@ equal(void *a, void *b)
734827
retval = true;
735828
}
736829
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;
737839
default:
738840
elog(NOTICE, "equal: don't know whether nodes of type %d are equal",
739841
nodeTag(a));

0 commit comments

Comments
 (0)