From c4146bc1587ef16ecc55c8178f0d5ff99b850178 Mon Sep 17 00:00:00 2001 From: Bruce Momjian 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 | 11 ++++++++++- src/backend/rewrite/rewriteHandler.c | 17 +++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 77ce9374fc..05deca982a 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -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 8850be0492..0d041fa275 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -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; -- 2.39.5