From 19c4e862d41f9d520652d0b0e7ae595a85b5f90b Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 17 May 1999 18:22:19 +0000
Subject: [PATCH] Skip junk nodes when comparing UNION target list lengths.

---
 src/backend/parser/parse_clause.c    | 13 +++++++++++--
 src/backend/rewrite/rewriteHandler.c | 19 ++++++++++++++-----
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 507ebc2e719..a3eafab36cb 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.33 1999/05/17 17:03:32 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.34 1999/05/17 18:22:18 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -767,8 +767,17 @@ transformUnionClause(List *unionClause, List *targetlist)
 			Query	   *query = (Query *) lfirst(qlist_item);
 			List	   *prev_target = targetlist;
 			List	   *next_target;
+			int			prev_len = 0, next_len = 0;
 
-			if (length(targetlist) != length(query->targetList))
+			foreach(prev_target, targetlist)
+				if (!((TargetEntry *) lfirst(prev_target))->resdom->resjunk)
+					prev_len++;
+
+			foreach(next_target, query->targetList)
+				if (!((TargetEntry *) lfirst(next_target))->resdom->resjunk)
+					next_len++;
+						
+			if (prev_len != next_len)
 				elog(ERROR, "Each UNION clause must have the same number of columns");
 
 			foreach(next_target, query->targetList)
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index b2b8c051f60..26626d0bb8a 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.42 1999/05/17 17:03:38 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.43 1999/05/17 18:22:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2762,11 +2762,20 @@ QueryRewrite(Query *parsetree)
  * attributes and the types are compatible */
 void check_targetlists_are_compatible(List *prev_target, List *current_target)
 {
-  List *next_target;
+  List  *tl, *next_target;
+  int	prev_len = 0, next_len = 0;
+
+  foreach(tl, prev_target)
+	if (!((TargetEntry *) lfirst(tl))->resdom->resjunk)
+		prev_len++;
+
+  foreach(next_target, current_target)
+	if (!((TargetEntry *) lfirst(next_target))->resdom->resjunk)
+		next_len++;
   
-  if (length(prev_target) != 
-      length(current_target))
-    elog(ERROR,"Each UNION | EXCEPT | INTERSECT query must have the same number of columns.");		      
+  if (prev_len != next_len)
+    elog(ERROR,"Each UNION | EXCEPT | INTERSECT query must have the same number of columns.");
+
   foreach(next_target, current_target)
     {
       Oid			itype;
-- 
GitLab