Skip junk nodes when comparing UNION target list lengths.
authorBruce Momjian <bruce@momjian.us>
Mon, 17 May 1999 18:22:19 +0000 (18:22 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 17 May 1999 18:22:19 +0000 (18:22 +0000)
src/backend/parser/parse_clause.c
src/backend/rewrite/rewriteHandler.c

index 77ce9374fca176107a81128502daafda59fe4e60..05deca982aa839b40fed11aa4be2f3724ce3a3f1 100644 (file)
@@ -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)
index 8850be0492c8c4b2e39a93c50808717d04f171c5..0d041fa275f859712ef25e8d0ff7fd848155cf7b 100644 (file)
@@ -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;